scipy.optimize.curve_fit 无法估计协方差

问题描述 投票:0回答:3

我想将数据拟合到 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]])

以及以下警告:

OptimizeWarning:无法估计参数的协方差 类别=优化警告)

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

编辑:请注意,上面我提到我有数据点,但这只是为了示例。实际上有 60 个。这是原始数据图,可以看出 sigmoid 函数似乎确实合适:

python python-3.x scipy curve-fitting data-fitting
3个回答
4
投票

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

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

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

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

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

更新

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

一种可能的情况是拟合无法找到合适的参数,从而丢失。我建议您为拟合过程提供一些参数起始值,以推动其走向正确的解决方案。也许

x_0=800
k=1


2
投票

scipy.optimize.curve_fit() 需要注意的另一个问题:它(默默地)非常注重 x 和 y 数据的 dtype。

特别是,curve_fit 在 float32 数据上失败但在 float64 数据上成功没有充分的理由。它甚至应该适用于 int 数据。但如果它对你来说表现得很神秘,请尝试将你的数据强制为 float64。

为什么 scipy.optimize.curve_fit 不能生成最适合我的点的线?


0
投票

常见案例:

© www.soinside.com 2019 - 2024. All rights reserved.