SciPy - ODR

ODR 代表正交距离回归,用于回归研究。基本线性回归通常用于通过在图表上绘制最佳拟合线来估计两个变量yx之间的关系。

用于此目的的数学方法称为最小二乘法,旨在最小化每个点的平方误差之和。这里的关键问题是如何计算每个点的误差(也称为残差)?

在标准线性回归中,目的是根据 X 值预测 Y 值 - 因此明智的做法是计算 Y 值的误差(如下图所示的灰线)。但是,有时同时考虑 X 和 Y 的误差更为明智(如下图红色虚线所示)。

例如 −当您知道 X 的测量结果不确定时,或者当您不想关注一个变量相对于另一个变量的误差时。

正交距离线性回归

正交距离回归 (ODR) 是一种可以做到这一点的方法(在这种情况下,正交意味着垂直 - 因此它计算垂直于线的误差,而不仅仅是"垂直")。

scipy.odr 单变量回归的实现

以下示例演示了 scipy.odr 单变量回归的实现。

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

# 初始化一些数据,使用提供一些随机性random.random()。
x = np.array([0, 1, 2, 3, 4, 5])
y = np.array([i**2 + random.random() for i in x])

# 定义一个函数(在我们的例子中是二次函数)来拟合数据。
def linear_func(p, x):
m, c = p
return m*x + c

# 创建一个拟合模型。
linear_model = Model(linear_func)

# 使用我们上面初始化的数据创建一个 RealData 对象。
data = RealData(x, y)

# 使用模型和数据设置 ODR。
odr = ODR(data, linear_model, beta0=[0., 1.])

# 运行回归。
out = odr.run()

# 使用内置的 pprint 方法为我们提供结果。
out.pprint()

上述程序将生成以下输出。

Beta: [ 5.51846098 -4.25744878]
Beta Std Error: [ 0.7786442 2.33126407]

Beta Covariance: [
   [ 1.93150969 -4.82877433]
   [ -4.82877433 17.31417201
]]

Residual Variance: 0.313892697582
Inverse Condition #: 0.146618499389
Reason(s) for Halting:
   Sum of squares convergence