Scipy sigmoid 曲线拟合
Scipy sigmoid curve fitting
我有一些数据点,想找到一个拟合函数,我猜累积高斯 sigmoid 函数会拟合,但我真的不知道如何实现。
这是我现在拥有的:
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)
有人可以帮忙吗?
我也愿意接受任何其他可能性!我只需要以任何方式拟合此数据的曲线。
您可能已经注意到生成的拟合完全不正确。
尝试将一些不错的初始参数传递给 curve_fit
,使用 p0
参数:
popt, pcov = curve_fit(sigmoid, xdata, ydata, p0=[1000, 0.001])
应该更合适,而且可能也没有警告。
(默认起始参数为[1, 1],与实际参数相差太远,无法很好拟合。)
你可以给参数设置一些合理的范围,比如做
def fsigmoid(x, a, b):
return 1.0 / (1.0 + np.exp(-a*(x-b)))
popt, pcov = curve_fit(fsigmoid, xdata, ydata, method='dogbox', bounds=([0., 600.],[0.01, 1200.]))
我有输出
[7.27380294e-03 1.07431197e+03]
曲线看起来像
(400,0) 处的第一个点因无用而被删除。您可以添加它,但结果不会有太大变化...
更新
请注意,边界设置为 ([low_a,low_b],[high_a,high_b]),所以我要求比例在[0...0.01] 和位置在 [600...1200]
内
我有一些数据点,想找到一个拟合函数,我猜累积高斯 sigmoid 函数会拟合,但我真的不知道如何实现。
这是我现在拥有的:
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)
有人可以帮忙吗? 我也愿意接受任何其他可能性!我只需要以任何方式拟合此数据的曲线。
您可能已经注意到生成的拟合完全不正确。
尝试将一些不错的初始参数传递给 curve_fit
,使用 p0
参数:
popt, pcov = curve_fit(sigmoid, xdata, ydata, p0=[1000, 0.001])
应该更合适,而且可能也没有警告。
(默认起始参数为[1, 1],与实际参数相差太远,无法很好拟合。)
你可以给参数设置一些合理的范围,比如做
def fsigmoid(x, a, b):
return 1.0 / (1.0 + np.exp(-a*(x-b)))
popt, pcov = curve_fit(fsigmoid, xdata, ydata, method='dogbox', bounds=([0., 600.],[0.01, 1200.]))
我有输出
[7.27380294e-03 1.07431197e+03]
曲线看起来像
(400,0) 处的第一个点因无用而被删除。您可以添加它,但结果不会有太大变化...
更新
请注意,边界设置为 ([low_a,low_b],[high_a,high_b]),所以我要求比例在[0...0.01] 和位置在 [600...1200]
内