如果参数完全吻合,为什么`curve_fit`不能估计参数的协方差?

时间:2017-01-18 17:07:31

标签: python numpy scipy curve-fitting covariance

我不明白curve_fit无法估计参数的协方差,从而提升下面的OptimizeWarning。以下MCVE解释了我的问题:

MCVE python代码段

from scipy.optimize import curve_fit
func = lambda x, a: a * x
popt, pcov = curve_fit(f = func, xdata = [1], ydata = [1])
print(popt, pcov)

输出

\python-3.4.4\lib\site-packages\scipy\optimize\minpack.py:715:
OptimizeWarning: Covariance of the parameters could not be estimated
category=OptimizeWarning)

[ 1.] [[ inf]]

对于a = 1,该函数完全符合xdataydata。为什么不是错误/差异0,或接近0,而是inf呢?

来自curve_fit SciPy Reference Guide

的引用
  

如果解的雅可比矩阵没有满秩,那么'lm'方法返回一个填充np.inf的矩阵,另一方面'trf'和'dogbox'方法使用Moore-Penrose伪逆计算协方差矩阵。

那么,潜在的问题是什么?为什么解的雅可比矩阵不具有满秩?

1 个答案:

答案 0 :(得分:11)

参数协方差的公式(Wikipedia)具有分母中的自由度数。自由度计算为(数据点数) - (参数个数),在您的示例中为1 - 1 = 0。 this是SciPy在除以之前检查自由度数的地方。

使用xdata = [1, 2], ydata = [1, 2],您将获得零协方差(请注意,模型仍然完全符合:精确拟合不是问题)。

如果样本大小N为1(样本方差的公式在分母中具有(N-1)),则这与样本方差未定义的问题相同。如果我们只从群体中取出size = 1样本,我们不会将方差估计为零,我们对方差一无所知。