go语言机器学习-矩阵-概率伦-统计学

2.1矩阵与向量

使用gonum.org/v1/gonum包下的库函数可以对向量和矩阵进行操作 
当进行计算的向量维度大且使用的函数较多时,使用gonum.org/v1/gonum/mat
mat包下的apply函数操作矩阵时,可以让用户自定以函数进行操作

//Apply()函数可以让用户自定义任何函数 来操作矩阵
h := mat.NewDense(0, 0, nil)
// 定义平方根函数
sqrt := func(_, _ int, v float64) float64 { return math.Sqrt(v) }
h.Apply(sqrt, verctorA)
fh := mat.Formatted(h, mat.Prefix("         "))
fmt.Printf("矩阵A的开平方 %0.4v\n\n", fh)

mat包下可以求矩阵的转置、行列式、特征值、向量求解等等 详细看API手册 github.com/gonum

2.2分布与统计

1.集中趋势测量法:测量大部分数据所在的位置 1.均值 2.中位数、 3.众数

isirsFlie, err := os.Open("D:/gocode/iris.csv")
	if err != nil {
		log.Panic(err)
	}
	defer isirsFlie.Close()
irisDF := dataframe.ReadCSV(isirsFlie)

// 获取数据的长度
specialLength := irisDF.Col("sepal_length").Float()
// 求平均数
mealVal := stat.Mean(specialLength, nil)
// 众数
modeVal, modeCOunt := stat.Mode(specialLength, nil)
// 中位数
// mediaVla, err :=
fmt.Printf("平均数是 %0.2f\n", mealVal)
fmt.Printf("众数是 %0.2f\n", modeVal)
fmt.Printf("一共是 %d\n", int(modeCOunt))

2.离中趋势测量法:测量在分布范围内数值是如何分布的(从小到大)

1.极大值 2.极小值 3.极差 4.方差 5.标准差 6.分位数/四分位数

		irsiFile, err := os.Open("D:/gocode/iris.csv")
if err != nil {
	log.Panic(err)

}
defer irsiFile.Close()

irisDF := dataframe.ReadCSV(irsiFile)
sepaLength := irisDF.Col("sepal_length").Float()
// 最小值 、最大值
minVal := floats.Min(sepaLength)
maxVal := floats.Max(sepaLength)

// 极差
rangeVal := maxVal - minVal
// 方差
varianceVal := stat.Variance(sepaLength, nil)
// 标准差
stdVal := stat.StdDev(sepaLength, nil)
// 分位数
inds := make([]int, len(sepaLength))
floats.Argsort(sepaLength, inds)

quan25 := stat.Quantile(0.25, stat.Empirical, sepaLength, nil)
quan50 := stat.Quantile(0.50, stat.Empirical, sepaLength, nil)
quan75 := stat.Quantile(0.75, stat.Empirical, sepaLength, nil)

fmt.Printf("Min : %0.2f\n", minVal)
fmt.Printf("Max : %0.2f\n", maxVal)
fmt.Printf("RangeVla : %0.2f\n", rangeVal)
fmt.Printf("variance: %0.2f\n", varianceVal)
fmt.Printf("Std : %0.2f\n", stdVal)
fmt.Printf("0.25 : %0.2f\n", quan25)
fmt.Printf("0.50 : %0.2f\n", quan50)
fmt.Printf("0.75 : %0.2f\n", quan75)


使用的第三方包是gonum.org/v1/gonum/stat或者是github.com/montanaflynn/stats

2.3数据的可视化

1.直方图(gonum.org/v1/plot) plot包中的函数需要用到image包中函数 直接手动下载即可

isirsFlie, err := os.Open("D:/gocode/iris.csv")
	if err != nil {
		log.Panic(err)
	}
	defer isirsFlie.Close()
irisDF := dataframe.ReadCSV(isirsFlie)

// 创建直方图
for _, colName := range irisDF.Names() {
	if colName != "species" {
		// 没有就填充
		v := make(plotter.Values, irisDF.Nrow())
		for i, floatVal := range irisDF.Col(colName).Float() {
			v[i] = floatVal
		}
		p, err := plot.New()
		if err != nil {
			log.Panic(err)
		}
		p.Title.Text = fmt.Sprintf("Histog of a %s ", colName)
		h, err := plotter.NewHist(v, 16)
		if err != nil {
			log.Panic(err)
		}
		h.Normalize(1)
		p.Add(h)
		if err := p.Save(4*vg.Inch, 4*vg.Inch, colName+"_hist.png"); err != nil {
			log.Panic(err)
		}
	}

}

2.箱型图

isirsFlie, err := os.Open("D:/gocode/iris.csv")
if err != nil {
	log.Panic(err)
}
defer isirsFlie.Close()

irisDF := dataframe.ReadCSV(isirsFlie)

p, err := plot.New()
if err != nil {
	log.Fatal(err)
}

p.Title.Text = "箱图"
p.Y.Label.Text = "Values"

w := vg.Points(20)
for idx, colName := range irisDF.Names() {

	if colName != "species" {
		v := make(plotter.Values, irisDF.Nrow())
		for i, floatVal := range irisDF.Col(colName).Float() {
			v[i] = floatVal
		}
		b, err := plotter.NewBoxPlot(w, float64(idx), v)
		if err != nil {
			log.Fatal(err)
		}
		p.Add(b)
	}
}
p.NominalX("sepal_length", "sepal_width", "petal_length", "petal_width")
if err := p.Save(6*vg.Inch, 8*vg.Inch, "boxsplot.png"); err != nil {
	log.Fatal(err)
}

2.4概率伦 自学 卡方检验的代码

oberverd := []float64{260.0, 135.0, 105.0}
	totalObserved := 500.0
	expected := []float64{totalObserved * 0.60, totalObserved * 0.25, totalObserved * 0.15}
chiQuare := stat.ChiSquare(oberverd, expected)
fmt.Printf("\nchi-chiQuare : %0.2f \n", chiQuare)

chiDist := distuv.ChiSquared{
	K:   2.0,
	Src: nil,
}
pValue := chiDist.Prob(chiQuare)
fmt.Printf("p-value :%0.4f\n", pValue)

你可能感兴趣的:(go语言机器学习)