正交距离回归 (scipy.odr)#
自版本 1.17.0 起已弃用:scipy.odr 已弃用,将在 SciPy 1.19.0 中移除。请改用 pypi.org/project/odrpack/。
以下示例显示了 API 的简要比较
import numpy as np
import scipy.odr
import odrpack
# Classic "Pearson data" that motivates ODR.
# Errors are in both variables, and if you don't account for this,
# doing a linear fit of X vs. Y or Y vs. X will give you quite
# different results.
p_x = np.array([0., .9, 1.8, 2.6, 3.3, 4.4, 5.2, 6.1, 6.5, 7.4])
p_y = np.array([5.9, 5.4, 4.4, 4.6, 3.5, 3.7, 2.8, 2.8, 2.4, 1.5])
p_sx = np.array([.03, .03, .04, .035, .07, .11, .13, .22, .74, 1.])
p_sy = np.array([1., .74, .5, .35, .22, .22, .12, .12, .1, .04])
# Old-style
# The RealData class takes care of details like turning
# standard-deviation error bars into weights.
p_dat = scipy.odr.RealData(p_x, p_y, sx=p_sx, sy=p_sy)
# Note, parameters come before `x` in scipy.odr
p_mod = scipy.odr.Model(lambda beta, x: beta[0] + beta[1]*x)
p_odr = scipy.odr.ODR(p_dat, p_mod, beta0=[1., 1.])
old_out = p_odr.run()
# New-style
# Parameters come after data, in the new API.
# We must convert the error bars into weights ourselves.
new_out = odrpack.odr_fit(lambda x, beta: beta[0] + beta[1] * x,
p_x, p_y, beta0=np.array([1.0, 1.0]),
weight_x=p_sx**-2, weight_y=p_sy**-2)
assert np.isclose(old_out.beta, new_out.beta).all()
包内容#
|
要拟合的数据。 |
|
数据,权重为实际标准差和/或协方差。 |
|
Model 类存储有关您希望拟合的函数的信息。 |
|
ODR 类收集所有信息并协调主拟合例程的运行。 |
|
Output 类存储 ODR 运行的输出。 |
|
ODR 的底层函数。 |
警告,指示传递到 ODR 的数据在传递到 'odr' 时会导致用户应注意的问题。 |
|
指示拟合错误的异常。 |
|
停止拟合的异常。 |
|
|
用于通用多项式模型的工厂函数。 |
指数模型 |
|
任意维线性模型 |
|
单变量线性模型 |
|
二次模型 |
用法信息#
简介#
为什么使用正交距离回归 (ODR)? 有时,在解释(又称“独立”)变量中存在测量误差,而不仅仅是在响应(又称“依赖”)变量中。普通最小二乘 (OLS) 拟合程序将解释变量的数据视为固定,即不受任何类型的误差影响。 此外,OLS 程序要求响应变量是解释变量的显式函数;有时使方程显式化是不切实际的,和/或会引入错误。 ODR 可以轻松处理这两种情况,甚至可以在问题足够简单时简化为 OLS 情况。
ODRPACK 是一个 FORTRAN-77 库,用于执行具有可能非线性拟合函数的 ODR。 它使用修改后的置信域 Levenberg-Marquardt 类型算法 [1] 来估计函数参数。 拟合函数由在 NumPy 数组上运行的 Python 函数提供。 所需的导数也可以由 Python 函数提供,或者可以进行数值估计。 ODRPACK 可以执行显式或隐式 ODR 拟合,或者它可以执行 OLS。 输入和输出变量可以是多维的。 可以提供权重来考虑观测值的不同方差,甚至变量维度的协方差。
scipy.odr 包提供了 ODRPACK 的面向对象接口,以及底层 odr 函数。
可以在 ODRPACK 用户指南 中找到有关 ODRPACK 的其他背景信息,建议阅读。
基本用法#
定义要拟合的函数。
def f(B, x): '''Linear function y = m*x + b''' # B is a vector of the parameters. # x is an array of the current x values. # x is in the same format as the x passed to Data or RealData. # # Return an array in the same format as y passed to Data or RealData. return B[0]*x + B[1]
创建 Model。
linear = Model(f)
创建 Data 或 RealData 实例。
mydata = Data(x, y, wd=1./power(sx,2), we=1./power(sy,2))
或者,当已知实际协方差时
mydata = RealData(x, y, sx=sx, sy=sy)
使用数据、模型和初始参数估计值实例化 ODR。
myodr = ODR(mydata, linear, beta0=[1., 2.])
运行拟合。
myoutput = myodr.run()
检查输出。
myoutput.pprint()
参考文献#
P. T. Boggs 和 J. E. Rogers,“正交距离回归”,在“测量误差模型和应用统计分析:1989 年 6 月 10 日至 16 日举行的 AMS-IMS-SIAM 联合夏季研究会议的论文集”中,当代数学,第 112 卷,第 186 页,1990 年。