复合模型(CNN-LSTM-Attention)时序和空间特征结合融合注意力机制的预测程序, Matlab代码!包含特征可视化,数据Excel导入,直接运行!
CNN-LSTM-Attention模型首先通过CNN层来捕捉输入序列的空间特征,然后通过LSTM层来捕捉时间相关性,最后通过Attention层来更好地理解序列内部的关联。适用于,风速,光伏功率,发电功率预测,海上风电预测,碳价预测等等。
适用平台:Matlab 2023及以上
CNN-LSTM-SelfAttention是一种深度学习模型结构,通常用于处理序列数据,尤其适用于具有时空相关性的序列数据。这个结构结合了三种不同类型的神经网络层,以充分捕捉数据中的空间和时间特征,并具有以下结构:
卷积神经网络 (CNN):CNN用于捕捉序列数据中的空间相关性。它通过卷积核在输入数据上滑动,从局部区域提取特征,这有助于检测输入序列中的局部模式和特征。在CNN层之后通常会添加池化层来减小数据的空间维度,以降低计算复杂性。
长短时记忆网络 (LSTM):LSTM用于处理序列数据的时间相关性。它是一种递归神经网络,可以记住并学习输入序列的长期依赖关系。LSTM层通过门控单元来管理信息的流动和记忆。这使得模型能够适应不同时间步长的输入数据。
自注意力层 (Self-Attention):Self-Attention层是一种能够捕捉序列内部元素之间关联性的机制。它允许模型在处理输入序列时关注不同位置的信息,而不仅仅侧重于那些相对较远或相对重要的元素。Self-Attention在NLP领域中广泛使用,但也适用于其他序列数据。
结合这三种层的结构,模型首先通过CNN层来捕捉输入序列的空间特征,然后通过LSTM层来捕捉时间相关性,最后通过Self-Attention层来更好地理解序列内部的关联。这种综合结构可以更全面地处理具有时空相关性的序列数据。适用于,风速预测,光伏功率预测,发电功率预测,海上风电预测,碳价预测等等。它的创新点在于综合了不同类型的神经网络层,使其适用于广泛的应用,从而提高了对序列数据的建模和分析能力。
模型结构:
卷积层提取的特征可视化:
超期24步预测结果对比:
模型部分代码:
%% 参数设置
options = trainingOptions('sgdm', ... % SGDM 梯度下降算法
'MaxEpochs',300, ... % 最大训练次数 300
'GradientThreshold',1,... % 渐变的正阈值 1
'ExecutionEnvironment','cpu',... % 网络的执行环境 cpu
'InitialLearnRate',0.01,... % 初始学习率 0.01
'LearnRateSchedule','none',... % 训练期间降低整体学习率的方法 不降低
'Shuffle','every-epoch',... % 每次训练打乱数据集
'SequenceLength',24,... % 序列长度 24
'Plots','training-progress',... % 画出训练曲线
'MiniBatchSize',15,... % 训练批次大小 每次训练样本个数15
'Verbose',0); % 有关训练进度的信息不打印到命令窗口中
analyzeNetwork(layers); % 分析网络结构
%% 训练网络
net = trainNetwork(XTrain,YTrain,layers,options);
%% 绘制某层的特征图,实现特征可视化
%激活某一层
LayersNeed = activations(net,XTrain,'conv','OutputAs','channels');% 卷积层的特征
%% 画图
numNeed = 3; % 按需要取几张特征图
for i = 1:numNeed
LayersFeature = reshape(cell2mat(LayersNeed(1,:)),18,24,32,[]); %根据analyzeNetwork分析结果,构造合适尺寸的特征图
axes1 = axes('Parent',figure);
hold(axes1,'on');
image(LayersFeature(:,:,i),'Parent',axes1,'CDataMapping','scaled');
colormap(hsv)
xlim([0, size(LayersFeature,2)]); % 限制坐标轴X
ylim([0, size(LayersFeature,1)]); % 限制坐标轴Y
end
%% 测试与评估
YPredicted = net.predict(XTest);
%% 计算误差
% 过程
error2 = YPredicted-Ytest; % 测试值和真实值的误差
[len,~]=size(Ytest); % len获取测试样本个数,数值等于testNum,用于求各指标平均值
SSE1=sum(error2.^2); % 误差平方和
MAE1=sum(abs(error2))/len; % 平均绝对误差
MSE1= sumsqr(error2)/len; % 均方误差
RMSE1=MSE1^(1/2); % 均方根误差
MAPE1=mean(abs(error2./mean(Ytest))); % 平均百分比误差
r=corrcoef(Ytest,YPredicted); % corrcoef计算相关系数矩阵,包括自相关和互相关系数
R1=r(1,2);
SST = sum((Ytest - mean(Ytest)).^2); % 计算总平方和
SSR = sum((Ytest - YPredicted).^2); % 计算残差平方和
R_squared = (1 - (SSR / SST)).*100; % 计算R²值
fprintf('R²值为: %.4f\n', R_squared); % 打印R²值
%% 绘图
figure
plot(Ytest,'m-*','LineWidth',2);
hold on
plot(YPredicted,'c-o','LineWidth',2);
legend('真实值','预测值');
xlabel('预测样本');
ylabel('预测结果');
string={'测试集预测结果对比';['MAPE=' num2str(MAPE1)]};
title(string)
grid
欢迎感兴趣的小伙伴关注并后台留言获取完整版代码哦~,小编会继续推送更有质量的学习资料、文章程序代码~
更多推荐
所有评论(0)