2015-11-23 118 views
0

我打算用長度爲54的兩個numpy陣列y1y2做一個簡單的線性擬合。功能定義如下:scipy curve_fit容易線性擬合失敗?

def f(x,b): 
    return b*x 

的數據在這裏繪製:

popt, pcov = scop.curve_fit(f,y2,y1) # yes y1 and y2 are in right order 

結果::popt = 1., pcov = inf

enter image description here

然後我試圖通過擬合試用p0 = -833,即i或多或少的結果應該是,但它給了我popt = -833, pcov = inf

我試圖用一個樣本函數的一些樣本數據:

x = np.array(range(10)) 
y = x**2 + 3 
def fu(x,b): 
    return x**2 + b 
po, pc = scop.curve_fit(fu,x,y) 
print po, pc 

結果僅僅是罰款:3和2e-33

有誰有一個想法,到什麼地方出了錯與第一審判?我還沒有找到任何有用或連接到我的問題...

+2

您是否檢查過您的數據是否包含任何NaN或無限值? –

+0

是的,有NaNs。 curve_fit沒有NaN處理程序?有沒有解決辦法? – Robert

+0

從[文檔](https://docs.scipy.org/doc/scipy-0.16.0/reference/generated/scipy.optimize.curve_fit.html#scipy-optimize-curve-fit):「'check_finite' :bool,可選 如果爲True,請檢查輸入數組是否包含nans infs,並且如果它們出現則引發ValueError。如果輸入數組包含nans,則將此參數設置爲False可能會靜靜地產生無意義的結果。 「 – wflynny

回答

3

NaN值將產生無意義的結果 - 您需要在做任何擬合之前將它們從數據中排除。您可以使用布爾索引要做到這一點:

valid = ~(np.isnan(y1) | np.isnan(y2)) 
popt, pcov = scop.curve_fit(f, y2[valid], y1[valid]) 

正如評論所說,in versions of scipy newer than 0.15.0curve_fit會自動在您的輸入數組檢查NaN和INFS和將引發ValueError如果他們被發現。使用check_finite parameter可以選擇禁用此行爲。

根據您的問題和意見,我假設您必須使用舊版本 - 您應該考慮升級。