【问题标题】:Simple understanding of Orthogonal Distance Regression (ODR)正交距离回归(ODR)的简单理解
【发布时间】:2017-02-17 22:03:51
【问题描述】:

我有一些数据点在这些数据点的 x 和 y 坐标上都有错误。因此,我想使用 python 的 ODR 工具来计算最佳拟合斜率和该斜率上的误差。我已经尝试为我的实际数据做这件事,但没有找到好的结果。因此,我首先尝试通过一个简单的示例来使用 ODR,如下所示:

import numpy as np
import matplotlib.pyplot as plt
from scipy.odr import *

def linear_func(B, x):
    return B[0]*x+B[1]

x_data=np.array([0.0, 1.0, 2.0, 3.0])
y_data=np.array([0.0, 1.0, 2.0, 3.0])
x_err=np.array([1.0, 1.0, 1.0, 1.0])
y_err=np.array([5.0, 5.0, 5.0, 5.0])

linear=Model(linear_func)
data=RealData(x_data, y_data, sx=x_err, sy=y_err)
odr=ODR(data, linear, beta0=[1.0, 0.0])
out=odr.run()
out.pprint()

pprint() 行给出:

Beta: [ 1.  0.]
Beta Std Error: [ 0.  0.]
Beta Covariance: [[  5.20000039  -7.80000026]
 [ -7.80000026  18.1999991 ]]
Residual Variance: 0.0
Inverse Condition #: 0.0315397386692
Reason(s) for Halting:
  Sum of squares convergence

结果显示的 Beta 值是 1.0 和 0.0,这是我认为的。但是,如果我在数据点上的错误非常大,为什么标准错误Beta Std Error 也都为零?谁能提供一些见解?

【问题讨论】:

    标签: scipy regression curve-fitting data-fitting orthogonal


    【解决方案1】:

    我认为这里没有差异。您的示例模型非常适合您的数据,因此您传递给数据的权重无关紧要。此外,您最初的猜测beta0=[1.0, 0.0] 是一个给出最优解的参数向量,因此 ODR 机制无法找到参数的迭代改进,并在零次迭代后退出。相关错误为零,因为对于给定数据,找到的解决方案比任何其他可能的解决方案都要好得多,因为您的 sum of squares B=[1, 0] 为零。

    要查看ODR.run() 函数内部实际发生的情况,请在运行回归之前添加odr.set_iprint(init=2, iter=2, final=2)。特别是,以下输出确认 ODR 立即达到停止条件:

     --- STOPPING CONDITIONS:
             INFO =     1 ==> SUM OF SQUARES CONVERGENCE.
            NITER =     0          (NUMBER OF ITERATIONS)
    

    请注意,如果您的x_data 不等于y_data 或beta0 与最优值不匹配,则错误不会 为零,NITER 将是一个整数解决方案。在这种情况下,ODR 返回的错误将是非零的,尽管仍然非常小。

    【讨论】:

    • 谢谢你的好回答,弗拉斯。我不明白为什么斜坡上没有一些基本错误。如果给定带有误差线的数据,我认为 ODR 应该计算直线斜率的固有误差及其值。如果不是这种方式,如何计算斜率的固有误差?
    • Beta Std Error 的值不反映您传递给它的绝对误差 - 仅反映分配给数据点的相对“权重”。我不完全理解这些值是如何计算的,但也许你可以通过阅读 ordpack documentation 来弄清楚。
    • 考虑x_err 和y_err 的绝对比例的一种方法是将参数不确定性估计为B_err = np.sqrt(np.diag(out.cov_beta)) - 协方差矩阵对角线项的平方根。上面链接文档中的4.B 部分详细介绍了这种近似值有多好。
    猜你喜欢
    • 2011-10-27
    • 1970-01-01
    • 2020-12-12
    • 1970-01-01
    • 2014-02-28
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    相关资源
    最近更新 更多