2015-05-29 93 views
2

我在寫一個計算錯誤平方和的函數。 xy是相同長度的向量; y是觀測數據,x是我的模型計算的數據。取決於使用的numpy過程調用的微小的平方和的數值差異

的代碼是這樣的:

>> res = y.ravel() - x.ravel() 
>> np.dot(res.T, res) 
>> 1026.7059479504269 

>> np.sum(res**2) 
>> 1026.7059479504273 

現在看最後兩位數字。誰能告訴我這是什麼原因?這兩個調用應該導致相同的操作。有誰知道這種差異來自哪裏?

+0

我只是想這是有關舍入的值。所以沒什麼可擔心的。 –

+0

也許:http://stackoverflow.com/q/588004/3001761 – jonrsharpe

+1

如果我猜測,我會說這是'.dot'函數的工作方式,雖然它有相同的結果,但會計算點積在飛行中,而不是首先將所有數字平方,然後將它們加在一起。雖然對於你所處理的數字來說是相當無關緊要的,但我認爲'.dot'比'np.sum(res ** 2)'更準確' – Matthew

回答

1

浮點加法不關聯 - 操作的執行順序會影響結果。推測np.dot(res, res)np.sum(res**2)以不同的順序執行操作。

下面是一個例子,其中np.sum(x**2) != np.sum(x[:50]**2) + np.sum(x[50:]**2)(既不等於np.dot(x, x)):

>>> np.random.seed(1234) 
>>> x = np.random.randn(100) 
>>> np.sum(x**2) 
99.262119361371433 
>>> np.sum(x[:50]**2) + np.sum(x[50:]**2) 
99.262119361371461 
>>> np.dot(x, x) 
99.262119361371447