【scipy 基础】--正交距离回归
Scipy的ODR正交距离回归(ODR-Orthogonal Distance Regression)模块,适用于回归分析时,因变量和自变量之间存在非线性关系的情况。
它提高了回归分析的准确性和稳健性。对于需要解决非线性回归问题的科研人员和工程师来说,它具有非常重要的意义。
ODR正交距离回归模块的作用主要在于它将正交化方法和距离回归结合起来,解决了传统线性回归模型在处理非线性问题时的局限性。它通过将自变量进行正交化处理,使得因变量和自变量之间的非线性关系能够更好地被拟合出来。
1. 主要功能
scipy.odr模块针对的领域比较明确,所以不像之前介绍的模块有那么多函数。
此模块的主要函数包括:
| 函数名 | 说明 |
|---|---|
| Data | 要拟合的数据 |
| RealData | 数据的权重为实际标准差和/或协方差 |
| Model | Model 类存储有关您希望拟合的函数的信息 |
| ODR | ODR 类收集所有信息并协调主要拟合例程的运行 |
| Output | 输出类存储 ODR 运行的输出 |
| 其他函数 | 调整拟合和模型的一些函数 |
一般来说,使用前5个函数,就可以进行一些正交距离回归分析。
2. 使用示例
正交距离分析一般步骤如下:

2.1. 准备数据
数据采用以前收集的江苏省人口数据,获取地址:https://databook.top/jiangsustat/renkou
import pandas as pd
data = pd.read_csv("/path/to/人口-年末常住人口(万人).csv")
data.head(10)

一共31条数据,1990年~2020年江苏省的人口变化数据。
用散点图看看数据的变化趋势:
from matplotlib.ticker import MultipleLocator
import matplotlib.pyplot as plt
ax = plt.subplot()
ax.scatter(data["year"], data["value"], marker='*', color='r')
ax.xaxis.set_major_locator(MultipleLocator(5))
ax.set_title("江苏省人口变化")
plt.show()

2.2. 创建模型
使用scipy.odr模块中的Model函数创建一个拟合的模型。
import scipy.odr as sodr
# 模型函数
def model_func(p, x):
k, b = p
return k * x + b
model = sodr.Model(model_func)
2.3. 生成数据
将上面的人口数据data转换为可以用于ODR运算的数据。
# x是数据
x = range(len(data))
# 转换数据用RealData或者Data函数都可以
rdata = sodr.RealData(x, data["value"])
# rdata = sodr.Data(x, data["value"])
Data和RealData函数都是用来构造数据的。
一般来说,Data函数用来构造理论数据;RealData函数用来构造实际数据的,且RealData中还可以设置权重。
这里没有设置权重,用哪个函数都可以。
2.4. ODR运算
有了数据和模型之后,就可以进行ODR运算了。
odr = sodr.ODR(rdata, model, beta0=[0, 1])
result = odr.run()
result.pprint()
# 运行结果:
Beta: [ 61.01340781 6724.77566283]
Beta Std Error: [ 1.11208495 19.3974215 ]
Beta Covariance: [[ 1.51592414 -22.73886321]
[-22.73886321 461.20026764]]
Residual Variance: 0.8158277156001223
Inverse Condition #: 0.2520617152422754
Reason(s) for Halting:
Sum of squares convergence
其中 Beta 和 Beta Std Error就拟合的参数值和参数的标准差。
2.5. 输出结果
根据计算结果,绘制出图形更容易理解。
# 拟合参数和参数的标准差
beta = result.beta
beta_std = result.sd_beta
# 拟合的曲线
y = beta[0] * x + beta[1]
# 拟合曲线的标准差上限
y_up = (beta[0] + beta_std[0]) * x + (beta[1]+ beta_std[1])
# 拟合曲线的标准差下限
y_down = (beta[0] - beta_std[0]) * x + (beta[1] - beta_std[1])
# 绘制拟合的曲线
ax = plt.subplot()
ax.scatter(data["year"], data["value"], marker='*', color='r')
ax.xaxis.set_major_locator(MultipleLocator(5))
ax.set_title("江苏省人口变化")
ax.plot(x, y, color="b", label="拟合曲线")
ax.plot(x, y_up, color="y", label="标准差上限")
ax.plot(x, y_down, color="g", label="标准差下限")
plt.legend()
plt.show()

这就是通过ODR模块拟合的人口变化情况。
3. 总结
ODR正交距离回归之所以作为Scipy的单独模块,是因为它是一种特殊的曲线拟合方法,
它使用正交化和距离加权的最小二乘法来处理具有非线性关系的输入变量,并旨在找到最优的模型以最小化预测误差。
这与一般的曲线拟合在方法和目标上有很大的不同。
后续介绍Scipy库中的其他模块时,还会介绍其他的曲线拟合函数,到时候可以和这里的ODR方法对照比较一下。
【scipy 基础】--正交距离回归的更多相关文章
- SciPy 基础功能
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
- 【机器学习基础】逻辑回归——LogisticRegression
LR算法作为一种比较经典的分类算法,在实际应用和面试中经常受到青睐,虽然在理论方面不是特别复杂,但LR所牵涉的知识点还是比较多的,同时与概率生成模型.神经网络都有着一定的联系,本节就针对这一算法及其所 ...
- Python教程:进击机器学习(五)--Scipy《转》
Scipy简介 文件输入和输出scipyio 线性代数操作scipylinalg 快速傅里叶变换scipyfftpack 优化器scipyoptimize 统计工具scipystats Scipy简介 ...
- SciPy 介绍
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
- 1.5 Scipy:高级科学计算
sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005269003&am ...
- 统计学习方法 | 第1章 统计学习方法概论 | Scipy中的Leastsq()
Scipy是一个用于数学.科学.工程领域的常用软件包,可以处理插值.积分.优化.图像处理.常微分方程数值解的求解.信号处理等问题.它用于有效计算Numpy矩阵,使Numpy和Scipy协同工作,高效解 ...
- SciPy笔记
一.简介 SciPy 是一个开源的 Python 算法库和数学工具包.Scipy 是基于 Numpy 的科学计算库,用于数学.科学.工程学等领域,很多有一些高阶抽象和物理模型需要使用 Scipy.Sc ...
- python---scipy模块
一 简单介绍 SciPy是基于NumPy开发的高级模块,它提供了许多数学算法和函数的实现,用于解决科学计算中的一些标准问题.例如数值积分和微分方程求解,扩展的矩阵计算,最优化,概率分布和统计函数,甚 ...
- scikit-learn(1) 第一个例子说明
第一个 scikit-learn例子 ................................................................................. ...
- .net core(c#)拟合圆测试
说明 很多时候,我们需要运动物体的转弯半径去描述其机器性能.但在大多数的现实条件下,我们只能够获取到运动物体的 GPS 位置点集,并不能直接得到转弯半径或者圆心位置.为此,我们可以利用拟合圆的方式得到 ...
随机推荐
- zabbix 主动模式下报文分析
获取监控项列表 客户端发起请求 3次握手之后,请求监控项列表: {"request":"active checks","host":&quo ...
- 用 Rust 生成 Ant-Design Table Columns
经常开发表格,是不是已经被手写Ant-Design Table的Columns整烦了? 尤其是ToB项目,表格经常动不动就几十列.每次照着后端给的接口文档一个个配置,太头疼了,主要是有时还会粘错就尴尬 ...
- 【go语言】2.4.2 自定义包的创建和使用
在 Go 中,任何一个目录都可以被视为一个包.创建自定义包的基本步骤是: 新建一个目录,用于存放包的源文件. 在新建的目录中编写 Go 代码,代码的第一行应该是 package 包名. 使用 impo ...
- AttributeError:module‘win32com.gen_py has no attribute ‘CLSIDToClassMap‘
解决方案如下: 1. 运行如下代码,找到文件所在位置 from win32com.client.gencache import EnsureDispatch import sys xl = Ensur ...
- JSONP前端流程
JSONP前端流程 JSONP总体思路 后端先给前端一个接口文档. 如https://www.baidu.com/sugrec?prod=pc&wd=用户输入的文字&cb=后端要调用的 ...
- 加密解决HTTP协议带来的安全问题
HTTP协议默认是采取明文传输的,容易被中间人窃听.拦截.篡改,存在安全隐患. 常见提高安全性的方法是对通信内容进行加密,再进行传输,常见的加密方式有 不可逆加密:单向散列函数 可逆加密:对称加密.非 ...
- react中使用动画 react-transition-group
在React中通过react-transition-group使用过渡.动画,首先要有CSS3中的过渡和动画的相关知识储备,可以参考 过渡和2D变换.动画和3d变换. 我们自己通过css设置过渡.动画 ...
- .net开发-心情与效率
随着现代科技的不断发展,笔记本电脑已经成为我们日常生活中不可或缺的一部分.然而,在使用笔记本电脑的过程中,我们可能会遇到一些问题,例如显示器闪烁.HDMI接口接触不良等,这些问题不仅会影响我们的工作效 ...
- 古早wp合集
0x00 首先非常感谢大家阅读我的第一篇.本文章不仅仅是题解,一些细枝末节的小问题也欢迎大家一起解答. 小问题的形式如Qx:xxxxxxx? 欢迎发现小问题并讨论~~ N1nE是本人另外一个名字,目前 ...
- 《深入理解Java虚拟机》读书笔记:字节码指令简介
字节码指令简介 Java虚拟机的指令由一个字节长度的.代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成.由于Jav ...