数学建模:ARMA时间序列预测

🔆 文章首发于我的个人博客:欢迎大佬们来逛逛

ARMA预测

时间序列是按时间顺序的一组数字序列
时间序列的特点:

  • 现实的、真实的一组数据,时间序列背后是某一现象的变化规律,时间序列预测就是学习之前的规律来预测后面的值

算法流程

  1. 判断时间序列数据是否平稳,若非平稳需要做差分处理
  2. 判断适合时间序列的模型,以及进行模型定阶
  3. 参数估计,产生模型
  4. 利用模型进行预测,评估预测结果
  5. 可选:绘制预测图像

代码实现(1)

预测指定的 L 个数据。

function [ret_predict] = mfunc_ARMA_L(trainData,L)% ARMA预测% params: %       trainData: 训练原始数据 Shape: (1,n)%       L:         预测数据个数 % returns:%       predict:   预测的值 Shape:(1,L)% 判断时间序列数据是否平稳 1代表平稳,0代表不平稳is_stable = adftest(trainData);if is_stable == 1disp("时间序列数据平稳.");elsedisp("时间序列数据不平稳,正在进行差分处理!");diff_trainData = diff(trainData); % 进行差分处理disp("差分处理完成!");end% 利用自相关图和偏相关图判断模型类型和阶次figure(1)autocorr(diff_trainData) %绘制自相关函数 -> MA[ACF,Lags,Bounds]=autocorr(trainData);figure(2)parcorr(diff_trainData) %绘制偏相关函数 -> AR% 自相关和偏相关函数难以判断时可以用AIC准则求出最好阶数%确定阶数的上限lim=round(length(trainData)/10); %数据总长度的1/10if lim>=10lim=10;%如果数据太长了,就限定阶数endid_trainData=iddata(trainData');%saveData=[];for p=1:limfor q=1:limnum=armax(id_trainData,[p,q]);  %armax对应FPE最小AIC=aic(num);   %AIC可以衡量阶数好不好saveData=[saveData;p q AIC];   hotMatrix(p,q)=AIC;endend%AIC越小越好% 绘制阶数热力图figure(3)for i=1:limy_index(1,i)={['AR' ,num2str(i)]};x_index(1,i)={['MA' ,num2str(i)]};endH = heatmap(x_index,y_index, hotMatrix, 'FontSize',12, 'FontName','宋体');H.Title = 'AIC定阶热力图'; %AIC越小越好% 利用阶数得到模型min_index=find(saveData(:,3)==min(saveData(:,3)));p_best=saveData(min_index,1);  %p的最优阶数q_best=saveData(min_index,2);  %q的最优阶数model = armax(id_trainData,[p_best,q_best]);% 利用模型预测,对划分的测试集测试% L=length(testData); 参数中给出 pre_data=[diff_trainData';zeros(L,1)];pre_data1=iddata(pre_data);  % 做成时间序列预测pre_data2=predict(model,pre_data1,L);pre_data3=get(pre_data2);%得到结构体pre_data4=pre_data3.OutputData{1,1}(length(diff_trainData)+1:length(diff_trainData)+L);%从结构体里面得到数据%显示全部data1=[diff_trainData';pre_data4];%全部的差分值if is_stable==0 %非平稳时进行差分还原data_pre1=cumsum([trainData(1);data1]);%还原差分值elsedata_pre1=data1;end% 最终预测data_pre2=data_pre1(length(trainData)+1:end);%最终预测值figure(4)plot(1:length(trainData),trainData,'--','LineWidth',1)hold onplot(length(trainData)+1:length(trainData)+L,data_pre2,'--','LineWidth',1.5)hold onxlabel('time')ylabel('price')legend('真实值','预测值')ret_predict = data_pre2; % 返回值
end

代码实现(2)

输入一个 test测试真实值,检查预测值与真实值的相似度。

function [ret_predict] = mfunc_ARMA(trainData,testData)% ARMA预测% params: %       trainData: 训练原始数据 Shape: (1,n)%       testData:  测试比较数据 Shape(1,L)% returns:%       predict:   预测的值 Shape:(1,L)% 判断时间序列数据是否平稳 1代表平稳,0代表不平稳is_stable = adftest(trainData);if is_stable == 1disp("时间序列数据平稳.");elsedisp("时间序列数据不平稳,正在进行差分处理!");diff_trainData = diff(trainData); % 进行差分处理disp("差分处理完成!");end% 利用自相关图和偏相关图判断模型类型和阶次figure(1)autocorr(diff_trainData) %绘制自相关函数 -> MA[ACF,Lags,Bounds]=autocorr(trainData);figure(2)parcorr(diff_trainData) %绘制偏相关函数 -> AR% 自相关和偏相关函数难以判断时可以用AIC准则求出最好阶数%确定阶数的上限lim=round(length(trainData)/10); %数据总长度的1/10if lim>=10lim=10;%如果数据太长了,就限定阶数endid_trainData=iddata(trainData');%saveData=[];for p=1:limfor q=1:limnum=armax(id_trainData,[p,q]);  %armax对应FPE最小AIC=aic(num);   %AIC可以衡量阶数好不好saveData=[saveData;p q AIC];   hotMatrix(p,q)=AIC;endend%AIC越小越好% 绘制阶数热力图figure(3)for i=1:limy_index(1,i)={['AR' ,num2str(i)]};x_index(1,i)={['MA' ,num2str(i)]};endH = heatmap(x_index,y_index, hotMatrix, 'FontSize',12, 'FontName','宋体');H.Title = 'AIC定阶热力图'; %AIC越小越好% 利用阶数得到模型min_index=find(saveData(:,3)==min(saveData(:,3)));p_best=saveData(min_index,1);  %p的最优阶数q_best=saveData(min_index,2);  %q的最优阶数model = armax(id_trainData,[p_best,q_best]);% 利用模型预测,对划分的测试集测试L=length(testData); pre_data=[diff_trainData';zeros(L,1)];pre_data1=iddata(pre_data);  % 做成时间序列预测pre_data2=predict(model,pre_data1,L);pre_data3=get(pre_data2);%得到结构体pre_data4=pre_data3.OutputData{1,1}(length(diff_trainData)+1:length(diff_trainData)+L);%从结构体里面得到数据%显示全部data1=[diff_trainData';pre_data4];%全部的差分值if is_stable==0 %非平稳时进行差分还原data_pre1=cumsum([trainData(1);data1]);%还原差分值elsedata_pre1=data1;end% 最终预测data_pre2=data_pre1(length(trainData)+1:end);%最终预测值figure(4)subplot(2,1,1)plot(1:length(trainData),trainData,'--','LineWidth',1)hold onplot(length(trainData)+1:length(trainData)+L,testData,'--','LineWidth',1.5)hold onplot(length(trainData)+1:length(trainData)+L,data_pre2,'--','LineWidth',1.5)hold onxlabel('time')ylabel('price')legend('真实值','测试数据真实值','预测值')ret_predict = data_pre2; % 返回值wucha=sum(abs(data_pre2'-testData)./testData)./length(data_pre2);title_str=['ARMA法','  预测相对误差为:',num2str(wucha)];title(title_str)subplot(2,1,2)plot(1:L,testData,'--o','LineWidth',1.5)hold onplot(1:L,data_pre2,'--*','LineWidth',1.5)hold onxlabel('time')ylabel('price')legend('真实值','预测值')title_str=['ARMA法','  预测相对误差为:',num2str(wucha)];title(title_str)
end

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

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

相关文章

从零开始学习 Java:简单易懂的入门指南之查找算法及排序算法(二十)

查找算法及排序算法 常见的七种查找算法:1. 基本查找2. 二分查找3. 插值查找4. 斐波那契查找5. 分块查找6. 哈希查找7. 树表查找 四种排序算法:1. 冒泡排序1.1 算法步骤1.2 动图演示1.3 代码示例 2. 选择排序2.1 算法步骤2.2 动图演示 3. 插入排序3.1 算…

knife4j 整合 springboot

官方文档:https://doc.xiaominfo.com/knife4j 版本兼容说明:https://doc.xiaominfo.com/docs/quick-start/start-knife4j-version 升级说明:https://doc.xiaominfo.com/docs/upgrading/upgrading-to-v4版本兼容惯关系: springboot…

MySQL一行记录是如何存储的?

目录 MySQL的数据存放在哪个文件? 表空间文件的结构是怎么样的? 1、行(row) 2、页(page) 3、区(extent) 4、段(segment) InnoDB 行格式有哪些&#xf…

解读亚马逊云科技语义搜图检索方案

图像检索(包括文搜图和图搜图)是各个行业中常见的一个应用场景。比如在电商场景中,基于以图搜图做相似商品查找;在云相册场景中,基于文搜图来找寻所需的图像素材。 传统基于标签的图像检索方式,即先使用目标…

博流RISC-V芯片Eclipse环境搭建

文章目录 1、下载 Eclipse2、导入 bouffalo_sdk3、编译4、烧录5、使用ninja编译 之前编译是通过 VSCode 编译,通过手工输入 make 命令编译,我们也可以通过 Eclipse 可视化 IDE 来编译、烧录。 1、下载 Eclipse 至 Eclipse 官网 https://www.eclipse.org…

【Golang】go交叉编译

交叉编译是用来在一个平台上生成另一个平台的可执行程序 。Go 命令集是原生支持交叉编译的。 Mac下编译:Linux 或 Windows 的可执行程序 # linux 可执行程序 CGO_ENABLED0 GOOSlinux GOARCHamd64 go build main.go # Windows可执行程序 CGO_ENABLED0 GOOSwindow…

网络socket服务器开发几种并发模型详解

目录 一、socket创建流程。 二、I/O多路复用 三、服务器开发常见的并发模型 1、模型一:单线程——无IO复用 1.1 模型分析 2、模型二:单线程accept + 多线程读写业务(无IO复用) 模型分析 3、模型三:单线程多路IO复用 模型分析 4、模型四࿱

【微服务部署】02-配置管理

文章目录 1.ConfigMap1.1 创建ConfigMap方式1.2 使用ConfigMap的方式1.3 ConfigMap使用要点建议 2 分布式配置中心解决方案2.1 什么时候选择配置中心2.2 Apollo配置中心系统的能力2.2.1 Apollo创建配置项目2.2.2 项目使用2.2.3 K8s中使用Apollo 1.ConfigMap ConfigMap是K8s提供…

【第1章 数据结构概述】

目录 一. 基本概念 1. 数据、数据元素、数据对象 2. 数据结构 二. 数据结构的分类 1. 数据的逻辑结构可分为两大类:a. 线性结构;b. 非线性结构 2. 数据的存储结构取决于四种基本的存储方法:顺序存储、链接存储、索引存储、散列存储 3. …

iMX6ULL 库移植 | Libgpiod 库的交叉编译及使用指南(linux)

GPIO口的操作,是很常见的功能。传统的GPIO sysfs接口已被弃用。自Linux 4.8起,内核提供了全新的操作gpio的方式libgpiod(C library and tools for interacting with the linux GPIO character device),当然也更高效&am…

大数据Flink简介与架构剖析并搭建基础运行环境

文章目录 前言Flink 简介Flink 集群剖析Flink应用场景Flink基础运行环境搭建Docker安装docker-compose文件编写创建并运行容器访问Flink web界面 前言 前面我们分别介绍了大数据计算框架Hadoop与Spark,虽然他们有的有着良好的分布式文件系统和分布式计算引擎,有的有…

电脑识别不了固态硬盘怎么办?

在使用固态硬盘时,可能会出现电脑无法识别的情况,这时我们就无法使用固态硬盘中的数据。那么,电脑识别不了固态硬盘怎么办? 为什么电脑识别不了固态硬盘? 一般来说,电脑识别不了固态硬盘是因为以下3个原因…

软件工程(八) UML之类图与对象图

1、类图与对象图 1.1、类图与对象图的概念 类图(class diagram)描述一组类、接口、协作和它们之间的关系 对象图(object diagram)描述一组对象及它们之间的关系、对象图描述了在类图中所建立的事物实例的静态快照。 1.2、类图与对象图的区别 类图和对象图基本上是一样…

Python Opencv实践 - Canny边缘检测

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_GRAYSCALE) print(img.shape)#图像Canny边缘检测 #cv.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradien…

C++中组合使用多个 if…else 结构

C中组合使用多个 if…else 结构 需要根据多个条件执行不同任务时,嵌套 if 语句很有用,也可组合使用多个 if…else 结构。 C 中的 if…else if…else 语句的语法: if(boolean_expression 1) {// 当布尔表达式 1 为真时执行 } else if( bool…

python web 开发与 Node.js + Express 创建web服务器入门

目录 1. Node.js Express 框架简介 2 Node.js Express 和 Python 创建web服务器的对比 3 使用 Node.js Express 创建web服务器示例 3.1 Node.js Express 下载安装 3.2 使用Node.js Express 创建 web服务器流程 1. Node.js Express 框架简介 Node.js Express 是一种…

python进行压图操作

大家想不想使用python完成批量图片压logo的操作,今天我就来分享一下压图片的教程,喜欢的同学,一键三连呦下面的分享给大家的代码 from PIL import Imageclass PressurePic:def __init__(self):passdef remove_logo_black_background(self, i…

Spring boot中调用C/C++(dll)

添加JNA依赖 <dependency><groupId>net.java.dev.jna</groupId><artifactId>jna</artifactId><version>5.5.0</version> </dependency>准备C代码/C代码 如下是C代码&#xff0c;文件名&#xff1a;xizi.c #include <std…

Redis —— 设置密码

文章目录 Redis —— 设置密码简介需要修改两处1.命令行进入Redis进行密码修改2.修改Redis配置(redis.conf) 修改后重启redis Redis —— 设置密码 简介 没有密码&#xff0c;设置密码 需要修改两处 1.命令行进入Redis进行密码修改 # 首先登录到对应节点....... # 通过redi…

电子电路原理题目整理(1)

电子电路原理题目整理&#xff08;1&#xff09; 最近在学习《电子电路原理》&#xff0c;记录一下书后面试题目&#xff0c;答案为个人总结&#xff0c;欢迎讨论。 1.电压源和电流源的区别&#xff1f; 电压源在不同的负载电阻下可提供恒定的负载电压&#xff0c;而电流源对于…