我无法使用scipy.optimize.curve_fit
来拟合使用numpy.sinc生成的数据。即使我(或至少我认为我这样做)与scipy文档完全相同。这是我的简单尝试:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
xdata = np.arange(-10, 10, 0.1)
y = 100*np.sinc(xdata - 3) + 1
y_noise = np.random.normal(3, 2, 200)
ydata = y + y_noise
def func(x, a, h, k):
return(a*np.sinc(x - h) + k)
popt, pcov = curve_fit(func, xdata, ydata)
plt.plot(xdata, ydata)
plt.plot(xdata, func(xdata, *popt))
plt.show()
结果如下:
答案 0 :(得分:3)
对于许多功能,您必须给curve_fit
一个非常好的"初步猜测参数。没有它,优化例程会找到其目标函数的局部最小值,这实际上是不合适的。
在你的情况下,我通过使用:
得到了很好的契合k = ydata.argmax()
p0 = [ydata[k], xdata[k], ydata.mean()]
popt, pcov = curve_fit(func, xdata, ydata, p0=p0)
这是情节:
答案 1 :(得分:2)
您可以使用p0=[...]
curve_fit
提供初步猜测
例如:
from scipy.optimize import curve_fit
xdata = np.arange(-10, 10, 0.1)
y = 100*np.sinc(xdata - 3) + 1
y_noise = np.random.normal(3, 2, 200)
ydata = y + y_noise
def func(x, a, h, k):
return(a*np.sinc(x - h) + k)
popt, pcov = curve_fit(func, xdata, ydata, p0=[100, 1, 1])
plt.plot(xdata, ydata)
plt.plot(xdata, func(xdata, *popt))
plt.show()