python实现门限回归方式


Posted in Python onFebruary 29, 2020

门限回归模型(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=0
 S_xx=0
 S_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)#滞时为1
 return 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+1
 return -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-1
  S=get_var(Y[0:i])+get_var(Y[i:col])#计算两段的组内方差和
  F=(V-S)*(col-2)/S
  FF[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=-1
 for item in FF.flat:
  i+=1
  if 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+1
 data1=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()

结果图:

python实现门限回归方式

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

num x1 x2 x3 x4 x5 y
1960 308 301 352 310 149 80.5
1961 182 186 165 127 70 42.9
1962 195 134 134 97 61 43.9
1963 136 378 334 307 148 87.4
1964 230 630 332 161 100 66.6
1965 225 333 209 365 152 82.9
1966 296 225 317 527 228 111
1967 324 229 176 317 153 79.3
1968 278 230 352 317 143 82
1969 662 442 453 381 188 103
1970 187 136 103 129 74.7 43
1971 284 404 600 327 161 92.2
1972 427 430 843 448 236 144
1973 258 404 639 275 156 98.9
1974 113 160 128 177 77.2 50.1
1975 143 300 333 214 106 63
1976 113 74 193 241 107 58.6
1977 204 140 154 90 55.1 40.2
1978 174 445 351 267 120 70.3
1979 93 95 197 214 94.9 64.3
1980 214 250 354 385 178 73
1981 232 676 483 218 113 72.6
1982 266 216 146 112 82.8 61.4
1983 210 433 803 301 166 115
1984 261 702 512 291 153 97.5
1985 197 178 238 180 94.2 58.9
1986 442 256 623 310 146 84.3
1987 136 99 253 232 114 62
1988 256 226 185 321 151 80.1
1989 473 409 300 298 141 79.6
1990 277 291 639 302 149 84.6
1991 372 181 174 104 68.8 58.4
1992 251 142 126 95 59.4 51.4
1993 181 125 130 240 121 64
1994 253 278 216 182 124 82.4
1995 168 214 265 175 101 68.1
1996 98.8 97 92.7 88 56.7 45.6
1997 252 385 313 270 119 78.8
1998 242 198 137 114 71.9 51.8
1999 268 178 127 109 68.6 53.3
2000 86.2 286 233 133 77.8 58.6
2001 150 168 122 93 62.8 42.9
2002 180 150 97.8 78 48.2 41.9
2003 166 203 166 124 70 53.7
2004 400 202 126 158 92.7 54.7
2005 79.8 82.6 129 160 76.6 53.7

以上这篇python实现门限回归方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用正则表达式检测密码强度源码分享
Jun 11 Python
Python抓取淘宝下拉框关键词的方法
Jul 08 Python
Python求算数平方根和约数的方法汇总
Mar 09 Python
Python实现新浪博客备份的方法
Apr 27 Python
python字典多键值及重复键值的使用方法(详解)
Oct 31 Python
Python 通过requests实现腾讯新闻抓取爬虫的方法
Feb 22 Python
如何对python的字典进行排序
Jun 19 Python
Python字符串函数strip()原理及用法详解
Jul 23 Python
Python 在局部变量域中执行代码
Aug 07 Python
python获取命令行参数实例方法讲解
Nov 02 Python
Python代码覆盖率统计工具coverage.py用法详解
Nov 25 Python
python删除csv文件的行列
Apr 06 Python
Python3.9又更新了:dict内置新功能
Feb 28 #Python
python实现logistic分类算法代码
Feb 28 #Python
python GUI库图形界面开发之PyQt5打印控件QPrinter详细使用方法与实例
Feb 28 #Python
使用sklearn的cross_val_score进行交叉验证实例
Feb 28 #Python
彻底搞懂 python 中文乱码问题(深入分析)
Feb 28 #Python
python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例
Feb 28 #Python
python sklearn包——混淆矩阵、分类报告等自动生成方式
Feb 28 #Python
You might like
PHP 解决utf-8和gb2312编码转换问题
2010/03/18 PHP
php使用ereg验证文件上传的方法
2014/12/16 PHP
smarty的section嵌套循环用法示例
2016/05/28 PHP
PHP数据库处理封装类实例
2016/12/24 PHP
PHP中cookie知识点学习
2018/05/06 PHP
Laravel框架控制器,视图及模型操作图文详解
2019/12/04 PHP
Javascript中的Split使用方法与技巧
2007/03/09 Javascript
jquery获取input的value问题说明
2010/08/19 Javascript
js中Math之random,round,ceil,floor的用法总结
2013/12/26 Javascript
七个不允许错过的jQuery小技巧
2015/12/21 Javascript
使用json来定义函数,在里面可以定义多个函数的实现方法
2016/10/28 Javascript
Bootstrap源码学习笔记之bootstrap进度条
2016/12/24 Javascript
nodejs中实现用户注册路由功能
2019/05/20 NodeJs
js+springMVC 提交数组数据到后台的实例
2019/09/21 Javascript
浅谈vue中resetFields()使用注意事项
2020/08/12 Javascript
基于Vue.js+Nuxt开发自定义弹出层组件
2020/10/09 Javascript
解决vue项目axios每次请求session不一致的问题
2020/10/24 Javascript
浅析VUE防抖与节流
2020/11/24 Vue.js
对于Python装饰器使用的一些建议
2015/06/03 Python
浅谈Python中函数的参数传递
2016/06/21 Python
使用python遍历指定城市的一周气温
2017/03/31 Python
最近Python有点火? 给你7个学习它的理由!
2017/06/26 Python
python微信跳一跳系列之棋子定位颜色识别
2018/02/26 Python
django框架之cookie/session的使用示例(小结)
2018/10/15 Python
Python二进制文件读取并转换为浮点数详解
2019/06/25 Python
python+pygame实现坦克大战
2019/09/10 Python
python实现12306登录并保存cookie的方法示例
2019/12/17 Python
Python如何使用队列方式实现多线程爬虫
2020/05/12 Python
Python3读写ini配置文件的示例
2020/11/06 Python
HTML5利用约束验证API来检查表单的输入数据的代码实例
2016/12/20 HTML / CSS
lululemon美国官网:瑜伽服+跑步装备
2018/11/16 全球购物
Goodee官方商店:迷你投影仪
2021/03/15 全球购物
教师实习自我鉴定
2013/12/11 职场文书
大学四年规划书范文
2013/12/27 职场文书
《恐龙》教学反思
2014/04/27 职场文书
院党委组织查摆问题对照检查材料思想汇报2014
2014/10/08 职场文书