一尘不染

在Scipy中,curve_fit如何以及为什么计算参数估计值的协方差

python

我一直在使用scipy.optimize.leastsq以拟合一些数据。我想在这些估计值上获得一些置信区间,因此我会查看cov_x输出,但是文档尚不清楚这是什么以及如何从中获取参数的协方差矩阵。

首先,它说这是雅可比行列式,但在注释中也说“cov_x是对黑森州的雅可比行列式近似值”,因此,它实际上不是雅可比行列式,而是使用与雅可比行列式近似的黑森州式。以下哪种说法是正确的?

其次,这句话使我感到困惑:

必须将此矩阵乘以残差方差,以获得参数估计值的协方差–请参见curve_fit

我确实去看看它们在哪里工作的源代码curve_fit

s_sq = (func(popt, *args)**2).sum()/(len(ydata)-len(p0))
pcov = pcov * s_sq

这相当于乘以cov_xs_sq但我在任何参考文献中都找不到此等式。有人可以解释为什么这个方程式正确吗?我的直觉告诉我,应该是相反的,因为cov_x它应该是派生的(Jacobian或Hessian),所以我在想:
我想要的东西cov_x * covariance(parameters) = sum of errors(residuals)在哪里sigma(parameters)

我如何将curve_fit所做的事情与我在例如上看到的联系起来。维基百科:http//en.wikipedia.org/wiki/Propagation_of_uncertainty#Non-
linear_combinations


阅读 338

收藏
2020-12-20

共1个答案

一尘不染

好吧,我想我找到了答案。首先是解决方案:cov_x * s_sq就是您想要的参数的协方差。取对角线元素的平方根会给您标准偏差(但要注意协方差!)。

残留方差=减少的卡方= s_sq = sum [(f(x(y)-y)^ 2]
/(Nn),其中N为数据点数,n为拟合参数数。减少卡方

我感到困惑的原因是,由minimumsq给出的cov_x实际上在其他地方并不是真正的cov(x),而是减少的cov(x)或分数cov(x)。它在其他任何参考文献中均未显示的原因是它是一种简单的重新缩放,在数值计算中很有用,但与教科书无关。

关于Hessian和Jacobian,该文档措辞不佳。在这两种情况下,很明显是由Hessian计算得出的,因为Jacobian最小为零。他们的意思是说他们正在使用与雅可比近似的方法来找到黑森州。

进一步说明。似乎curve_fit结果实际上并未考虑误差的绝对大小,而仅考虑了所提供的sigma的相对大小。这意味着即使误差条变化了百万分之一,pcov返回的值也不会改变。这当然是不对的,但似乎是标准做法。Matlab使用“曲线拟合”工具箱时会做同样的事情。此处描述了正确的过程:https
:
//en.wikipedia.org/wiki/Linear_least_squares_(mathematics)#Parameter_errors_and_correlation

一旦找到最佳值,至少对于线性最小二乘法,这样做似乎很简单。

2020-12-20