最小二乗法で配列内の値の傾きを得る関数
最小二乗法で配列内の値の傾きを得る関数です。このサイトを参考に実装しています。
#===最小二乗法で、配列内の値の傾きを得る。 #datas:: 値の配列 #戻り値:: 傾き。0より大きければ上向き。小さければ下向き。 def vector( datas ) # 最小二乗法を使う。 total = {:x=>0.0,:y=>0.0,:xx=>0.0,:xy=>0.0,:yy=>0.0} datas.each_index {|i| total[:x] += i total[:y] += datas[i] total[:xx] += i*i total[:xy] += i*datas[i] total[:yy] += datas[i] * datas[i] } n = datas.length d = total[:xy] c = total[:y] e = total[:x] b = total[:xx] return (n*d - c*e) / (n*b - e*e) end
サンプル。
p vector( [1,2,3,4,5 ] ) p vector( [2,3,2,4,5 ] ) p vector( [2,2,2,2,2 ] ) p vector( [5,4,2,3,2 ] ) p vector( [5,4,3,2,1 ] )
実行結果です。明らかにサンプル数が足りないけど、一応期待通り動作している感触。
1.0 0.7 0.0 -0.7 -1.0