简单理解正交距离回归(ODR)

时间:2016-10-09 09:35:36

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

我有一些数据点在这些数据点的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也都为零?任何人都可以提供一些见解吗?

1 个答案:

答案 0 :(得分:2)

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

要查看odr.set_iprint(init=2, iter=2, final=2)函数中实际发生的情况,请在运行回归之前添加 --- STOPPING CONDITIONS: INFO = 1 ==> SUM OF SQUARES CONVERGENCE. NITER = 0 (NUMBER OF ITERATIONS) 。特别是,以下输出确认ODR立即达到停止状态:

NITER

请注意,的错误如何为零,如果x_data不等于y_databeta0,则SELECT ActorName, ShowName, ROUND(ActorRate*ShowDuration/60, 2) AS [TotalEarnings] FROM (tblActors INNER JOIN tblRoles ON tblActors.ActorID=tblRoles.ActorID) INNER JOIN tblShows ON tblShows.ShowID=tblRoles.ShowID ORDER BY ActorName 将为整数1}}与最佳解决方案不匹配。在这种情况下,ODR返回的错误将是非零的,尽管仍然非常小。