基于GM(0,N)的时间序列预测R实现
来源:互联网 发布:mac流程图制作软件 编辑:程序博客网 时间:2024/05/01 09:03
基于GM(0,N)的时间序列预测R实现
本人新手数据分析师一枚,最近由于工作原因,需要使用灰色预测GM(0,N)模型进行预测分析,但是在网上搜基本没有搜到相关的R代码,只能自己根据灰色预测GM(0,N)理论进行编写,这里主要介绍灰色预测GM(0,N)模型的两种参数估计的R代码实现。
数据说明
预测目标:x7
训练集:traindata
传统GM(0,N)模型参数估计R代码实现(累加法)
R实现
# 累加法gm0n = function(data, factor){ data1 = data[, -1] m = length(data1) h = length(factor) obje = cumsum(factor) data1 = cumsum(data1) Y = as.matrix(obje[2:h]) data1 = data1[, -m] data1$hr = c(rep(1, h)) B = as.matrix(data1[-1,]) uk = solve(t(B)%*%B)%*%t(B)%*%Y uk2 = matrix(uk, ncol = 1) yc = c() ycr = c() for(r in 1:h){ ak = c() for(i in 1:(m-1)){ ak[i] = uk2[i]*data1[r, i] yc[r] = sum(ak) } } ycr = c(ycr, yc) ycr = ycr + uk2[m] yc1 = c() yc1[1] = ycr[1] for(l in 2:h){ yc1[l] = ycr[l]-ycr[l-1] } percent = 100 * abs(yc1 - factor) / factor precent_mean = mean(percent) residual = yc1 - factor fit = NULL fit$percent = percent fit$precent_mean = precent_mean fit$residual = residual fit$predict = yc1 fit$uk2 = uk2 cat("相对误差 =", percent, '\n', '\n') cat("残差 =", residual, '\n', '\n') cat("平均相对误差 =", precent_mean, "%", '\n', '\n') cat("相对精度 =", 100-precent_mean, "%", '\n', '\n') cat("预测值 =", yc1, '\n') a = data$year plot(yc1, col = 'red', type = 'b', ylim = c(0.6*max(c(yc1, factor)), 1.1*max(c(yc1, factor))), pch = 16, xlab = '时间', ylab = '', xaxt = "n") points(factor, col = 'blue', type = 'b', pch = 4) legend('topright',c('预测值', '真实值'), pch = c(16, 4), col = c('red', 'blue'), bty = "n") axis(1, at = 1:length(a), labels = a) yc1 fit}fit1 = gm0n(traindata, traindata$x7)
预测结果:训练集traindata预测精度99.23%
traindata预测结果:
累乘法参数估计R代码实现
R实现
# 累乘法gm0n = function(data, factor){ data1 = data[, -1] data1 = cumsum(data1) obje = cumsum(factor) m = length(data1) h = length(factor) bkr = c() for(g in 1:(m-1)){ bk = c() for(j in 1:m){ ak = c() for(k in 1:h){ ak[k] = choose(h-k+j-1, j-1)*(data1[, g][k]) bk[j] = sum(ak) } } bkr = c(bkr, bk) } Bk = matrix(c(bkr, rep(1, m)), nrow = m, ncol = m, byrow = F) yk = c() for(j in 1:m){ ak1 = c() for(k in 1:h){ ak1[k] = choose(h-k+j-1, j-1)*(obje[k]) yk[j] = sum(ak1) } } Yk = matrix(yk, nrow = m, ncol = 1, byrow = F) #uk = solve(t(Bk)%*%Bk)%*%t(Bk)%*%Yk uk = solve(Bk)%*%Yk uk2 = matrix(uk, ncol = 1) yc = c() ycr = c() for(r in 1:h){ ak = c() for(i in 1:(m-1)){ ak[i] = uk2[i]*data1[r, i] yc[r] = sum(ak) } } ycr = c(ycr, yc) ycr = ycr + uk2[m] yc1 = c() yc1[1] = ycr[1] for(l in 2:h){ #运用后减运算还原得模型输入序列x0预测序列 yc1[l] = ycr[l]-ycr[l-1] } percent =-= 100 * abs(yc1 - factor) / factor # 计算相对误差 precent_mean = mean(percent) # 计算平均相对误差 residual = yc1 - factor # 计算残差序列 fit = NULL fit$percent = percent fit$precent_mean = precent_mean fit$residual = residual fit$predict = yc1 fit$uk2 = uk2 cat("相对误差 =", percent, '\n', '\n') cat("残差 =", residual, '\n', '\n') cat("平均相对误差 =", precent_mean, "%", '\n', '\n') cat("相对精度 =", 100-precent_mean, "%", '\n', '\n') cat("预测值 =", yc1, '\n') #画出序列预测值、真实值图像 a = data$year plot(yc1, col = 'red', type = 'b', main = '预测值与实际值对比', ylim = c(0.6*max(c(yc1, factor)), 1.1*max(c(yc1, factor))), pch = 16, xlab = '时间', ylab = '', xaxt = "n") points(factor, col = 'blue', type = 'b', pch = 4) legend('topright',c('预测值', '真实值'), pch = c(16, 4), col = c('red', 'blue'), bty = "n") axis(1, at = 1:length(a), labels = a) yc1 fit}fit1 = gm0n(traindata, traindata$x7)
预测结果:训练集traindata预测精度98.27%
traindata预测结果:
两个参数估计方法最终的预测结果没有太大的差别,预测精度都达到95%以上,当建立完模型之后,可采用下列函数直接进行预测
# 预测函数predict = function(data, uk){ data1 = data[, -1] data1 = cumsum(data1) yc = c() ycr = c() for(r in 1:length(data1[,1])){ ak = c() for(i in 1:length(data1)){ ak[i] = uk[i]*data1[r, i] yc[r] = sum(ak) } } ycr = c(ycr, yc) ycr = ycr + uk[length(uk)] yc1 = c() yc1[1] = ycr[1] for(l in 2:length(data1[, 1])){ #运用后减运算还原得模型输入序列x0预测序列 yc1[l] = ycr[l]-ycr[l-1] } yc1}testdata = subset(traindata, select = -x7)fit2 = predict(testdata, fit1$uk2)
由于本人经验有限,如有不足之处请指正,谢谢!
阅读全文
0 0
- 基于GM(0,N)的时间序列预测R实现
- 基于WEKA实现时间序列的预测
- R & ARIMA 时间序列预测
- 基于时间序列的用户行为预测
- 基于时间序列的用户预测模型
- 基于时间序列模型的预测
- 灰色预测GM(1,1)模型实现IML & R
- 灰色系统预测模型GM(1,1),GM(1,n)及Matlab实现
- 基于小波变换的时间序列预测,Python实现,来自雪球,
- R:预测离散值时间序列
- R语言-时间序列-销量预测
- 基于时间序列的股票趋势预测模型
- 基于小波变换的时间序列预测
- 基于Keras的LSTM多变量时间序列预测
- 时间序列的R语言实现_Part1
- 时间序列的R语言实现_Part2
- 时间序列的R语言实现_Part3
- 基于时间序列的短期数据预测--ARMA模型的设计与实现(每个步骤附实现源码)
- Python3 安装 mysql-python 与ImportError: No module named 'ConfigParser'报错解决方法
- 数据库事务的四大特性以及事务的隔离级别
- 彩色图像--色彩空间 HSI(HSL)、HSV(HSB)
- 电表芯片调试笔记记录
- 第一次服务器上搭建网站
- 基于GM(0,N)的时间序列预测R实现
- 关于spring boot自动注入出现Consider defining a bean of type 'xxx' in your configuration问题解决方案
- Exception: Java gateway process exited before sending the driver its port number
- xcode9 上传项目报错 iTunes Store Operation Failed Missing required icon file. The bundle does not contain
- Android Studio如何创建自己的library,供别人使用?
- springmvc转换json数据
- java中Vector的实现
- Spring Boot整合RabbitMQ实例
- 简述TCP的三次握手过程