python实现门限回归

2023-10-20 05:10
文章标签 python 实现 回归 门限

本文主要是介绍python实现门限回归,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

门限回归模型(Threshold Regressive Model,简称TR模型或TRM)的基本思想是通过门限变量的控制作用,当给出预报因子资料后,首先根据门限变量的门限阈值的判别控制作用,以决定不同情况下使用不同的预报方程,从而试图解释各种类似于跳跃和突变的现象。其实质上是把预报问题按状态空间的取值进行分类,用分段的线性回归模式来描述总体非线性预报问题。多元门限回归的建模步骤就是确实门限变量、率定门限数L、门限值及回归系数的过程,为了计算方便,这里采用二分割(即L=2)说明模型的建模步骤。

基本步骤如下(附代码):

1.读取数据,计算预报对象与预报因子之间的互相关系数矩阵。

数据读取
#利用pandas读取csv,读取的数据为DataFrame对象
data = pd.read_csv('jl.csv')
# 将DataFrame对象转化为数组,数组的第一列为数据序号,最后一列为预报对象,中间各列为预报因子
data= data.values.copy()
# print(data)
# 计算互相关系数,参数为预报因子序列和滞时k
def get_regre_coef(X,Y,k):S_xy=0S_xx=0S_yy=0# 计算预报因子和预报对象的均值X_mean = np.mean(X)Y_mean = np.mean(Y)for i in  range(len(X)-k):S_xy += (X[i] - X_mean) * (Y[i+k] - Y_mean)for i in range(len(X)):S_xx += pow(X[i] - X_mean, 2)S_yy += pow(Y[i] - Y_mean, 2)return S_xy/pow(S_xx*S_yy,0.5)
#计算相关系数矩阵
def regre_coef_matrix(data):row=data.shape[1]#列数r_matrix=np.ones((1,row-2))# print(row)for i in range(1,row-1):r_matrix[0,i-1]=get_regre_coef(data[:,i],data[:,row-1],1)#滞时为1return r_matrix
r_matrix=regre_coef_matrix(data)
# print(r_matrix)
###输出###
#[[0.048979   0.07829989 0.19005705 0.27501209 0.28604638]]

 2.对相关系数进行排序,相关系数最大的因子作为门限元。

#对相关系数进行排序找到相关系数最大者作为门限元
def get_menxiannum(r_matrix):row=r_matrix.shape[1]#列数for i in range(row):if r_matrix.max()==r_matrix[0,i]:return i+1return -1
m=get_menxiannum(r_matrix)
# print(m)
##输出##第五个因子的互相关系数最大
#5

3.根据选取的门限元因子对数据进行重新排序。

#根据门限元对因子序列进行排序,m为门限变量的序号
def resort_bymenxian(data,m):data=data.tolist()#转化为列表data.sort(key=lambda x: x[m])#列表按照m+1列进行排序(升序)data=np.array(data)return data
data=resort_bymenxian(data,m)#得到排序后的序列数组

4.将排序后的序列按照门限元分割序列为两段,第一分割第一段1个数据,第二段n-1(n为样本容量)个数据;第二次分割第一段2个数据,第二段n-2个数据,一次类推,分别计算出分割后的F统计量并选出最大统计量对应的门限元的分割点作为门限值。

def get_var(x):return x.std() ** 2 * x.size  # 计算总方差
#统计量F的计算,输入数据为按照门限元排序后的预报对象数据
def get_F(Y):col=Y.shape[0]#行数,样本容量FF=np.ones((1,col-1))#存储不同分割点的统计量V=get_var(Y)#计算总方差for i in range(1,col):#1到col-1S=get_var(Y[0:i])+get_var(Y[i:col])#计算两段的组内方差和F=(V-S)*(col-2)/SFF[0,i-1]=F#此步需要判断是否通过F检验,通过了才保留F统计量return FF
y=data[:,data.shape[1]-1]
FF=get_F(y)
def get_index(FF,element):#获取element在一维数组FF中第一次出现的索引i=-1for item in FF.flat:i+=1if item==element:return i
f_index=get_index(FF,np.max(FF))#获取统计量F的最大索引
# print(data[f_index,m-1])#门限元为第五个因子,代入索引得门限值 121

5.以门限值为分割点将数据序列分割为两段,分别进行多元线性回归,此处利用sklearn.linear_model模块中的线性回归模块。再代入预报因子分别计算两段的预测值。

#以门限值为分割点将新data序列分为两部分,分别进行多元回归计算
def data_excision(data,f_index):f_index=f_index+1data1=data[0:f_index,:]data2=data[f_index:data.shape[0],:]return data1,data2
data1,data2=data_excision(data,f_index)
# 第一段
def get_XY(data):# 数组切片对变量进行赋值Y = data[:, data.shape[1] - 1]  # 预报对象位于最后一列X = data[:, 1:data.shape[1] - 1]#预报因子从第二列到倒数第二列return X, Y
X,Y=get_XY(data1)
regs=LinearRegression()
regs.fit(X,Y)
# print('第一段')
# print(regs.coef_)#输出回归系数
# print(regs.score(X,Y))#输出相关系数
#计算预测值
Y1=regs.predict(X)
# print('第二段')
X,Y=get_XY(data2)
regs.fit(X,Y)
# print(regs.coef_)#输出回归系数
# print(regs.score(X,Y))#输出相关系数
#计算预测值
Y2=regs.predict(X)
Y=np.column_stack((data[:,0],np.hstack((Y1,Y2)))).copy()
Y=np.column_stack((Y,data[:,data.shape[1]-1]))
Y=resort_bymenxian(Y,0)

6.将预测值和实际值按照年份序号从新排序,恢复其顺序,利用matplotlib模块做出预测值与实际值得对比图。

#恢复顺序
Y=resort_bymenxian(Y,0)
# print(Y.shape)
# 预测结果可视化
plt.plot(Y[:,0],Y[:,1],'b--',Y[:,0],Y[:,2],'g')
plt.title('Comparison of predicted and measured values',fontsize=20,fontname='Times New Roman')#添加标题
plt.xlabel('Years',color='gray')#添加x轴标签
plt.ylabel('Average traffic in December',color='gray')#添加y轴标签
plt.legend(['Predicted values','Measured values'])#添加图例
plt.show()

结果图:

所用数据:引自《现代中长期水文预报方法及其应用》汤成友 官学文 张世明 著

numx1x2x3x4x5y
196030830135231014980.5
19611821861651277042.9
1962195134134976143.9
196313637833430714887.4
196423063033216110066.6
196522533320936515282.9
1966296225317527228111
196732422917631715379.3
196827823035231714382
1969662442453381188103
197018713610312974.743
197128440460032716192.2
1972427430843448236144
197325840463927515698.9
197411316012817777.250.1
197514330033321410663
19761137419324110758.6
19772041401549055.140.2
197817444535126712070.3
1979939519721494.964.3
198021425035438517873
198123267648321811372.6
198226621614611282.861.4
1983210433803301166115
198426170251229115397.5
198519717823818094.258.9
198644225662331014684.3
19871369925323211462
198825622618532115180.1
198947340930029814179.6
199027729163930214984.6
199137218117410468.858.4
19922511421269559.451.4
199318112513024012164
199425327821618212482.4
199516821426517510168.1
199698.89792.78856.745.6
199725238531327011978.8
199824219813711471.951.8
199926817812710968.653.3
200086.228623313377.858.6
20011501681229362.842.9
200218015097.87848.241.9
20031662031661247053.7
200440020212615892.754.7
200579.882.612916076.653.7

 

这篇关于python实现门限回归的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/244888

相关文章

Flutter实现文字镂空效果的详细步骤

《Flutter实现文字镂空效果的详细步骤》:本文主要介绍如何使用Flutter实现文字镂空效果,包括创建基础应用结构、实现自定义绘制器、构建UI界面以及实现颜色选择按钮等步骤,并详细解析了混合模... 目录引言实现原理开始实现步骤1:创建基础应用结构步骤2:创建主屏幕步骤3:实现自定义绘制器步骤4:构建U

使用Python创建一个功能完整的Windows风格计算器程序

《使用Python创建一个功能完整的Windows风格计算器程序》:本文主要介绍如何使用Python和Tkinter创建一个功能完整的Windows风格计算器程序,包括基本运算、高级科学计算(如三... 目录python实现Windows系统计算器程序(含高级功能)1. 使用Tkinter实现基础计算器2.

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

Python中模块graphviz使用入门

《Python中模块graphviz使用入门》graphviz是一个用于创建和操作图形的Python库,本文主要介绍了Python中模块graphviz使用入门,具有一定的参考价值,感兴趣的可以了解一... 目录1.安装2. 基本用法2.1 输出图像格式2.2 图像style设置2.3 属性2.4 子图和聚

Python使用Matplotlib绘制3D曲面图详解

《Python使用Matplotlib绘制3D曲面图详解》:本文主要介绍Python使用Matplotlib绘制3D曲面图,在Python中,使用Matplotlib库绘制3D曲面图可以通过mpl... 目录准备工作绘制简单的 3D 曲面图绘制 3D 曲面图添加线框和透明度控制图形视角Matplotlib

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

基于Python打造一个智能单词管理神器

《基于Python打造一个智能单词管理神器》这篇文章主要为大家详细介绍了如何使用Python打造一个智能单词管理神器,从查询到导出的一站式解决,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 项目概述:为什么需要这个工具2. 环境搭建与快速入门2.1 环境要求2.2 首次运行配置3. 核心功能使用指