我有一些数据点,想找到一个拟合函数,我想一个累积高斯乙状窦函数会拟合,但我真的不知道如何实现这一点。
这就是我现在所拥有的:
import numpy as np
import pylab
from scipy.optimize
import curve_fit
def sigmoid(x, a, b):
y = 1 / (1 + np.exp(-b*(x-a)))
return y
xdata = np.array([400, 600, 800, 1000, 1200, 1400, 1600])
ydata = np.array([0, 0, 0.13, 0.35, 0.75, 0.89, 0.91])
popt, pcov = curve_fit(sigmoid, xdata, ydata)
print(popt)
x = np.linspace(-1, 2000, 50)
y = sigmoid(x, *popt)
pylab.plot(xdata, ydata, 'o', label='data')
pylab.plot(x,y, label='fit')
pylab.ylim(0, 1.05)
pylab.legend(loc='best')
pylab.show()
但我得到了以下警告:
.../scipy/optimize/minpack.py:779: OptimizeWarning: Covariance of the parameters could not be estimated category=OptimizeWarning)
有人能帮忙吗? 我也愿意接受任何其他的可能性!我只需要一个曲线来拟合这些数据。
您可能已经注意到结果完全不正确。 尝试使用
p0
参数向curve_fit
传递一些合适的初始参数:应该更合适,也许也没有警告。
(默认的起始参数是[1,1];这与实际参数太远,无法获得良好的拟合。)
您可以为参数设置一些合理的界限,例如
我有输出
曲线看起来像
(400,0)处的第一个点被删除为无用。你可以加上,虽然结果不会有太大变化。。。
更新
注意,边界设置为([低a,低b],[高a,高b]),所以我要求刻度在[0…0.01]范围内,位置在[600…1200]范围内
相关问题 更多 >
编程相关推荐