为什么scipy.optimize.curve_fit不能使用numpy.sinc函数来适应我的数据?

时间:2018-04-05 15:24:36

标签: python numpy scipy curve-fitting

我无法使用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()

结果如下:

enter image description here

2 个答案:

答案 0 :(得分:3)

对于许多功能,您必须给curve_fit一个非常好的"初步猜测参数。没有它,优化例程会找到其目标函数的局部最小值,这实际上是不合适的。

在你的情况下,我通过使用:

得到了很好的契合
k = ydata.argmax()
p0 = [ydata[k], xdata[k], ydata.mean()]
popt, pcov = curve_fit(func, xdata, ydata, p0=p0)

这是情节:

plot

答案 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()

enter image description here