我有一组数据(位移与时间),我已经使用optimize.leastsq方法拟合了几个方程.我现在希望得到拟合参数的误差值.通过文档查看输出的矩阵是雅可比矩阵,我必须将其乘以残差矩阵以得到我的值.不幸的是,我不是统计学家所以我在术语中有点溺水.
根据我的理解,我需要的是与我的拟合参数一致的协方差矩阵,因此我可以对角元素的平方根来得到拟合参数的标准误差.我有一个模糊的阅读记忆,协方差矩阵无论如何都是来自optimize.leastsq方法的输出.它是否正确?如果不是,您将如何获得残差矩阵乘以输出的雅可比矩阵乘以得到我的协方差矩阵?
任何帮助将不胜感激.我是python的新手,因此如果问题变成一个基本问题就道歉.
拟合代码如下:
fitfunc = lambda p, t: p[0]+p[1]*np.log(t-p[2])+ p[3]*t # Target function'
errfunc = lambda p, t, y: (fitfunc(p, t) - y)# Distance to the target function
p0 = [ 1,1,1,1] # Initial guess for the parameters
out = optimize.leastsq(errfunc, p0[:], args=(t, disp,), full_output=1)
Run Code Online (Sandbox Code Playgroud)
args t和disp是time和displcement值的数组(基本上只有2列数据).我已经导入了代码顶部所需的所有内容.输出提供的拟合值和矩阵如下:
[ 7.53847074e-07 1.84931494e-08 3.25102795e+01 -3.28882437e-11]
[[ 3.29326356e-01 -7.43957919e-02 8.02246944e+07 2.64522183e-04]
[ -7.43957919e-02 1.70872763e-02 -1.76477289e+07 -6.35825520e-05]
[ 8.02246944e+07 -1.76477289e+07 2.51023348e+16 5.87705672e+04]
[ 2.64522183e-04 -6.35825520e-05 5.87705672e+04 2.70249488e-07]]
Run Code Online (Sandbox Code Playgroud)
我怀疑此刻适合有点怀疑.当我可以解决错误时,这将得到确认.
我一直在scipy.optimize.leastsq用来拟合一些数据.我想在这些估计值上得到一些置信区间,所以我查看cov_x输出但是文档很清楚这是什么以及如何从中得到我的参数的协方差矩阵.
首先,它说它是一个雅可比行列式,但在笔记中它也说" cov_x是雅各比式的雅可比近似",所以它实际上不是雅可比,而是一个使用雅可比的近似的Hessian.以下哪些陈述是正确的?
其次这句话对我来说很困惑:
该矩阵必须乘以残差方差,以得到参数估计的协方差 - 见
curve_fit.
我确实去看看curve_fit它们所处的源代码:
s_sq = (func(popt, *args)**2).sum()/(len(ydata)-len(p0))
pcov = pcov * s_sq
Run Code Online (Sandbox Code Playgroud)
这相当于乘cov_x用s_sq,但我无法找到任何参考这个公式.有人能解释为什么这个等式是正确的吗?我的直觉告诉我它应该是另一种方式,因为cov_x它应该是一个衍生物(雅可比或黑森),所以我在想:
我想要的东西cov_x * covariance(parameters) = sum of errors(residuals)在哪里sigma(parameters).
如何连接事物curve_fit正在做我所看到的例如.维基百科:http: //en.wikipedia.org/wiki/Propagation_of_uncertainty#Non-linear_combinations