翼度科技»论坛 编程开发 python 查看内容

【scipy 基础】--正交距离回归

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
Scipy的ODR正交距离回归(ODR-Orthogonal Distance Regression)模块,适用于回归分析时,因变量和自变量之间存在非线性关系的情况。
它提高了回归分析的准确性和稳健性。对于需要解决非线性回归问题的科研人员和工程师来说,它具有非常重要的意义。
ODR正交距离回归模块的作用主要在于它将正交化方法和距离回归结合起来,解决了传统线性回归模型在处理非线性问题时的局限性。它通过将自变量进行正交化处理,使得因变量和自变量之间的非线性关系能够更好地被拟合出来。
1. 主要功能

scipy.odr模块针对的领域比较明确,所以不像之前介绍的模块有那么多函数。
此模块的主要函数包括:
函数名说明Data要拟合的数据RealData数据的权重为实际标准差和/或协方差ModelModel 类存储有关您希望拟合的函数的信息ODRODR 类收集所有信息并协调主要拟合例程的运行Output输出类存储 ODR 运行的输出其他函数调整拟合和模型的一些函数一般来说,使用前5个函数,就可以进行一些正交距离回归分析。
2. 使用示例

正交距离分析一般步骤如下:

2.1. 准备数据

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

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

2.2. 创建模型

使用scipy.odr模块中的Model函数创建一个拟合的模型。
  1. import scipy.odr as sodr
  2. # 模型函数
  3. def model_func(p, x):
  4.     k, b = p
  5.     return k * x + b
  6. model = sodr.Model(model_func)
复制代码
2.3. 生成数据

将上面的人口数据data转换为可以用于ODR运算的数据。
  1. # x是数据
  2. x = range(len(data))
  3. # 转换数据用RealData或者Data函数都可以
  4. rdata = sodr.RealData(x, data["value"])
  5. # rdata = sodr.Data(x, data["value"])
复制代码
Data和RealData函数都是用来构造数据的。
一般来说,Data函数用来构造理论数据;
RealData函数用来构造实际数据的,且RealData中还可以设置权重。
这里没有设置权重,用哪个函数都可以。
2.4. ODR运算

有了数据和模型之后,就可以进行ODR运算了。
  1. odr = sodr.ODR(rdata, model, beta0=[0, 1])
  2. result = odr.run()
  3. result.pprint()
  4. # 运行结果:
  5. Beta: [  61.01340781 6724.77566283]
  6. Beta Std Error: [ 1.11208495 19.3974215 ]
  7. Beta Covariance: [[  1.51592414 -22.73886321]
  8. [-22.73886321 461.20026764]]
  9. Residual Variance: 0.8158277156001223
  10. Inverse Condition #: 0.2520617152422754
  11. Reason(s) for Halting:
  12.   Sum of squares convergence
复制代码
其中 Beta 和 Beta Std Error就拟合的参数值和参数的标准差。
2.5. 输出结果

根据计算结果,绘制出图形更容易理解。
  1. # 拟合参数和参数的标准差
  2. beta = result.beta
  3. beta_std = result.sd_beta
  4. # 拟合的曲线
  5. y = beta[0] * x + beta[1]
  6. # 拟合曲线的标准差上限
  7. y_up = (beta[0] + beta_std[0]) * x + (beta[1]+ beta_std[1])
  8. # 拟合曲线的标准差下限
  9. y_down = (beta[0] - beta_std[0]) * x + (beta[1] - beta_std[1])
  10. # 绘制拟合的曲线
  11. ax = plt.subplot()
  12. ax.scatter(data["year"], data["value"], marker='*', color='r')
  13. ax.xaxis.set_major_locator(MultipleLocator(5))
  14. ax.set_title("江苏省人口变化")
  15. ax.plot(x, y, color="b", label="拟合曲线")
  16. ax.plot(x, y_up, color="y", label="标准差上限")
  17. ax.plot(x, y_down, color="g", label="标准差下限")
  18. plt.legend()
  19. plt.show()
复制代码

这就是通过ODR模块拟合的人口变化情况。
3. 总结

ODR正交距离回归之所以作为Scipy的单独模块,是因为它是一种特殊的曲线拟合方法,
它使用正交化和距离加权的最小二乘法来处理具有非线性关系的输入变量,并旨在找到最优的模型以最小化预测误差。
这与一般的曲线拟合在方法和目标上有很大的不同。
后续介绍Scipy库中的其他模块时,还会介绍其他的曲线拟合函数,到时候可以和这里的ODR方法对照比较一下。

来源:https://www.cnblogs.com/wang_yb/p/17835498.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具