✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。
🍎 往期回顾关注个人主页:Matlab科研工作室
👇 关注我领取海量matlab电子书和数学建模资料
🍊个人信条:格物致知,完整Matlab代码获取及仿真咨询内容私信。
🔥 内容介绍
研究背景
- 实际应用需求:在许多领域,如能源、金融和气象等,存在大量多变量时序数据,这些变量相互关联,通过对其分析预测单个目标变量,能为决策提供依据,如根据天气、时间等多变量预测电力负荷,有助于电力系统调度。
- 传统方法的局限:传统时间序列预测方法,如 ARMA、ARIMA 等,难以捕捉多变量间复杂非线性关系和长距离依赖,在处理大规模多变量数据时性能不佳。
- Transformer 的优势:Transformer 凭借自注意力机制和并行计算能力,在自然语言处理和计算机视觉领域取得优异成绩,其能有效捕捉序列数据中的长程依赖关系,适合处理多变量时序数据,可挖掘变量间复杂关系,因而被引入多变量时序预测领域。
原理介绍
- 自注意力机制:是 Transformer 的核心,通过计算每个时间步与其他所有时间步的注意力权重,能同时考虑多个变量在不同时间步的相互影响,从而捕捉全局范围内的关联关系,有效建模多变量之间的非线性关联及其对输出的协同影响。
- 多头注意力机制:将输入分成多个子空间,在每个子空间中计算自注意力,然后将结果拼接。这增强了模型对不同类型关联的捕捉能力,使模型能从多个角度学习变量间的关系,提升预测准确性。
- 位置编码:由于多变量时序数据具有时间顺序,位置编码为输入序列添加位置信息,让模型能够感知时间顺序,从而更好地处理时序特征,有助于挖掘数据中的长短期时序规律。
- 编码器 - 解码器结构:通常采用编码器 - 解码器结构,编码器对多变量输入序列进行编码,提取特征,解码器根据编码器输出和已生成的输出序列(预测过程中逐步生成),生成最终的单输出预测结果,实现多输入单输出的预测功能。
⛳️ 运行结果
📣 部分代码
function [R,rmse,biaozhuncha,mae,mape]=calc_error(x1,x2)
%此函数用于计算预测值和实际(期望)值的各项误差指标
% 参数说明
%----函数的输入值-------
% x1:真实值
% x2:预测值
%----函数的返回值-------
% mae:平均绝对误差(是绝对误差的平均值,反映预测值误差的实际情况.)
% mse:均方误差(是预测值与实际值偏差的平方和与样本总数的比值)
% rmse:均方误差根(是预测值与实际值偏差的平方和与样本总数的比值的平方根,也就是mse开根号,
% 用来衡量预测值同实际值之间的偏差)
% mape:平均绝对百分比误差(是预测值与实际值偏差绝对值与实际值的比值,取平均值的结果,可以消除量纲的影响,用于客观的评价偏差)
% error:误差
% errorPercent:相对误差
if nargin==2
if size(x1,2)==1
x1=x1'; %将列向量转换为行向量
end
if size(x2,2)==1
x2=x2'; %将列向量转换为行向量
end
num=size(x1,2);%统计样本总数
error=x2-x1; %计算误差
x1(find(x1==0))=inf;
errorPercent=abs(error)./x1; %计算每个样本的绝对百分比误差
mae=sum(abs(error))/num; %计算平均绝对误差
mse=sum(error.*error)/num; %计算均方误差
rmse=sqrt(mse); %计算均方误差根
mape=mean(errorPercent); %计算平均绝对百分比误差
biaozhuncha=std(x2);
%结果输出
for i=1:size(x1,1)
tempdata=(x1(i,:)-x2(i,:)).^2;
tempdata2=(x1(i,:)-mean(x1(i,:))).^2;
R(i)=1 - ( sum(tempdata)/sum(tempdata2) );
% disp(['决定系数R为: ',num2str(R(i))])
end
disp(['标准差为: ',num2str(biaozhuncha)])
disp(['均方误差根rmse为: ',num2str(rmse)])
disp(['平均绝对误差mae为: ',num2str(mae)])
disp(['平均绝对百分比误差mape为: ',num2str(mape*100),' %'])
else
disp('函数调用方法有误,请检查输入参数的个数')
end
end