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)