我使用>>> print(np.sqrt(np.diag(output.cov_beta)))
[ 0.17516591 0.33020487 0.27856021]
以便在此问题Correct fitting with scipy curve_fit including errors in x?
在拟合之后,我想计算参数的不确定性。因此,我查看协方差矩阵的对角元素的平方根。我明白了:
Output
但根据doc on odr
,在output.sd_beta
中还有>>> print(output.sd_beta)
[ 0.19705029 0.37145907 0.31336217]
。
估计参数的标准误差,形状(p,)。
但是,它没有给我相同的结果:
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]
修改
这是笔记本上的示例:https://nbviewer.jupyter.org/github/gvallverdu/cookbook/blob/master/fit_odr.ipynb
最小方
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]
使用ODR
@Override
public void start(Stage primaryStage) {
System.load("C:\\opencv\\build\\x64\\vc12\\bin\\opencv_ffmpeg_64.dll");
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("Sample.fxml"));
BorderPane root = (BorderPane) loader.load();
Scene scene = new Scene(root, 400, 400);
scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e) {
System.out.println("error opening camera gui");
}
}
public static void main(String[] args) {
launch(args);
}
答案 0 :(得分:7)
出现差异的原因是sd_beta
按剩余方差缩放,而cov_beta
则不是。
scipy.odr
是ODRPACK FORTRAN库的接口,它包含在__odrpack.c
中。通过索引到FORTRAN例程内部使用的sd_beta
向量来恢复cov_beta
和work
。 work
中第一个元素的索引是名为sd
和vcv
的变量(请参阅here)。
来自ODRPACK documentation(第85页):
WORK(SDI)
是包含p × 1
数组SD
的第一个元素 函数参数̂σβK
的标准偏差β
,即 协方差矩阵的对角项的平方根,其中WORK(SDI-1+K) = SD(K) = ̂V 1/2 β (K, K) = ̂σβK
代表
K = 1,... ,p
。
WORK(VCVI)
是包含p × p
数组VCV
的第一个元素 参数β
之前的协方差矩阵的值 按剩余方差缩放 ,其中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
相同的结果。
我已经打开了一个错误报告here。