scipy.optimize.curve_fit未能估计协方差
问题描述:
我想将数据拟合到Logistic(Sigmoid)函数并获得无限协方差。我有2个参数,并假设我有5个数据点。我的数据在变量xdata
和ydata
中。这里是产生完全相同的警告一个代码示例:scipy.optimize.curve_fit未能估计协方差
from scipy.optimize import curve_fit
def sigmoid(x, x0, k):
y = 1/(1 + np.exp(-k*(x-x0)))
return y
xdata = np.array([ 5., 75., 88., 95., 96.])
ydata = np.array([ 0.04761905, 0.02380952, 0, 0.04761905, 0])
popt, pcov = curve_fit(sigmoid, xdata, ydata)
赋予pcov
是
array([[ inf, inf],
[ inf, inf]])
和以下警告:
OptimizeWarning:协方差参数不能估计为 category = OptimizeWarning)
我看到一个导致相同问题的相关问题here,但问题是数据点和参数的数量是相同的,这在我的情况中是不正确的。
编辑:注意上面我所提到我有个数据点,但是这仅仅是例子。实际上有60个。这里是原始数据的图表,看到确实sigmoid功能似乎是合适的:
答
鉴于您提供的数据,我会说你得到的警告与所得到的协方差矩阵表明sigmoid函数在完成拟合这些数据的工作时非常糟糕。
此外,5分很难使趋势...特别是如果你有第一个点在5,然后一直跳到75.在我看来,这些数据看起来就像噪音。特别是因为你必须百分点0
例如,y值,如果你试图安装一个进线
def line(x,m,n):
return x*m+n
你会得到两分,似乎合理的(第一和第二)和好 - 定义的协方差矩阵(没有警告)。
更新
您也可以绘制你的数据上产生的S形函数来查看是否产生配合是好的。我怀疑它不会,因此你会得到这样一个不明确的协方差矩阵。
一种可能的情况是配件找不到合适的参数,从而丢失。我建议您给拟合程序一些参数的初始值,以便将它推向正确的解决方案。也许x_0=800
和k=1
。
您尝试使用的数据与直线的一组点不同吗?你能提供真实数据的样本吗?或者你是否真的试图将一个sigmoid放入一个线性数据集? –
谢谢@IgnacioVergaraKausel。我刚刚添加了示例数据 – splinter