2017-10-13 32 views
0

我試圖運行使用numpy的最小二乘算法,並且遇到了麻煩。有人可以告訴我在給定的代碼中我做錯了什麼嗎?當我將y設置爲y = np.power(X, 1) + np.random.rand(20)*3或x的其他合理函數時,一切工作正常。但是對於那些由y值定義的特定y,我得到的情節是毫無意義的。最小二乘法不適用於一套y's

這是一種數值問題嗎?

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(W [0])', –

+0

非常感謝。我嘗試過,但我得到了同樣的結果。 –

回答

1

你確定你正在擬合什麼和y變量數據之間有線性關係嗎?

使用示例中的代碼(y = np.power(X, 1) + np.random.rand(20)*3),您可以在y變量本身內建立一個線性關係(帶有一些噪音),從而使您的繪圖可以用線性方程式相對較好地跟蹤。

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

然而,當你的候補像你的變量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])  

你最終的東西不太容易適應。

Plot2

望着documentation,如果你正在嘗試的東西,符合這一組值,你將需要建立在一個恆定分量在這種情況下lstsq默認情況下不會做的。 文檔狀態爲lstsq

將最小二乘解返回到線性矩陣方程。

解決了這一方程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

謝謝。我的確發現,問題可能是缺乏偏見,但我駁斥了它,因爲據我所知,即使沒有偏見,斜率也應該適用;只是這條線將被一定數量的偏離。我想這不是它的工作方式。這是有道理的。 –