1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- package utils
- import "math"
- // Series is a container for a series of data
- type Series []Coordinate
- // Coordinate holds the data in a series
- type Coordinate struct {
- X, Y float64
- }
- // GetLinearResult 生成线性方程式
- func GetLinearResult(s []Coordinate) (gradient, intercept float64) {
- if len(s) <= 1 {
- return
- }
- // Placeholder for the math to be done
- var sum [5]float64
- // Loop over data keeping index in place
- i := 0
- for ; i < len(s); i++ {
- sum[0] += s[i].X
- sum[1] += s[i].Y
- sum[2] += s[i].X * s[i].X
- sum[3] += s[i].X * s[i].Y
- sum[4] += s[i].Y * s[i].Y
- }
- // Find gradient and intercept
- f := float64(i)
- gradient = (f*sum[3] - sum[0]*sum[1]) / (f*sum[2] - sum[0]*sum[0])
- intercept = (sum[1] / f) - (gradient * sum[0] / f)
- //fmt.Println("gradient:", gradient, ";intercept:", intercept)
- // Create the new regression series
- //for j := 0; j < len(s); j++ {
- // regressions = append(regressions, Coordinate{
- // X: s[j].X,
- // Y: s[j].X*gradient + intercept,
- // })
- //}
- return
- }
- // CalculateCorrelationByIntArr 相关性计算
- // 计算步骤
- // 1.分别计算两个序列的平均值Mx和My
- // 2.分别计算两个序列的标准偏差SDx和SDy => √{1/(n-1)*SUM[(Xi-Mx)²]}
- // 3.计算相关系数 => SUM[(Xi-Mx)*(Yi-My)]/[(N-1)(SDx*SDy)]
- func CalculateCorrelationByIntArr(xArr, yArr []float64) (ratio float64) {
- // 序列元素数要一致
- xLen := float64(len(xArr))
- yLen := float64(len(yArr))
- if xLen == 0 || xLen != yLen {
- return
- }
- // 计算Mx和My
- var Xa, Ya float64
- for i := range xArr {
- Xa += xArr[i]
- }
- Mx := Xa / xLen
- for i := range yArr {
- Ya += yArr[i]
- }
- My := Ya / yLen
- // 计算标准偏差SDx和SDy
- var Xb, Yb, SDx, SDy float64
- for i := range xArr {
- Xb += (xArr[i] - Mx) * (xArr[i] - Mx)
- }
- SDx = math.Sqrt(1 / (xLen - 1) * Xb)
- for i := range yArr {
- Yb += (yArr[i] - My) * (yArr[i] - My)
- }
- SDy = math.Sqrt(1 / (yLen - 1) * Yb)
- // 计算相关系数
- var Nume, Deno float64
- for i := 0; i < int(xLen); i++ {
- Nume += (xArr[i] - Mx) * (yArr[i] - My)
- }
- Deno = (xLen - 1) * (SDx * SDy)
- ratio = Nume / Deno
- if math.IsNaN(ratio) {
- ratio = 0
- }
- return
- }
|