最小2乗多項式フィット「numpy.polyfit」と線形行列方程式の最小二乗解を得る「numpy.linalg.lstsq」

how to use numpy polyfit to force scatter points linear fit pass through zero? – StackOverflow

この手の話はよくみる.

「numpy.polyfit」は最小二乗法に基いて,
最もフィッティングが良いものを返している訳だから,
そこで切片を変更したいと思った場合,フィッティングは悪くなる.

ならば,考え方は2つあって,

[1] フィッティングを無視してb=0として係数だけ使う

[2] Ax = yの様な線形行列方程式を解く

かを考える.
 
 
 
[1] フィッティングを無視してb=0として係数だけ使う

%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

sns.set_style('darkgrid')

x = np.asarray([1, 2, 4, 5, 7, 8, 9])
y = np.asarray([2, 1, 3, 6, 4, 7, 9])

z = np.polyfit(x, y, 1)
p = np.poly1d(z)

xp = np.linspace(-2, 12, 100)
plt.plot(x, y, '.', xp, p(xp), '-', xp, p[1]*xp, '--')
print(f'{np.corrcoef(y, p(x))[0, 1]**2}')
print(f'{np.corrcoef(y, p[1]*x)[0, 1]**2}')

0.7904169659961685
0.7904169659961684

FireShot Capture 274 - JupyterLab Alpha Preview - http___localhost_8888_lab

決定係数は殆ど変わらない.
 
 

参考:
numpy.polyfit – SciPy.org

[2] Ax = yの様な線形行列方程式を解く

x = np.asarray([1, 2, 4, 5, 7, 8, 9])
y = np.asarray([2, 1, 3, 6, 4, 7, 9])

A = np.vstack([x, np.zeros(len(x))]).T
m, c = np.linalg.lstsq(A, y)[0]

xp = np.linspace(-2, 12, 100)
plt.plot(x, y, '.', xp, m*xp, '-')
print(np.corrcoef(y, m*x)[0, 1]**2)

0.790416965996

FireShot Capture 277 - JupyterLab Alpha Preview - http___localhost_8888_lab
 
 

参考:
numpy.linalg.lstsq – SciPy.org

[3] scikitlearnのlinear_regressionを使う

・切片あり

from sklearn.linear_model import LinearRegression


lr = LinearRegression()
lr.fit(x.reshape(-1, 1), y)

xp = np.linspace(-2, 12, 100)
plt.plot(x, y, '.', xp, lr.predict(xp.reshape(-1, 1)), '-')
print(lr.get_params())
print(lr.coef_)
print(lr.intercept_)
print(lr.score(x.reshape(-1, 1), y))

{‘copy_X’: True, ‘fit_intercept’: True, ‘n_jobs’: 1, ‘normalize’: False}
[ 0.84635417]
0.21875
0.790416965996

FireShot Capture 279 - JupyterLab Alpha Preview - http___localhost_8888_lab

・切片なし

from sklearn.linear_model import LinearRegression


lr = LinearRegression(fit_intercept=False)
lr.fit(x.reshape(-1, 1), y)

xp = np.linspace(-2, 12, 100)
plt.plot(x, y, '.', xp, lr.predict(xp.reshape(-1, 1)), '-')
print(lr.get_params())
print(lr.coef_)
print(lr.intercept_)
print(lr.score(x.reshape(-1, 1), y))

{‘copy_X’: True, ‘fit_intercept’: False, ‘n_jobs’: 1, ‘normalize’: False}
[ 0.87916667]
0.0
0.788876915709

FireShot Capture 278 - JupyterLab Alpha Preview - http___localhost_8888_lab

scikitlearnの結果が,言いたい事を分かり易い形で表してくれた.
 
 
 

広告
カテゴリー: 未分類 パーマリンク

最小2乗多項式フィット「numpy.polyfit」と線形行列方程式の最小二乗解を得る「numpy.linalg.lstsq」 への3件のフィードバック

  1. ピンバック: 線形回帰で切片を気にする意味は無い | 粉末@それは風のように (日記)

  2. ピンバック: Sympyで線形システムを解く | 粉末@それは風のように (日記)

  3. ピンバック: 補間と回帰(内挿と外挿) | 粉末@それは風のように (日記)

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中