2013-10-22 232 views
0

爲什麼scipy.signal.detrend對同一數據的結果略有不同?此外,它似乎取決於關鍵字「線性」是否包含以得到不同的結果(默認情況下,消除趨勢是線性反正)scipy.signal.detrend中的不準確性/隨機性

編輯:我知道這個誤差是非常小的,有些不準確預計,由於浮動點算術。奇怪的是,結果是不同爲相同的數據+功能。

from scipy.signal import detrend as scipy_detrend 
from pylab import * 

x = arange(10) 
y = arange(10, dtype='int64') 

subplot(211) 
plot(x, scipy_detrend(y, type="linear"), label='scipy detrend linear') 
plot(x, scipy_detrend(y), label='scipy detrend') 
plot(x, detrend(y, "linear"), label='pylab detrend') 

subplot(212) 
plot(x, scipy_detrend(y, type="linear"), label='scipy detrend linear') 
plot(x, scipy_detrend(y), label='scipy detrend') 
plot(x, detrend(y, "linear"), label='pylab detrend') 

show() 

注:紅線爲pylab.detrend,藍線爲scipy.signal.detrend with linear keyword,綠色只是scipy.signal.detrendenter image description here

回答

4

這是浮點舍入錯誤。在一般情況下,浮點錯誤並不一定是可重複的整個運行相同的CPU,同樣的數據,以及相同的代碼上,因爲它可以通過程序之外的事件受到影響(除非採取特殊措施):

Consistency of Floating-Point Results using the Intel® Compiler or Why doesn’t my application always give the same answer? - Dr. Martyn J. Corden, David Kreitzer

這似乎是一個常見問題

+1

感謝您的關注!我無法訪問鏈接到的文檔(找不到頁面)。 – Dhara

+0

修復了鏈接。 –

4

您的數據是arange(10),您的去結果結果是1e-15的順序,這意味着差異是由於浮點精度造成的。 (您的去結果比您的輸入小15個數量級)

+0

如果它的浮點精確度,你總是會看到相同的不準確性,在不同的運行沒有不同的數字,對不對? – Dhara

+0

@Dhara不,你會在不同的運行中看到不同的數字,具體取決於float(1)實際上是1.00000000004還是1.00000000007或... – usethedeathstar

+0

您是否建議在程序開始時,float(x)可以有不同的表示?你能支持這一說法嗎?我可以理解,如果不同的算術運算導致float(x)的值略有不同,但如果我只是做float(x),它應該始終是完全相同的二進制表示。 – Dhara