scipy.optimize.curve U拟合无法估计协方差

2024-04-26 09:23:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把数据拟合成一个Logistic(Sigmoid)函数,得到无穷大的协方差。我有2个参数,假设我有5个数据点。我的数据在变量xdataydata中。下面是生成完全相同警告的代码示例:

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成为

^{pr2}$

以及以下警告:

OptimizeWarning: Covariance of the parameters could not be estimated category=OptimizeWarning)

我看到一个相关的问题导致了相同的问题here,但问题是数据点和参数的数量是相同的,这在我的例子中是不正确的。在

编辑:请注意,上面我已经提到我有数据点,但这只是示例。实际上有60个。下面是一个原始数据图,看看sigmoid函数是否合适:enter image description here


Tags: 数据函数警告示例参数nparrayfit
2条回答

另一个需要注意的问题scipy.optimize.curve U拟合():它对x和y数据的数据类型非常特别。在

特别是,曲线拟合在float32上失败,而在float64数据上成功是没有道理的。它甚至可以处理int数据。但是如果你觉得它的行为很神秘,试着把你的数据强制到float64。在

看到了吗 Why does scipy.optimize.curve_fit not produce a line of best fit for my points?

考虑到您提供的数据,我想说您得到的协方差矩阵的警告表明sigmoid函数在拟合这些数据方面非常糟糕。在

而且,5分很难做出趋势。。。尤其是如果你第一个点是5,然后一路跳到75。在我看来,这些数据看起来就像噪音。尤其是因为你必须用一个y值为0的点。在

例如,如果你试图拟合一条直线

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

你会得到两个看似合理的点(第一个和第二个)和一个定义良好的协方差矩阵(没有警告)。在

更新

您还可以在数据上绘制得到的sigmoid函数,以查看结果拟合是否良好。我怀疑它不会,所以你得到了一个定义不清的协方差矩阵。在

一种可能的情况是拟合无法找到合适的参数,从而丢失。我建议您为拟合过程提供一些参数的起始值,以使其接近正确的解。可能是x_0=800和{}。在

相关问题 更多 >