2017-06-19 59 views
1

我想将数据拟合到Logistic(Sigmoid)函数并获得无限协方差。我有2个参数,并假设我有5个数据点。我的数据在变量xdataydata中。这里是产生完全相同的警告一个代码示例: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功能似乎是合适的:enter image description here

+1

您尝试使用的数据与直线的一组点不同吗?你能提供真实数据的样本吗?或者你是否真的试图将一个sigmoid放入一个线性数据集? –

+0

谢谢@IgnacioVergaraKausel。我刚刚添加了示例数据 – splinter

回答

1

鉴于您提供的数据,我会说你得到的警告与所得到的协方差矩阵表明sigmoid函数在完成拟合这些数据的工作时非常糟糕。

此外,5分很难使趋势...特别是如果你有第一个点在5,然后一直跳到75.在我看来,这些数据看起来就像噪音。特别是因为你必须百分点0

例如,y值,如果你试图安装一个进线

def line(x,m,n): 
    return x*m+n 

你会得到两分,似乎合理的(第一和第二)和好 - 定义的协方差矩阵(没有警告)。

更新

您也可以绘制你的数据上产生的S形函数来查看是否产生配合是好的。我怀疑它不会,因此你会得到这样一个不明确的协方差矩阵。

一种可能的情况是配件找不到合适的参数,从而丢失。我建议您给拟合程序一些参数的初始值,以便将它推向正确的解决方案。也许x_0=800k=1

+0

谢谢。请参阅编辑。我的数据比5点多,它确实看起来像一个S形,我添加了该图。 – splinter

+1

@splinter检查我的更新,也许它可以帮助你;) –

+1

更新解决了它:实际上最初的猜测是太遥远了 – splinter