calculate.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package utils
  2. import "math"
  3. // Series is a container for a series of data
  4. type Series []Coordinate
  5. // Coordinate holds the data in a series
  6. type Coordinate struct {
  7. X, Y float64
  8. }
  9. // GetLinearResult 生成线性方程式
  10. func GetLinearResult(s []Coordinate) (gradient, intercept float64) {
  11. if len(s) <= 1 {
  12. return
  13. }
  14. // Placeholder for the math to be done
  15. var sum [5]float64
  16. // Loop over data keeping index in place
  17. i := 0
  18. for ; i < len(s); i++ {
  19. sum[0] += s[i].X
  20. sum[1] += s[i].Y
  21. sum[2] += s[i].X * s[i].X
  22. sum[3] += s[i].X * s[i].Y
  23. sum[4] += s[i].Y * s[i].Y
  24. }
  25. // Find gradient and intercept
  26. f := float64(i)
  27. gradient = (f*sum[3] - sum[0]*sum[1]) / (f*sum[2] - sum[0]*sum[0])
  28. intercept = (sum[1] / f) - (gradient * sum[0] / f)
  29. //fmt.Println("gradient:", gradient, ";intercept:", intercept)
  30. // Create the new regression series
  31. //for j := 0; j < len(s); j++ {
  32. // regressions = append(regressions, Coordinate{
  33. // X: s[j].X,
  34. // Y: s[j].X*gradient + intercept,
  35. // })
  36. //}
  37. return
  38. }
  39. // CalculateCorrelationByIntArr 相关性计算
  40. // 计算步骤
  41. // 1.分别计算两个序列的平均值Mx和My
  42. // 2.分别计算两个序列的标准偏差SDx和SDy => √{1/(n-1)*SUM[(Xi-Mx)²]}
  43. // 3.计算相关系数 => SUM[(Xi-Mx)*(Yi-My)]/[(N-1)(SDx*SDy)]
  44. func CalculateCorrelationByIntArr(xArr, yArr []float64) (ratio float64) {
  45. // 序列元素数要一致
  46. xLen := float64(len(xArr))
  47. yLen := float64(len(yArr))
  48. if xLen == 0 || xLen != yLen {
  49. return
  50. }
  51. // 计算Mx和My
  52. var Xa, Ya float64
  53. for i := range xArr {
  54. Xa += xArr[i]
  55. }
  56. Mx := Xa / xLen
  57. for i := range yArr {
  58. Ya += yArr[i]
  59. }
  60. My := Ya / yLen
  61. // 计算标准偏差SDx和SDy
  62. var Xb, Yb, SDx, SDy float64
  63. for i := range xArr {
  64. Xb += (xArr[i] - Mx) * (xArr[i] - Mx)
  65. }
  66. SDx = math.Sqrt(1 / (xLen - 1) * Xb)
  67. for i := range yArr {
  68. Yb += (yArr[i] - My) * (yArr[i] - My)
  69. }
  70. SDy = math.Sqrt(1 / (yLen - 1) * Yb)
  71. // 计算相关系数
  72. var Nume, Deno float64
  73. for i := 0; i < int(xLen); i++ {
  74. Nume += (xArr[i] - Mx) * (yArr[i] - My)
  75. }
  76. Deno = (xLen - 1) * (SDx * SDy)
  77. ratio = Nume / Deno
  78. if math.IsNaN(ratio) {
  79. ratio = 0
  80. }
  81. return
  82. }