我試圖用scipy的curve_fit函數來擬合偏斜和移動的高斯曲線,但我發現在某些條件下擬合很差,常常讓我接近或完全是一條直線。scipy.optimize.curve_fit無法擬合偏移高斯曲線
以下代碼源自curve_fit
文檔。所提供的代碼是用於測試目的的任意數據集,但顯示的問題相當好。
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
import math as math
import scipy.special as sp
#def func(x, a, b, c):
# return a*np.exp(-b*x) + c
def func(x, sigmag, mu, alpha, c,a):
#normal distribution
normpdf = (1/(sigmag*np.sqrt(2*math.pi)))*np.exp(-(np.power((x-mu),2)/(2*np.power(sigmag,2))))
normcdf = (0.5*(1+sp.erf((alpha*((x-mu)/sigmag))/(np.sqrt(2)))))
return 2*a*normpdf*normcdf + c
x = np.linspace(0,100,100)
y = func(x, 10,30, 0,0,1)
yn = y + 0.001*np.random.normal(size=len(x))
popt, pcov = curve_fit(func, x, yn,) #p0=(9,35,0,9,1))
y_fit= func(x,popt[0],popt[1],popt[2],popt[3],popt[4])
plt.plot(x,yn)
plt.plot(x,y_fit)
這個問題似乎彈出時,我太遠了從零(使用mu
)轉移高斯。我嘗試給出初始值,即使是與我原來的功能相同的值,但它不能解決問題。對於值mu=10
,curve_fit
完美的作品,但如果我使用mu>=30
它不再適合數據。
好吧,事情開始看起來現在好一點了。我認爲我高估了curve_fit算法,並期望得到它太多。我現在將球手動暫停數值,然後將它們插入curve_fit並獲得很好的結果。乾杯。 – abradd 2013-03-14 22:58:48