2017-10-13 6 views
0

numpyを使用して最小自乗アルゴリズムを実行しようとしていますが、問題があります。誰かが私が与えられたコードで間違っていることを教えてもらえますか? yをy = np.power(X, 1) + np.random.rand(20)*3またはxの他の妥当な関数に設定すると、すべて正常に動作しています。しかし、y値を与えられたその特定のyについて、私が得ているプロットは無意味です。yの集合のために最小の正方形が機能しない

これは何らかの数値的な問題ですか?

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

X = np.arange(1,21) 
y = np.array([-0.00454712, -0.00457764, -0.0045166 , -0.00442505, -0.00427246, 
     -0.00411987, -0.00378418, -0.003479 , -0.00314331, -0.00259399, 
     -0.00213623, -0.00146484, -0.00082397, -0.00030518, 0.00027466, 
     0.00076294, 0.00146484, 0.00192261, 0.00247192, 0.00314331]) 

#y = np.power(X, 1) + np.random.rand(20)*3 

w = np.linalg.lstsq(X.reshape(20, 1), y)[0] 

plt.plot(X, y, 'red') 
plt.plot(X, X*w[0], 'blue') 
plt.show() 
+0

まあ、スタータの場合、あなたはおそらく 'X.dot、'([0]ワット) –

+0

おかげで多くのことをしたいです。私はそれを試みたが、私は同じ結果を得ている。 –

答えて

1

フィッティングとy変数のデータの間に線形関係がありますか?

あなたの例のコード(y = np.power(X, 1) + np.random.rand(20)*3)を使用すると、線形方程式でプロットを比較的うまく追跡できるように、y変数自体にノイズが含まれる線形関係が構築されます。あなたが合うように少ない簡単なものになってしまい、あなたのy変数

y = np.array([-0.00454712, -0.00457764, -0.0045166 , -0.00442505, -0.00427246, 
     -0.00411987, -0.00378418, -0.003479 , -0.00314331, -0.00259399, 
     -0.00213623, -0.00146484, -0.00082397, -0.00030518, 0.00027466, 
     0.00076294, 0.00146484, 0.00192261, 0.00247192, 0.00314331])  

のようなものにあなたが代替しかし

X = np.arange(1,21) 

#y = np.power(X, 1) + np.random.rand(20)*3 

w = np.linalg.lstsq(X.reshape(20, 1), y)[0] 

plt.plot(X, y, 'red') 
plt.plot(X, X*w[0], 'blue') 
plt.show() 

Plot

、。あなたは、この値のセットに合うものにしようとしている場合

Plot2

documentationを見ると、あなたはlstsqは、デフォルトでは行いません。その場合には、一定のコンポーネントで構築する必要があります。 ドキュメントの状態lstsq

リニアマトリクスの式に最小二乗解を返します。あなたが本当に以下のようなコードがあなたに、ほぼ元のデータと一致する何かを与える実行し、線形方程式にデータをフィットする場合

は、式AのX = B

を解決します。しかし、このプロセスの背後にあるデータには、多項式/指数関数のドライバがあると思われ、polyfitを改善します。

X = np.arange(1,21) 
y = np.array([-0.00454712, -0.00457764, -0.0045166 , -0.00442505, -0.00427246, 
     -0.00411987, -0.00378418, -0.003479 , -0.00314331, -0.00259399, 
     -0.00213623, -0.00146484, -0.00082397, -0.00030518, 0.00027466, 
     0.00076294, 0.00146484, 0.00192261, 0.00247192, 0.00314331]) 

#y = np.power(X, 1) + np.random.rand(20)*3 
X2 = np.vstack([X, np.ones(len(X))]).T 
w = np.linalg.lstsq(X2, y)[0] 


plt.plot(X, y, 'red') 
plt.plot(X, X.dot(w[0])+w[1], 'blue') 
plt.show() 

Plot3

+0

ありがとうございます。問題は偏りの言葉がないかもしれないということが私にはありましたが、私が理解しているように、偏りのない言葉があっても傾きはうまくいくので、私はそれを却下しました。その行は一定量だけ相殺されます。私はそれが動作する方法ではないと思う。意味あり。 –

関連する問題