【问题标题】:scipy.optimize.curve_fit failing to estimate the covariancescipy.optimize.curve_fit 无法估计协方差
【发布时间】:2017-11-21 17:53:32
【问题描述】:

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

以及以下警告:

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

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

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

【问题讨论】:

  • 您尝试使用的数据是否不同于直线的一组点?你能提供一个真实数据的样本吗?还是您真的想将 sigmoid 拟合到线性数据集中?
  • 感谢@IgnacioVergaraKausel。我刚刚添加了示例数据

标签: python python-3.x scipy curve-fitting data-fitting


【解决方案1】:

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

此外,5 分很难形成趋势...尤其是如果您的第一个点为 5,然后一路跃升至 75。在我看来,这些数据看起来就像噪音。特别是因为您必须指向 y 值为 0 的点。

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

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

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

更新

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

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

【讨论】:

  • 谢谢。请看编辑。我的数据超过 5 个点,看起来确实像 sigmoid,我添加了绘图。
  • 更新解决了它:确实最初的猜测太远了
【解决方案2】:

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

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

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

【讨论】:

  • 我不会猜到,但我只是碰巧遇到了这个问题。 x 数据是 dtype int32 和 curve_fit 只是未能产生拟合。强制使用 float64 对此有所帮助。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-26
  • 1970-01-01
  • 1970-01-01
  • 2021-02-17
  • 2022-01-17
  • 1970-01-01
相关资源
最近更新 更多