我想将数据拟合到 Logistic (Sigmoid) 函数并且得到无限协方差。我有 2 个参数,假设我有 5 个数据点。我的数据在变量 xdata
和 ydata
中。这是一个生成完全相同警告的代码示例:
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 函数似乎合适:
最佳答案
鉴于您提供的数据,我会说您得到的协方差矩阵的警告表明 sigmoid 函数在拟合此类数据方面非常糟糕。
此外,5 点很难形成趋势……特别是如果你的第一个点是 5,然后一直跳到 75。在我看来,这些数据看起来就像是噪音。特别是因为您必须指向 y 值为 0 的点。
例如,如果您尝试拟合一条线
def line(x,m,n):
return x*m+n
你会得到两个看似合理的点(第一和第二)和一个明确定义的协方差矩阵(没有警告)。
更新
您还可以在数据之上绘制生成的 sigmoid 函数,以查看生成的拟合是否良好。我怀疑它不会,因此你会得到一个定义不明确的协方差矩阵。
一种可能的情况是拟合找不到合适的参数,从而丢失。我建议您为拟合程序提供一些参数的起始值,以将其推向正确的解决方案。也许
x_0=800
和 k=1
。关于python - scipy.optimize.curve_fit 未能估计协方差,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44631844/