1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- package utils
- import "math"
- type Series []Coordinate
- type Coordinate struct {
- X, Y float64
- }
- func GetLinearResult(s []Coordinate) (gradient, intercept float64) {
- if len(s) <= 1 {
- return
- }
-
- var sum [5]float64
-
- 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
- }
-
- 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)
-
-
-
-
-
-
-
-
- return
- }
- func CalculateCorrelationByIntArr(xArr, yArr []float64) (ratio float64) {
-
- xLen := float64(len(xArr))
- yLen := float64(len(yArr))
- if xLen == 0 || xLen != yLen {
- return
- }
-
- var Xa, Ya float64
- for i := range xArr {
- Xa += xArr[i]
- }
- Mx := Xa / xLen
- for i := range yArr {
- Ya += yArr[i]
- }
- My := Ya / yLen
-
- 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
- }
|