复合模型(CNN-LSTM-Attention)时序和空间特征结合融合注意力机制的预测程序, Matlab代码!包含特征可视化,数据Excel导入,直接运行!

适用平台: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

欢迎感兴趣的小伙伴关注并后台留言获取完整版代码哦~,小编会继续推送更有质量的学习资料、文章程序代码~

  • 4
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
以下是基于PyTorch搭建CNN-LSTM-Attention用于时序预测的完整代码,包括数据处理和数据格式变换的示例代码: ```python import torch import torch.nn as nn import torch.optim as optim import numpy as np import pandas as pd from sklearn.preprocessing import MinMaxScaler # 数据处理 data = pd.read_csv('data.csv') data = data.drop(['date', 'time'], axis=1) scaler = MinMaxScaler() data = scaler.fit_transform(data) train_data = data[:8000, :] test_data = data[8000:, :] # 数据格式变换 def create_dataset(dataset, look_back=1): dataX, dataY = [], [] for i in range(len(dataset)-look_back-1): a = dataset[i:(i+look_back), :] dataX.append(a) dataY.append(dataset[i + look_back, :]) return np.array(dataX), np.array(dataY) look_back = 5 trainX, trainY = create_dataset(train_data, look_back) testX, testY = create_dataset(test_data, look_back) trainX = torch.from_numpy(trainX).float() trainY = torch.from_numpy(trainY).float() testX = torch.from_numpy(testX).float() testY = torch.from_numpy(testY).float() # 搭建模型 class CNN_LSTM_Attention(nn.Module): def __init__(self, input_size, hidden_size, output_size, num_layers, kernel_size): super(CNN_LSTM_Attention, self).__init__() self.hidden_size = hidden_size self.num_layers = num_layers self.conv = nn.Conv1d(in_channels=input_size, out_channels=hidden_size, kernel_size=kernel_size) self.lstm = nn.LSTM(hidden_size, hidden_size, num_layers=num_layers, batch_first=True) self.attention = nn.Sequential( nn.Linear(hidden_size, hidden_size), nn.Tanh(), nn.Linear(hidden_size, 1) ) self.fc = nn.Linear(hidden_size, output_size) def forward(self, x): batch_size, seq_len, _ = x.size() x = x.permute(0, 2, 1) x = self.conv(x) x = x.permute(0, 2, 1) h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(device) c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(device) out, _ = self.lstm(x, (h0, c0)) attention_weights = self.attention(out) attention_weights = torch.softmax(attention_weights.view(batch_size, seq_len), dim=1).unsqueeze(2) out = out * attention_weights out = out.sum(dim=1) out = self.fc(out) return out # 训练模型 device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model = CNN_LSTM_Attention(input_size=6, hidden_size=64, output_size=6, num_layers=2, kernel_size=3).to(device) criterion = nn.MSELoss() optimizer = optim.Adam(model.parameters(), lr=0.001) num_epochs = 100 batch_size = 64 for epoch in range(num_epochs): for i in range(0, len(trainX), batch_size): inputs = trainX[i:i+batch_size].to(device) labels = trainY[i:i+batch_size].to(device) optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() if (epoch+1) % 10 == 0: print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}') # 测试模型 model.eval() test_loss = 0 with torch.no_grad(): for i in range(0, len(testX), batch_size): inputs = testX[i:i+batch_size].to(device) labels = testY[i:i+batch_size].to(device) outputs = model(inputs) test_loss += criterion(outputs, labels).item() test_loss /= len(testX) print(f'Test Loss: {test_loss:.4f}') ``` 在这段代码中,我们首先读入数据,并使用MinMaxScaler进行标准化处理。然后我们使用create_dataset函数将数据转化为具有look_back个时间步长的输入和输出序列,用于训练和测试模型。接下来我们定义了CNN_LSTM_Attention模型,该模型包括一个卷积层,一个LSTM层和一个Attention层。在训练模型时,我们使用均方误差损失函数和Adam优化器。最后,在测试模型时,我们计算了模型的测试损失。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值