【转载】预测算法--时间序列(ARIMA)模型

news/2024/4/29 3:16:54/文章来源:https://www.cnblogs.com/delehub/p/16678067.html

ARIMA:AutoregressiveIntegratedMovingAverage model。自回归差分移动平均模型(p,d,q),可以说AR自回归模型,MA移动平均模型,ARMA自回归移动平均模型都是ARIMA的特殊形式. 时间序列模型一般性步骤包括:1. 数据平稳性检验;2. 确定模型参数;3. 构建时间序列模型;4.模型预测;5.模型准确性评估。

1.平稳性检验

该模型要求时间序列必须是平稳的,所以第一步是对原始数据进行平稳性检验。

A. 直观观察数据

最直观的方式可以先做出序列图,看看数据是否平稳。例如

时间序列及其差分后的数据
clear all
clc
% 数据来源于网络
data=[10930,10318,10595,10972,7706,6756,9092,10551,9722,10913,11151,8186,6422 ...
6337,11649,11652,10310,12043,7937,6476,9662,9570,9981,9331,9449,6773,6304,9355 ...
10477,10148,10395,11261,8713,7299,10424,10795,11069,11602,11427,9095,7707,10767 ...
12136,12812,12006,12528,10329,7818,11719,11683,12603,11495,13670,11337,10232 ...
13261,13230,15535,16837,19598,14823,11622,19391,18177,19994,14723,15694,13248 ...
9543,12872,13101,15053,12619,13749,10228,9725,14729,12518,14564,15085,14722 ...
11999,9390,13481,14795,15845,15271,14686,11054,10395];
subplot(131)
plot(data,'b-','LineWidth',2)
xlabel('time')
ylabel('data')
set(gca,'fontsize',15)
subplot(132)
ddata = diff(data);
plot(ddata,'b-','LineWidth',2)
xlabel('time')
ylabel('data的一阶差分')
set(gca,'fontsize',15)
subplot(133)
dddata = diff(data,2);
plot(dddata,'b-','LineWidth',2)
xlabel('time')
ylabel('data的二阶差分')

set(gca,'fontsize',15)

从图中看上起原始序列是不稳定的,尤其是在t=50到70之间数据突然发生显著改变。因此我们需要对其差分,差分之后数据基本上平稳。当然全靠肉眼的判断和判断人的经验,不同的人看到同样的图形,很可能会给出不同的判断。因此这里也进一步需要更加数学的方法。

B. 数学方法计算(ADF单位根平稳型检验,KPSS检验等)

通常的检验方法有很多种,包括ADF、KPSS等。

out1 = adftest(data)

如果返回值out1=0,则拒绝原假设,说明数据是不平稳的; 如果结果out1=1,表示不拒绝原假设,数据平稳. 第二种检测

out1 = kpsstest(data)

对于kpss检验则相反。如果返回值out1=0,则不能拒绝原假设,说明数据是平稳的; 如果结果out1=1,表示拒绝原假设,数据不平稳. 以上两种方法可以结合使用,也可以使用其中一种就可以了。通过上面两种检验方法发现结果确实不稳定。

>> adftest(data)
ans =
logical
0
>> kpsstest(data)
ans =
logical
1

如果平稳性检测结果表明原始时间序列不平稳,那就需要此时对原始数据取差分,再进行检验。先 进行一阶差分,结果平稳就结束差分过程。如果依旧不平稳的话,再次求差分,直至通过检验。

ddata = diff(data);
d1_adf = adftest(ddata)
d1_kpss = kpsstest(ddata)

检验结果为

d1_adf =
logical
1
d1_kpss =
logical
0

最终得到d1_adf =1,d1_kpss =0通过检验。因此一阶差分之后的数据就可以进行时间序列建模分析了。由于进行了差分处理,最后的数据需要反差分回到原始数据。

2. 确定ARIMA模型阶数

经过平稳性检验后的数据就可以进行时间序列分析了。下面就是需要确定ARMA的参数p,q,d. 常用的方法就是通过自相关函数(ACF)与偏自相关函数(PACF)来确定。这里p与q就是下面公式中系数的阶数,d是差分阶数

A. 平稳时间序列的自相关图和偏自相关图。

第一步我们要先检查平稳时间序列的自相关图和偏自相关图。关于自相关函数与偏自相关函数的理论知识参加本文附录部分。p和q则可以根据自相关系数和偏自相关系数是否在某一阶截尾或者拖尾给出相应的值。

模型自相关偏自相关
ARIMA(p,d,0)逐渐减小到零P阶后减小到零
ARIMA(0,d,q)q阶后减小到零逐渐减小到零
ARIMA(p,d,q)逐渐减小到零逐渐减小到零

这里给出matlab中的用法,其中data是平稳化之后的时间序列数据。

% 绘制自相关与偏自相关图
% 这里要用一阶差分之后的数据绘图
figure
subplot(121)
autocorr(ddata)
set(gca,'fontsize',15)

subplot(122)
parcorr(ddata)
set(gca,'fontsize',15)

其中lags 表示滞后的阶数,以上分别得到acf 图和pacf 图。从检验分析知道,可以从自相关图确定q取值,从偏自相关图确定p取值。但是从上面这两个图好像没办法直观确定pq取值,貌似很多阶相关函数超过临界值。不过文献认为

1. 自相关图显示滞后有三个阶超出了置信边界(为什么是3,不是1阶就小于95%区间了吗)
2. 偏相关图显示在滞后1至7阶(lags 1,2,…,7)时的偏自相关系数超出了置信边界,从lag 7之后偏自相关系数值缩小至0
则有以下模型可以供选择:
A. ARMA(0,1)模型:即自相关图在滞后1阶之后缩小为0,且偏自相关缩小至0,则是一个阶数q=1的移动平均模型;
B. ARMA(7,0)模型:即偏自相关图在滞后7阶之后缩小为0,且自相关缩小至0,则是一个阶层p=3的自回归模型;
C. ARMA(7,1)模型:即使得自相关和偏自相关都缩小至零。则是一个混合模型。
D. 还可以有其他供选择的模型。我们通常采用ARMA模型的AIC法则。
* AIC=-2 ln(L) + 2 k 赤池信息量 akaike information criterion
* BIC=-2 ln(L) + ln(n)k :贝叶斯信息量 bayesian information criterion
HQ=-2 ln(L) + ln(ln(n))*k hannan-quinn criterion

下面就通过AIC与BIC准则确定pq取值

%% 计算pq取值
pmax = 4;
qmax = 4;
[p q ]=findPQ(ddata,pmax,qmax);

function [p q] = findPQ(data,pmax,qmax)
data = reshape(data,length(data),1);
LOGL=zeros(pmax+1,qmax+1);
PQ=zeros(pmax+1,qmax+1);
for p=0:pmax
for q=0:qmax
model=arima(p,0,q);
[fit,~,logL]=estimate(model,data); %指定模型的结构
LOGL(p+1,q+1)=logL;
PQ(p+1,q+1)=p+q; %计算拟合参数的个数
end
end
LOGL=reshape(LOGL,(pmax+1)(qmax+1),1);
PQ=reshape(PQ,(pmax+1)
(qmax+1),1);
m2 = length(data);
[aic,bic]=aicbic(LOGL,PQ+1,m2);
aic0 = reshape(aic,(pmax+1),(qmax+1));
bic0= reshape(bic,(pmax+1),(qmax+1));

aic1 = min(aic0(:));
index = aic1==aic0;
[pp qq] = meshgrid(0:pmax,0:qmax);
p0 = pp(index);
q0 = qq(index);

aic2 = min(bic0(:));
index = aic2==bic0;
[pp qq] = meshgrid(0:pmax,0:qmax);
p1 = pp(index);
q1 = qq(index);

if p0^2+q0^2> p1^2+q1^2
p = p1;
q = q1;
else
p = p0;
q = q0;
end

end

3. 构建模型

Mdl = arima(p, 1, q);  %第二个变量值为1,即一阶差分
EstMdl = estimate(Mdl,data);

4. 模型预测

[forData,YMSE] = forecast(EstMdl,step,'Y0',data);
lower = forData - 1.96sqrt(YMSE); %95置信区间下限
upper = forData + 1.96
sqrt(YMSE); %95置信区间上限

5. 附录

这里还想具体介绍一下autocorr函数更加一般性的用法。如果仅仅写代码下面更加详细分析可以忽略!!!

如果autocorr不写返回参数则直接会做关联函数的图形。

[ACF,Lags,Bounds] = autocorr(Series)

其中,输入项Series 代表单变量时间序列。返回自关联函数 (ACF)与对应的延迟lags,以及ACF的上下界限。

在函数输入中,还有几个可选项,分别说明如下:

[ACF,Lags, Bounds] = autocorr(Series, nLags,M, nSR)
  • 其中 nLags是正整数标量,表示需要计算的ACF的时间滞后步长(lag)。如果该参数缺省,则系统默认的时间滞后序列为0,1,2,...,T,这里T=minimum [20, length(Series)-1]。 这意味着,如果样本长度大于21,则T取20;如果样本长度小于20,则T取样本长度减1。
  • M为非负整数标量,表示最大有效时滞。M值不得超过nLags。理论上,如果时滞超过M,则ACF变得与0没有显著性差异。从ACF图来看,可以理解为误差上、下限开始标注的起始步长。
  • nSTDs为代表标准误差的倍数(正标量)。如果缺省,则系统默认nSTDs= 2,此时置信区间上、下限给出置信度为95%的二倍标准误差带。
  • 函数输出项包括三方面的结果:自相关函数(ACF)、时滞.(Lags)和置信范围上下限(Bounds)。具体说明如下:
  • ACF为时间序列样本的自相关函数,这是一个长度为nLags+1的向量,对应于时滞0,1 ,....nLags。其中,第一个数据点为对应于0时滞的单位数1,也就是说,ACF(1)=1。 当时滞为0时,序列与序列完全相关,故ACF值一定为1。
  • Lags为滞后向量(0,1, 2..... nLags), 一个Lags值对应于一个ACF值。
  • Bounds为二元向量,近似给出ACF置信范围的上限和下限,这个置信范围仅给出Lags> M的结果



clear all
clc
data=[10930,10318,10595,10972,7706,6756,9092,10551,9722,10913,11151,8186,6422 ...
6337,11649,11652,10310,12043,7937,6476,9662,9570,9981,9331,9449,6773,6304,9355 ...
10477,10148,10395,11261,8713,7299,10424,10795,11069,11602,11427,9095,7707,10767 ...
12136,12812,12006,12528,10329,7818,11719,11683,12603,11495,13670,11337,10232 ...
13261,13230,15535,16837,19598,14823,11622,19391,18177,19994,14723,15694,13248 ...
9543,12872,13101,15053,12619,13749,10228,9725,14729,12518,14564,15085,14722 ...
11999,9390,13481,14795,15845,15271,14686,11054,10395];
subplot(131)
plot(data,'b-','LineWidth',2)
xlabel('time')
ylabel('data')
set(gca,'fontsize',15)
subplot(132)
ddata = diff(data);
plot(ddata,'b-','LineWidth',2)
xlabel('time')
ylabel('data的一阶差分')
set(gca,'fontsize',15)
subplot(133)
dddata = diff(data,2);
plot(dddata,'b-','LineWidth',2)
xlabel('time')
ylabel('data的二阶差分')

set(gca,'fontsize',15)

% 数据平稳性测试
adftest(data)
kpsstest(data)

% 一阶差分并平稳性检验
ddata = diff(data);
d1_adf = adftest(ddata)
d1_kpss = kpsstest(ddata)

% 绘制自相关与偏自相关图
% 这里要用一阶差分之后的数据绘图
figure
subplot(211)
autocorr(ddata,40)
ylabel('ACF')
set(gca,'fontsize',15)

subplot(212)
parcorr(ddata,40)
ylabel('PACF')
set(gca,'fontsize',15)

%% 计算pq取值
pmax = 4;
qmax = 4;
d = 1;
%[p q ]=findPQ(data,pmax,qmax,d);

%% 构建模型
p = 3;q = 4;
Mdl = arima(p, 1, q); %第二个变量值为1,即一阶差分
EstMdl = estimate(Mdl,data');
%% 模型预测
step = 10;
[forData,YMSE] = forecast(EstMdl,step,'Y0',data');
%matlab2018及以下版本写为Predict_Y(i+1) = forecast(EstMdl,1,'Y0',Y(1:i));
lower = forData - 1.96sqrt(YMSE); %95置信区间下限
upper = forData + 1.96
sqrt(YMSE); %95置信区间上限
figure
plot(1:length(data),data)
hold on
plot((length(data)+1):length(data)+step,forData)
hold on
plot((length(data)+1):length(data)+step,lower)
plot((length(data)+1):length(data)+step,upper)

function [p q] = findPQ(data,pmax,qmax,d)
data = reshape(data,length(data),1);
LOGL=zeros(pmax+1,qmax+1);
PQ=zeros(pmax+1,qmax+1);
for p=0:pmax
for q=0:qmax
model=arima(p,d,q);
[fit,~,logL]=estimate(model,data); %指定模型的结构
LOGL(p+1,q+1)=logL;
PQ(p+1,q+1)=p+q; %计算拟合参数的个数
end
end
LOGL=reshape(LOGL,(pmax+1)(qmax+1),1);
PQ=reshape(PQ,(pmax+1)
(qmax+1),1);
m2 = length(data);
[aic,bic]=aicbic(LOGL,PQ+1,m2);
aic0 = reshape(aic,(pmax+1),(qmax+1));
bic0= reshape(bic,(pmax+1),(qmax+1));

aic1 = min(aic0(:));
index = aic1==aic0;
[pp qq] = meshgrid(0:pmax,0:qmax);
p0 = pp(index);
q0 = qq(index);

aic2 = min(bic0(:));
index = aic2==bic0;
[pp qq] = meshgrid(0:pmax,0:qmax);
p1 = pp(index);
q1 = qq(index);

if p0^2+q0^2> p1^2+q1^2
p = p1;
q = q1;
else
p = p0;
q = q0;
end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_6224.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32二十:OLED和LCD

一.概述 1.OLED介绍 1 //OLED的显存2 //存放格式如下.3 //[0]0 1 2 3 ... 127 4 //[1]0 1 2 3 ... 127 5 //[2]0 1 2 3 ... 127 6 //[3]0 1 2 3 ... 127 7 //[4]0 1 2 3 ... 127 8 //[5]0 1 2 3 ... 127 9 //[6]0 1 2 3 ... 127 10 //[7]0 1 2 3 ... 127 …

一.xv6环境搭建

内容大致来源:1.视频教程:https://space.bilibili.com/16765968/channel/collectiondetail?sid=86878 2.文档:https://tarplkpqsm.feishu.cn/docs/doccnoBgv1TQlj4ZtVnP0hNRETd#W8iZmH一.windows升级为专业版注意:docker支持Windows 10 操作系统专业版,所以要升级windows…

【ASP.NET Core】自定义Session的存储方式

在开始今天的表演之前,老周先跟大伙伴们说一句:“中秋节快乐”。 今天咱们来聊一下如何自己动手,实现会话(Session)的存储方式。默认是存放在分布式内存中。由于HTTP消息是无状态的,所以,为了让服务器能记住用户的一些信息,就用到了会话。但会话数据毕竟是临时性的,不…

MySQL-3-多表查询和事务(结合案例学习)

我们之前在讲解SQL语句的时候,讲解了DQL语句,也就是数据查询语句,但是之前讲解的查询都是单表查询,而本章节我们要学习的则是多表查询操作,主要从以下几个方面进行讲解。 多表查询多表查询多表关系分类连接查询内连接隐…

【数据结构】绪论

文章目录 1. 绪论 1.1 概述 1.2 数据与数据结构 1.2.1 术语 1.2.2 逻辑结构 1.2.3 存储结构: 1.2.4 数据操作: 1.3 算法 1.3.1 算法特性 1.3.2 算法目标 1.3.3 算法分析:概述 1.3.4 算法分析:时间复杂度(大…

Markdown笔记软件之 Obsidian

我使用过什么markdown笔记软件了解自己的需求 Markdown 语法简洁vscode内置 markdown 插件,预览等 snippet(摘要功能)自定义代码片段typero实时渲染,所见即所得 美观缺点不适合我个人 收费 不支持打标签 tag 放弃:解决不了我的痛点(全键盘),收费 不支持移动端joplin支持 v…

模拟用户登录功能的实现以及演示SQL注入现象

模拟用户登录功能的实现以及演示SQL注入现象 /* 实现功能:1、需求:模拟用户登录功能的实现。2、业务描述:程序运行的时候,提供一个输入的入口,可以让用户输入用户名和密码用户输入用户名和密码之后,提交信息…

Day07__面向对象

面向对象 什么是面向对象回顾方法的定义 package objectOriented;import java.io.IOException;//回顾方法的定义 public class Demo01 {public static void main(String[] args) {}public static String sayHello(){return "Hello,World!";}public int max(int a,int…

Deno 会取代NodeJS吗?

目标:了解Deno的学习价值和前景。 从下面几个维度进行分析 成熟度 Node已经在大量商业应用中,Deno只是还在商业试验阶段 生态 Node已经有丰富的生态,包含各种框架和库,并且都已经广泛应用Deno的框架和库基本上都是刚刚起步 学习成本 如果你已经了解Node,Deno也还是需要不…

基于蜜蜂算法求解电力系统经济调度(Matlab代码实现)

目录 1 蜜蜂优化算法 1.1 蜂群觅食机制 1.2 蜜蜂算法 1.3 流程 2 经济调度 3 运行结果 4 Matlab代码及文章 5 参考文献 6 写在最后 1 蜜蜂优化算法 蜜蜂算法( Bees Algorithm,BA) 由英国学者 AfshinGhanbarzadeh 和他的研究小组于 2005 年提出。该算法是一…

element table 列头和行高调整

1、行高调整<el-table :row-style="{height:0}"></el-table>2、列头高度调整<el-table :header-cell-style="{padding:0}" :row-style="{height:0}"></el-table>

都这麽大了还不了解防火墙?

目录 一、思考 二、实验 三、过程 1、实验拓扑 2、cloud-IO配置 3、防火墙配置 3.1 登录防火墙 4、区域划分 方法一 方法二 4.1 内网划分 4.2 各区域网关 4.3 区域配置 5、防火墙策略 5.1 允许-回程路由&#xff08;内网~外网&#xff09; 5.2 禁止-新建策略…

AI作画飞入平民百姓家——stable diffusion初体验

1. 前言 stable_diffusion来了&#xff0c;这个号称是最强的民用文本生成图片的模型它来了&#xff0c;相比较DAEE等大模型&#xff0c;它能够让我们消费级的显卡也能够实现文本到图像的生成。下面&#xff0c;我们也来试一下。 2. 准备过程 该服务器上必须要有的基础工具an…

[基于瑞芯微RV1126调试RTL8818FU WIFI模组支持STA和AP模式]

基于瑞芯微RV1126调试RTL8818FU WIFI模组支持STA和AP模式内核menuconfig配置内核dts配置文件系统配置和更改驱动编译wifi工具编译libnl库编译openssl编译wpa_supplicant编译hostapd编译开机运行脚本测试WIFI—STA模式运行脚本测试WIFI-AP模式内核menuconfig配置 CONFIG_NETFIL…

高光谱图像分类简述+《Deep Learning for Hyperspectral Image Classification: An Overview》综述论文笔记

论文题目《Deep Learning for Hyperspectral Image Classification: An Overview》 论文作者:Shutao Li, Weiwei Song, Leyuan Fang,Yushi Chen, Pedram Ghamisi,Jn Atli Benediktsson 论文发表年份:2019 一、高光谱简述高光谱成像是一项重要的遥感技术,它采集了从…

SQL server 2008 安装教程

SQL server 2008 安装教程 1. 安装 SQL server 2008 的主要步骤如下 1.1 点击 setup.exe1.2 选中 “安装”&#xff0c;并点击右边的 “全新 SQL sever 独立或向现有安装添加功能1.3 重启电脑&#xff0c;再找到安装程序 “setup.exe” 重复上面的步骤1.4 输入产品秘钥 “JD8Y…

The Art of Prompting: Event Detection based on Type Specific Prompts

Motivation之前的研究表明prompt可以提高模型在事件检测方面的性能,包括使用特定structure 使用每种事件类型特定的query 原型 trigger这些尝试启发对不同prompt效果的探究Settings 作者在3种setting下做了实验:Supervised event detection Few-shot Event detection两个数据…

对课上相关问题的研究和解答

问题一:从测试中看不足 1、JAVA的基本运行单位是类 2、类中由类变量和类方法共同组成 3、变量的类型相互之间存在可以转换的关系,具体来说,可以分为以下几种情况: 1、(byte、short、char)-int-long-float-double,从低级到高级的排序,数据类型可以直接由低级向高级转换 举…

SpringCloud微服务架构

什么是微服务 微服务架构的基础是将的那个应用程序开发为一组小型独立服务&#xff0c;这些独立服务在自己的进程中运行&#xff0c;独立开发和部署。 SpringCloud Alibaba微服务&#xff1a; Spring Cloud Alibaba 是Spring Cloud的一个子项目&#xff0c;致力于提供微服务…

9--RNN

有隐藏状态的循环神经网络 假设在时间步t有小批量输入&#xff0c;即对于n个序列样本的小批量&#xff0c;的每一行对应于来自该序列的时间步t处的一个样本&#xff0c;用表示时间步t的隐藏变量。与MLP不同的是&#xff0c; 我们在这里保存了前一个时间步的隐藏变量&#xff0c…