2017-06-19 98 views
1

我想將數據擬合到Logistic(Sigmoid)函數並獲得無限協方差。我有2個參數,並假設我有5個數據點。我的數據在變量xdataydata中。這裏是產生完全相同的警告一個代碼示例:scipy.optimize.curve_fit未能估計協方差

from scipy.optimize import curve_fit 

def sigmoid(x, x0, k): 
    y = 1/(1 + np.exp(-k*(x-x0))) 
    return y 

xdata = np.array([ 5., 75., 88., 95., 96.]) 
ydata = np.array([ 0.04761905, 0.02380952, 0, 0.04761905, 0]) 


popt, pcov = curve_fit(sigmoid, xdata, ydata) 

賦予pcov

array([[ inf, inf], 
     [ inf, inf]]) 

和以下警告:

OptimizeWarning:協方差參數不能估計爲 category = OptimizeWarning)

我看到一個導致相同問題的相關問題here,但問題是數據點和參數的數量是相同的,這在我的情況中是不正確的。

編輯:注意上面我所提到我有個數據點,但是這僅僅是例子。實際上有60個。這裏是原始數據的圖表,看到確實sigmoid功能似乎是合適的:enter image description here

+1

您嘗試使用的數據與直線的一組點不同嗎?你能提供真實數據的樣本嗎?或者你是否真的試圖將一個sigmoid放入一個線性數據集? –

+0

謝謝@IgnacioVergaraKausel。我剛剛添加了示例數據 – splinter

回答

1

鑑於您提供的數據,我會說你得到的警告與所得到的協方差矩陣表明sigmoid函數在完成擬合這些數據的工作時非常糟糕。

此外,5分很難使趨勢...特別是如果你有第一個點在5,然後一直跳到75.在我看來,這些數據看起來就像噪音。特別是因爲你必須百分點0

例如,y值,如果你試圖安裝一個進線

def line(x,m,n): 
    return x*m+n 

你會得到兩分,似乎合理的(第一和第二)和好 - 定義的協方差矩陣(沒有警告)。

更新

您也可以繪製你的數據上產生的S形函數來查看是否產生配合是好的。我懷疑它不會,因此你會得到這樣一個不明確的協方差矩陣。

一種可能的情況是配件找不到合適的參數,從而丟失。我建議您給擬合程序一些參數的初始值,以便將它推向正確的解決方案。也許x_0=800k=1

+0

謝謝。請參閱編輯。我的數據比5點多,它確實看起來像一個S形,我添加了該圖。 – splinter

+1

@splinter檢查我的更新,也許它可以幫助你;) –

+1

更新解決了它:實際上最初的猜測是太遙遠了 – splinter