golang概率分布计算与统计方法插件库godist的使用

golang概率分布计算与统计方法插件库godist的使用

godist 是一个提供连续和离散概率分布实现的Go库,以及一些处理这些分布的便捷方法。

功能特性

该库的核心思想是提供一个可扩展的分布接口,每个分布都实现了以下接口:

type Distribution interface{
    // 分布均值
    Mean() (float64, error)

    // 分布中位数
    Median() (float64, error)

    // 分布众数
    Mode() (float64, error)

    // 分布方差
    Variance() (float64, error)

    // 根据概率分布生成随机值
    Float64() (float64, error)
}

实际实现中,分布可能还提供其他有用的方法。

设计理念

godist 的目标不是提供最快、最高效的实现,而是提供符合Go语言习惯、易于理解和扩展的实现。当然,在已知有用且易于理解的数值技巧和工具可以提升性能的情况下,也会采用并加以文档说明。

当前支持的分布

  • Beta分布
  • 经验分布

完整示例

下面是一个使用Beta分布的完整示例:

package main

import (
	"fmt"
	"github.com/e-dard/godist"
)

func main() {
	// 创建一个Beta分布实例,参数α=2,β=5
	betaDist := godist.NewBeta(2.0, 5.0)

	// 计算并打印分布均值
	mean, err := betaDist.Mean()
	if err != nil {
		fmt.Println("Error calculating mean:", err)
		return
	}
	fmt.Printf("Beta分布均值: %.4f\n", mean)

	// 计算并打印分布方差
	variance, err := betaDist.Variance()
	if err != nil {
		fmt.Println("Error calculating variance:", err)
		return
	}
	fmt.Printf("Beta分布方差: %.4f\n", variance)

	// 生成10个随机数
	fmt.Println("生成10个随机数:")
	for i := 0; i < 10; i++ {
		randNum, err := betaDist.Float64()
		if err != nil {
			fmt.Println("Error generating random number:", err)
			continue
		}
		fmt.Printf("%.4f ", randNum)
	}
	fmt.Println()
}

下面是一个使用经验分布的示例:

package main

import (
	"fmt"
	"github.com/e-dard/godist"
)

func main() {
	// 创建一个经验分布实例
	data := []float64{1.2, 2.3, 3.4, 4.5, 5.6}
	empiricalDist := godist.NewEmpirical(data)

	// 计算并打印分布均值
	mean, err := empiricalDist.Mean()
	if err != nil {
		fmt.Println("Error calculating mean:", err)
		return
	}
	fmt.Printf("经验分布均值: %.4f\n", mean)

	// 计算并打印分布方差
	variance, err := empiricalDist.Variance()
	if err != nil {
		fmt.Println("Error calculating variance:", err)
		return
	}
	fmt.Printf("经验分布方差: %.4f\n", variance)

	// 生成10个随机数
	fmt.Println("生成10个随机数:")
	for i := 0; i < 10; i++ {
		randNum, err := empiricalDist.Float64()
		if err != nil {
			fmt.Println("Error generating random number:", err)
			continue
		}
		fmt.Printf("%.4f ", randNum)
	}
	fmt.Println()
}

欢迎贡献代码!


更多关于golang概率分布计算与统计方法插件库godist的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang概率分布计算与统计方法插件库godist的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang概率分布计算与统计方法:godist库使用指南

godist是一个用于概率分布计算和统计方法的Golang库,它提供了多种常见的概率分布函数和统计工具。下面我将介绍如何使用这个库进行常见的统计计算。

安装godist

首先需要安装godist库:

go get github.com/gonum/gonum/stat/distuv

常用概率分布

1. 正态分布(Normal Distribution)

package main

import (
	"fmt"
	"gonum.org/v1/gonum/stat/distuv"
)

func main() {
	// 创建均值为0,标准差为1的正态分布
	normal := distuv.Normal{
		Mu:    0,    // 均值
		Sigma: 1.0,  // 标准差
	}

	// 计算概率密度
	x := 1.5
	pdf := normal.Prob(x)
	fmt.Printf("正态分布在x=%.2f处的概率密度: %.4f\n", x, pdf)

	// 计算累积概率
	cdf := normal.CDF(x)
	fmt.Printf("正态分布在x=%.2f处的累积概率: %.4f\n", x, cdf)

	// 计算分位数(逆CDF)
	p := 0.95
	quantile := normal.Quantile(p)
	fmt.Printf("正态分布%.2f分位数: %.4f\n", p, quantile)
}

2. 泊松分布(Poisson Distribution)

func poissonExample() {
	// 创建λ=3的泊松分布
	poisson := distuv.Poisson{
		Lambda: 3.0,
	}

	// 计算k=5时的概率
	k := 5.0
	prob := poisson.Prob(k)
	fmt.Printf("泊松分布在k=%.0f时的概率: %.4f\n", k, prob)

	// 计算累积概率
	cdf := poisson.CDF(k)
	fmt.Printf("泊松分布在k<=%.0f时的累积概率: %.4f\n", k, cdf)
}

3. 二项分布(Binomial Distribution)

func binomialExample() {
	// 创建n=10, p=0.5的二项分布
	binomial := distuv.Binomial{
		N: 10,
		P: 0.5,
	}

	// 计算k=7时的概率
	k := 7.0
	prob := binomial.Prob(k)
	fmt.Printf("二项分布在k=%.0f时的概率: %.4f\n", k, prob)
}

统计方法

1. 描述性统计

import "gonum.org/v1/gonum/stat"

func descriptiveStats() {
	data := []float64{1.2, 2.3, 3.4, 4.5, 5.6}

	// 计算均值
	mean := stat.Mean(data, nil)
	fmt.Printf("均值: %.4f\n", mean)

	// 计算方差
	variance := stat.Variance(data, nil)
	fmt.Printf("方差: %.4f\n", variance)

	// 计算标准差
	stdDev := stat.StdDev(data, nil)
	fmt.Printf("标准差: %.4f\n", stdDev)

	// 计算中位数
	median := stat.Quantile(0.5, stat.Empirical, data, nil)
	fmt.Printf("中位数: %.4f\n", median)
}

2. 假设检验

func hypothesisTest() {
	// 两组样本数据
	group1 := []float64{5, 7, 9, 11, 13}
	group2 := []float64{6, 8, 10, 12, 14}

	// 计算t检验
	t, p := stat.TwoSampleTTest(group1, group2, nil, nil)
	fmt.Printf("t统计量: %.4f, p值: %.4f\n", t, p)
}

随机数生成

godist还支持从各种分布生成随机数:

import "golang.org/x/exp/rand"

func randomNumbers() {
	src := rand.NewSource(42) // 随机种子

	// 创建正态分布随机数生成器
	normal := distuv.Normal{
		Mu:     0,
		Sigma:  1,
		Src:    src,
	}

	// 生成10个随机数
	fmt.Println("正态分布随机数:")
	for i := 0; i < 10; i++ {
		fmt.Printf("%.4f ", normal.Rand())
	}
	fmt.Println()
}

多变量分布

godist还支持多变量分布:

import "gonum.org/v1/gonum/stat/distmv"

func multivariateNormal() {
	// 均值向量
	mu := []float64{0, 0}
	
	// 协方差矩阵
	sigma := mat.NewSymDense(2, []float64{
		1, 0.5,
		0.5, 1,
	})
	
	// 创建多变量正态分布
	normal, ok := distmv.NewNormal(mu, sigma, nil)
	if !ok {
		fmt.Println("协方差矩阵不正定")
		return
	}
	
	// 生成随机向量
	x := make([]float64, 2)
	normal.Rand(x)
	fmt.Printf("多变量正态分布随机向量: [%.4f, %.4f]\n", x[0], x[1])
}

总结

godist库提供了丰富的概率分布和统计方法,适用于各种统计计算需求。通过上述示例,你可以:

  1. 计算各种概率分布的概率密度、累积概率和分位数
  2. 进行描述性统计分析
  3. 执行假设检验
  4. 从不同分布生成随机数
  5. 处理多变量分布

这个库是Golang中进行科学计算和统计分析的有力工具,特别适合需要高性能统计计算的应用场景。

回到顶部