線形回帰で切片を気にする意味は無い

意義はともかく,意味は無い.

using scipy’s stats.linregress with a fixed y intercept – StackOverflow

from scipy import stats

y = np.array([0, 11, 19, 28, 41, 49, 62, 75, 81])
xi = np.arange(0, 9)

stats.linregress(xi,y)

LinregressResult(slope=10.383333333333333, intercept=-0.86666666666666714, rvalue=0.998059147240283, pvalue=1.0585011548406713e-09, stderr=0.24486795923582788)

rvalue is 0.998059147240283, coefficient of determination is 0.9961220613900009.

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

print(f'slope={p[1]}, intercept={p[0]}')
print(f'coefficient of determination={np.corrcoef(y, p(xi))[0, 1]**2}')
print(f'slope={p[1]}, intercept=0')
print(f'coefficient of determination={np.corrcoef(y, p[1]*xi)[0, 1]**2}')

slope=10.38333333333334, intercept=-0.8666666666666933
coefficient of determination=0.9961220613900007
slope=10.38333333333334, intercept=0
coefficient of determination=0.9961220613900007

既知の情報に基いて解きたい場合,それは単に線形代数の問題なので,
任意の行列式を立てて(最小二乗法で)解けば良い(関連[1]).

A = np.vstack([xi, np.zeros(len(xi))]).T
p1, p0 = np.linalg.lstsq(A, y)[0]

print(f'slope={p1}, intercept={p0}')
print(f'coefficient of determination={np.corrcoef(y, p1*xi)[0, 1]**2}')

slope=10.230392156862743, intercept=0.0
coefficient of determination=0.9961220613900003

線形方程式の場合はオーバーキルだけど(上の方法で良いと思うけど),
多項式や非線形方程式の場合は,「scipy.optimize.curve_fit」を使って解ける.
(以下は線形方程式のフィッティング例)

def li_func(x, a):
    return a * x

y = np.array([0, 11, 19, 28, 41, 49, 62, 75, 81])
xi = np.arange(0, 9)

plt.plot(xi, y, '.', label='data')
popt, pcov = curve_fit(li_func, xi, y)
plt.plot(xi, li_func(xi, *popt), 'r-', label='fit')
print(popt)
print(f'coefficient of determination={np.corrcoef(y, li_func(xi, *popt))[0, 1]**2}')

[ 10.23039216]
coefficient of determination=0.9961220613900009

FireShot Capture 332 - JupyterLab Alpha Preview - http___localhost_8888_lab

def li_func(x, a, b):
    return a * x + b

y = np.array([0, 11, 19, 28, 41, 49, 62, 75, 81])
xi = np.arange(0, 9)

plt.plot(xi, y, '.', label='data')
popt, pcov = curve_fit(li_func, xi, y)
plt.plot(xi, li_func(xi, *popt), 'r-', label='fit')
print(popt)
print(f'coefficient of determination={np.corrcoef(y, li_func(xi, *popt))[0, 1]**2}')

[ 10.38333336 -0.86666679]
coefficient of determination=0.9961220613900005

FireShot Capture 333 - JupyterLab Alpha Preview - http___localhost_8888_lab

 
 
 
関連:
[1] 一部の係数を予め与えて線形回帰モデルを構築

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

[3] ロジスティック回帰

回帰モデル

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

線形回帰で切片を気にする意味は無い への1件のフィードバック

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

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中