回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我试图用scipy的<a href="http://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.optimize.curve_fit.html" rel="nofollow">curve_fit</a>函数来拟合一条倾斜和移动的高斯曲线,但我发现在某些情况下,拟合效果很差,常常使我接近或正好是一条直线。在</p>
<p>下面的代码来自<code>curve_fit</code>文档。提供的代码是用于测试目的的任意数据集,但显示的问题相当好。在</p>
<pre><code>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)
</code></pre>
<p>当我把高斯函数从零移得太远(使用<code>mu</code>)时,问题似乎就出现了。我试过给出初始值,即使是那些和我原来的函数相同的值,但这并不能解决问题。对于值<code>mu=10</code>,<code>curve_fit</code>工作得很好,但是如果我使用<code>mu>=30</code>,它就不再适合数据了。在</p>