疑問
pythonで数値処理を始めて、まだ慣れておらず、ひとつ疑問に思ったことがあるので調べてみました。
pythonの数値計算ライブラリを使えば線形回帰直線を引くことが可能なのですが、
線形回帰直線の係数の導出に複数のやり方があるように思えました。
linalg.lstsq
とpolyfit/poly1d
です。
以前紹介した記事中で
from matplotlib import pyplot as plt
import numpy as np
def main():
data = np.genfromtxt("airmiles.csv",delimiter=",", skiprows=1)
x = data[:,1]
y = data[:,2]
A = np.array([x,np.ones(len(x))])
A = A.T
m,c = np.linalg.lstsq(A,y)[0]
plt.scatter(x, y)
plt.xlabel('year')
plt.ylabel('airmiles')
plt.plot(x,(m*x+c))
plt.show()
if __name__ == '__main__':
main()
データはこちらhttps://vincentarelbundock.github.io/Rdatasets/csv/datasets/airmiles.csv
のCSVファイルを利用。
このコード上では変数mとcにそれぞれ、係数と切片が計算されて代入されます。
一方pythonのnumpyを使っていくと、
from matplotlib import pyplot as plt
import numpy as np
def main():
data = np.genfromtxt("airmiles.csv",delimiter=",", skiprows=1)
x = data[:,1]
y = data[:,2]
z = np.polyfit(x, y, 1)
p = np.poly1d(z)
plt.scatter(x, y)
plt.plot(x, p(y), '.')
plt.xlabel('year')
plt.ylabel('airmiles')
plt.show()
if __name__ == '__main__':
main()
こちらの書き方でも回帰直線の数値を求めることが可能であることに気づきました。
両者を出力してみると、
('m: %d', 1350.2817391303561)
('c: %d', -2620496.1353621646)
('p: %d', poly1d([ 1.35028174e+03, -2.62049614e+06]))
となり、書き方が違うだけのようでした。
さて後者の方がどういう関数を利用してるか見てみますと、
polyfit
詳細はこちらhttp://docs.scipy.org/doc/numpy/reference/generated/numpy.polyfit.html
これは多項式に関して最小二乗法により近似式を求める関数のようです。
polyfit(x, y, n)
という形で使用し、x,yには説明変数を、nにはそれらに近似させたい式の最大次数を入力します。
次に
poly1d
こちらですが、実例を見ると早いです。
p = np.poly1d([1, 2, 3])
print(np.poly1d(p))
2
1 x + 2 x + 3
参照)http://docs.scipy.org/doc/numpy/reference/generated/numpy.poly1d.html
上記のように、[1, 2, 3]
を多項式の係数をして変換してくれるわけです。
以上より、
poly1d(polyfit(x,y,1))
のような形式で、利用します。
詳しくはこちらに違いが載っておりましたので、共有させてもらいます。
http://qiita.com/HirofumiYashima/items/7e18970d68a5c83084e7