我想将数据拟合到 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 成为
array([[ inf,  inf],
       [ inf,  inf]])

以及以下警告:



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

编辑 :请注意,上面我已经提到我有数据点,但这只是示例。实际上有 60 个。这是原始数据的图,可以看出确实一个 sigmoid 函数似乎合适:python - scipy.optimize.curve_fit 未能估计协方差-LMLPHP

最佳答案

鉴于您提供的数据,我会说您得到的协方差矩阵的警告表明 sigmoid 函数在拟合此类数据方面非常糟糕。

此外,5 点很难形成趋势……特别是如果你的第一个点是 5,然后一直跳到 75。在我看来,这些数据看起来就像是噪音。特别是因为您必须指向 y 值为 0 的点。

例如,如果您尝试拟合一条线

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

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

更新

您还可以在数据之上绘制生成的 sigmoid 函数,以查看生成的拟合是否良好。我怀疑它不会,因此你会得到一个定义不明确的协方差矩阵。

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

关于python - scipy.optimize.curve_fit 未能估计协方差,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44631844/

10-16 11:21