Ger*_*Ger 7 python regression numpy curve-fitting scipy
我使用的scipy.odr是为了在这个问题上对x和y的不确定性进行拟合,使用scipy curve_fit进行正确拟合,包括x中的误差?
在拟合之后,我想计算参数的不确定性.因此,我查看协方差矩阵的对角元素的平方根.我明白了:
>>> print(np.sqrt(np.diag(output.cov_beta)))
[ 0.17516591 0.33020487 0.27856021]
Run Code Online (Sandbox Code Playgroud)
但Output也有output.sd_beta是,根据上ODR DOC
形状(p,)的估计参数的标准误差.
但是,它没有给我相同的结果:
>>> print(output.sd_beta)
[ 0.19705029 0.37145907 0.31336217]
Run Code Online (Sandbox Code Playgroud)
编辑
这是笔记本上的一个例子:https://nbviewer.jupyter.org/github/gvallverdu/cookbook/blob/master/fit_odr.ipynb
至少方形
stop reason: ['Sum of squares convergence']
params: [ -1.94792946 11.03369235 -5.43265555]
info: 1
sd_beta: [ 0.26176284 0.49877962 0.35510071]
sqrt(diag(cov): [ 0.25066236 0.47762805 0.34004208]
Run Code Online (Sandbox Code Playgroud)
使用ODR
stop reason: ['Sum of squares convergence']
params: [-1.93538595 6.141885 -3.80784384]
info: 1
sd_beta: [ 0.6941821 0.88909997 0.17292514]
sqrt(diag(cov): [ 0.01093697 0.01400794 0.00272447]
Run Code Online (Sandbox Code Playgroud)
差异的原因sd_beta是由剩余方差缩放,而cov_beta不是.
scipy.odr是ODRPACK FORTRAN库的接口,它包含在内__odrpack.c.sd_beta并cov_beta通过索引到workFORTRAN例程内部使用的向量来恢复.在他们的第一个元素的索引work是命名变量sd和vcv(见这里).
从ODRPACK文档(第85页):
WORK(SDI)是包含函数参数的标准偏差的p × 1数组的第一个元素,即协方差矩阵的对角条目的平方根,其中SD???K?Run Code Online (Sandbox Code Playgroud)WORK(SDI-1+K) = SD(K) = ?V 1/2 ? (K, K) = ???K对
K = 1,... ,p.
WORK(VCVI)是p × p数组的第一个元素,VCV包含在?按残差方差缩放之前参数的协方差矩阵的值,其中Run Code Online (Sandbox Code Playgroud)WORK(VCVI-1+I+(J-1)*(NP)) = VCV(I,J) = ???²V ?(I, J)为
I = 1,... ,p和J = 1,... ,p.
换句话说,np.sqrt(np.diag(output.cov_beta * output.res_var))会给你相同的结果output.sd_beta.
我在这里打开了一个错误报告.