7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

numpyのlinalg.lstsqとpolyfit/poly1dについて

Posted at

疑問

pythonで数値処理を始めて、まだ慣れておらず、ひとつ疑問に思ったことがあるので調べてみました。

pythonの数値計算ライブラリを使えば線形回帰直線を引くことが可能なのですが、
線形回帰直線の係数の導出に複数のやり方があるように思えました。

linalg.lstsqpolyfit/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

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?