2017-02-22 132 views
2

指數函數我有以下的「分數」的功能,這意味着給予一定的測量0和一之間的比分,看起來像:曲線擬合使用SciPy的

def func(x, a, b): 
    return 1.0/(1.0+np.exp(-b*(x-a))) 

我想,以適應它下面的X和Y大牙:

x = np.array([4000, 2500, 2000, 1000, 500]) 
y = np.array([ 0.1, 0.3, 0.5, 0.7, 0.9]) 

curve_fit似乎並不工作:

popt, pcov = curve_fit(func, x, y) 

enter image description here 當我試圖用線性函數擬合它時,curve_fit給出了一個很好的擬合(綠色線),但是使用上面的指數函數,只給出了a=1b=1,這不是一個好的擬合。一個好的擬合應該是a=1800b=-0.001667,它給出了紅線(藍色的數據)。

+0

你能否提供更多的代碼的一個位,其中包括陰謀?那麼其他人更容易幫忙。 – Philipp

回答

3

原因可能是起始條件未指定。如果你給它一些合理的數字,那麼它更有可能會收斂。下面是一些合理的起始條件的一個例子:

from scipy.optimize import curve_fit 

def func(x, a, b): 
    return 1.0/(1.0+np.exp(-b*(x-a))) 

x = np.array([4000., 2500., 2000., 1000., 500.]) 
y = np.array([ 0.1, 0.3, 0.5, 0.7, 0.9]) 

popt, pcov = curve_fit(func, x, y, p0=[2000., 0.005]) 

plot(x, y, 'x') 
xx = linspace(0, 4000, 100) 
yy = func(xx, *popt) 
plot(xx, yy, lw=5) 

enter image description here