MATLAB实现基于CNN-LSTM-Attention卷积神经网络CNN结合长短期记忆网络LSTM融合注意力机制进行多变量时序预测的详细项目实例项目背景介绍多变量时序预测是工业制造、能源调度、交通运行、气象监测、金融风控与设备健康管理中的核心任务。与单变量预测相比多变量场景同时包含多个外部驱动因素、多个传感器通道以及复杂耦合关系数据在时间维度上存在明显的滞后效应、周期波动、趋势漂移与突发扰动。在真实业务环境中目标序列往往并非只由自身历史决定而是受温度、湿度、压力、振动、负载、节假日、工况切换、人员行为等多种因素共同影响因此仅依赖传统统计模型很难稳定刻画这种高维非线性映射。尤其在多源传感器系统中不同变量之间的相关性并不固定某些变量在局部时间窗口内更关键某些变量在长时间跨度中影响更明显这种动态重要性变化使得预测模型既要具备提取局部模式的能力又要具备建模长期依赖关系的能力还要能够自动识别关键特征并抑制噪声干扰。CNN 与 LSTM 的组合为该类任务提供了非常适合的建模路径。卷积神经网络擅长从局部连续片段中捕捉短期模式、边缘特征与局部组合关系在多变量时序中可用于自动提取多个通道在短时间窗内形成的局部结构尤其适合处理波峰、波谷、突变、周期局部重复以及变量间的邻域耦合。长短期记忆网络则通过门控机制有效缓解普通循环神经网络在长序列训练中常见的梯度消失与梯度爆炸问题能够保留较长时间跨度的信息适用于描述趋势演化、状态迁移以及跨时间间隔的依赖联系。注意力机制进一步增强模型的选择能力使网络在面对大量时间步和多维输入时可以自动分配不同权重给更有价值的时刻和特征减少无关信息对预测结果的干扰从而提升精度与鲁棒性。三者融合后CNN 负责“提局部结构”LSTM 负责“记长期依赖”Attention 负责“选关键部分”形成适合复杂时序任务的互补式架构。在 MATLAB 环境中实现 CNN LSTM Attention 融合模型具有较强的工程价值。MATLAB 在信号处理、深度学习、系统仿真、可视化与算法验证方面具备成熟工具链便于完成数据清洗、归一化、窗口化、网络搭建、训练调参、指标评估与结果展示。对于科研验证与企业原型开发MATLAB 的优势在于建模流程清晰、试验复现方便、调试效率高、图形分析能力强并且能较容易地将理论结构转化为可运行的工程代码。将 CNN LSTM Attention 用于多变量时序预测不仅可提升传统方法面对非线性、非平稳、多噪声输入时的表现还能为故障预测、负荷预测、价格预测、环境预测和产线参数预测提供更精细的时序映射能力。该项目的价值并不局限于得到一个预测器更重要的是建立一套可以适配多源异构时间序列的通用建模范式使复杂业务问题能够通过统一的深度学习框架得到高质量解决。项目目标与意义一、构建高精度多变量预测模型项目的首要目标是建立一个能够处理多输入、多状态、多扰动的高精度时序预测模型。单纯依赖历史目标值的模型通常难以应对外部变量变化带来的影响而多变量融合建模能够显著提高预测上限。CNN LSTM Attention 架构通过局部特征抽取、长依赖记忆和动态权重分配三种机制协同工作可更准确地拟合输入与输出之间的复杂映射关系。在实际任务中这种模型可用于预测未来多个时间点的数值结果也可用于单步预测、滚动预测或多步联合预测。其意义在于让模型不仅“知道过去发生了什么”还能“理解过去哪些因素更重要”从而在具有噪声、缺失和非平稳特征的数据上依然保持较高的泛化能力。该能力对于高价值决策场景极其关键因为预测误差的微小降低都可能带来显著的经济收益或风险降低。二、提升复杂时序关系的表达能力该项目的第二个目标是增强模型对复杂时序依赖关系的表达能力。真实多变量时间序列通常同时存在短周期规律、长周期趋势、季节变化与突发异常单一网络结构往往只能擅长其中某一种模式。CNN 能有效提取局部邻域内的形状信息与变量耦合模式LSTM 能在较长区间内维持状态信息Attention 则能重新分配不同时间步与特征通道的重要性。三者结合后网络不再只是机械拟合输入输出而是能够在时间维度上进行更细粒度的“关注”和“筛选”。这种表达能力的提升使得模型在面对传感器抖动、工况切换、季节性波动、数据滞后等问题时依旧可以保持稳定预测性能。意义在于它让深度模型从“黑箱拟合器”进一步走向“可解释的时序关系学习器”为后续结果分析和业务诊断提供基础。三、增强工程部署与迁移适应性第三个目标是让模型具备较强的工程可用性与迁移适应性。很多理论上表现优秀的模型在实际部署时常因输入格式不统一、训练流程复杂、参数敏感或计算成本过高而难以落地。MATLAB 提供从数据处理到模型评估的一体化环境便于形成标准化流程读取数据、构造滑动窗口、划分训练验证测试集、训练网络、评估误差、绘制预测曲线、输出结果文件。这样可以让模型更容易迁移到不同数据集与不同业务对象。意义在于减少重复开发成本使算法能够快速应用于风电功率预测、设备故障趋势预测、交通流量预测、经济指标预测等多种任务。通过统一框架后续只需替换数据源和窗口策略就能在较少改动下复用整体结构提升项目落地效率。四、为智能决策提供可靠支撑第四个目标是将预测结果转化为可执行的智能决策依据。多变量时序预测并非只追求数值拟合更关键的是在决策前提前给出可信的未来趋势从而支持资源配置、风险预警和控制优化。例如在能源场景中可提前预测负荷变化并安排调度在工业场景中可提前识别设备状态恶化趋势并安排维护在交通场景中可提前感知流量变化并调整管控策略。CNN LSTM Attention 模型的意义在于能够把复杂时序中的隐含信息转化为对未来的量化判断为人机协同决策提供更稳健的数据基础。对于业务端而言预测越准调度越稳冗余越少成本越低风险越可控因此该项目在技术层面与应用层面都具有明确价值。项目挑战及解决方案一、多变量间相关结构复杂且动态变化多变量时序数据最大的难点之一是变量之间的相关性并非固定不变。某些变量在某些工况下强相关在另一些工况下却影响减弱某些特征对短期预测有效对长期预测却作用有限。如果直接使用简单拼接输入模型可能被大量冗余变量干扰导致训练过程不稳定甚至出现过拟合。解决思路是先通过滑动窗口构造样本再利用 CNN 在局部窗口内自动提取特征组合减少人工特征设计的依赖。随后引入 Attention对 LSTM 输出的时间步进行权重重分配使模型聚焦真正关键的时刻与信号通道。必要时还可加入特征标准化、缺失值插补和异常值裁剪降低输入分布差异对训练的影响。通过这种方式模型不再被动接受所有变量而是主动学习哪些变量在什么时间更值得关注从根本上缓解复杂相关结构带来的识别困难。二、长序列训练中的梯度与信息衰减长时间序列预测常见问题是信息衰减。随着时间步增加普通循环结构很容易遗忘早期信息训练时还可能遭遇梯度消失或梯度爆炸导致模型无法稳定学习长距离依赖。解决方案是使用 LSTM 的输入门、遗忘门和输出门机制将关键历史信息保留在记忆单元中同时抑制无关扰动的传播。为了进一步增强稳定性可在网络中加入合适的归一化策略、合理设置梯度阈值、采用较小学习率与合适的序列长度并根据数据采样频率控制窗口大小避免过长序列直接输入造成计算负担过重。CNN 还可以先对局部时间片进行压缩和提炼降低 LSTM 需要处理的原始冗余量从而减轻长期依赖建模压力。这样形成的“卷积降噪、循环记忆、注意力筛选”组合有助于在长序列环境中保持更好的梯度传播和信息保真度。三、训练效率、泛化能力与解释性之间的平衡深度模型通常面临训练效率、泛化能力与解释性三者难以同时最优的问题。层数过浅会欠拟合层数过深会增加计算成本并提高过拟合风险只追求高精度又可能忽视结果解释难以支持业务决策。解决方案是采用分层式架构设计先用卷积层提取局部特征再用 LSTM 建模时序关系最后通过 Attention 输出关键时刻权重既能提升预测精度又能通过注意力分布观察模型关注区域。在训练策略上可使用验证集监控早停防止过拟合可通过学习率衰减、Dropout、L2 正则化等方法增强泛化可通过误差指标、残差图和预测曲线进行多角度评估避免只看单一指标。对于工程实现MATLAB 代码结构应保持清晰数据预处理、网络设计、训练配置、结果可视化分模块完成以便调试、复现实验和后续扩展最终在效率、准确性与可解释性之间取得较优平衡。项目模型架构一、输入层与数据窗口化机制模型架构的第一层是输入层承担多变量时序样本接入的作用。多变量预测并不直接以整段原始序列训练而是通过滑动窗口将连续观测切分为多个样本每个样本包含若干历史时间步和对应未来目标值。这样做的基本原理是将时序任务转化为监督学习问题使网络能够以固定长度输入学习局部时间依赖。每个样本可表示为“过去一段时间内多个变量的组合”输入形状通常为特征数乘以时间步数或时间步数乘以特征数具体取决于网络层的排列方式。该机制的优点在于可以控制序列长度提升训练稳定性并让模型聚焦于业务中最有价值的历史范围。对于采样频率较高的数据窗口长度可以捕捉短期波动对于周期性更强的数据窗口长度则可覆盖一个或多个完整周期从而增强对趋势和周期的识别能力。输入层的设计决定了后续卷积与循环结构所接收的信息粒度因此它是整个架构的基础。二、CNN 局部特征提取模块CNN 模块的核心作用是从多变量输入中提取局部模式。卷积运算通过共享卷积核在时间维或特征维上滑动实现对局部邻域的特征响应能够识别相邻时间步之间的变化趋势、突变片段以及多个变量之间的局部组合关系。其基本原理是相邻时间点的信息往往比远距离信息更具有局部一致性卷积核可以将这种局部结构映射为更高层的表征。对于多变量数据卷积层还能学习不同变量组合在局部窗口中的交互模式例如某一传感器升高配合另一传感器下降所形成的复合信号。池化或步幅设置可进一步压缩冗余信息降低后续 LSTM 的计算压力。相比人工构造局部统计量CNN 能够自动学习最有用的局部滤波器对异常点、噪声和局部抖动更具鲁棒性。它在架构中承担“特征提纯”的角色为后续时序建模提供更高质量的输入表示。三、LSTM 长短期依赖建模模块LSTM 模块是整个预测网络的时序记忆核心。其基本原理是在循环神经网络基础上引入门控单元通过遗忘门决定保留多少历史信息通过输入门控制当前输入写入多少新信息通过输出门决定当前时刻输出多少状态内容。与普通 RNN 相比LSTM 能显著缓解长期依赖中信息逐步衰减的问题因此特别适合具有趋势、滞后和跨周期关系的多变量时序。经过 CNN 提取后的特征序列输入到 LSTM 后网络会按照时间步逐帧处理逐渐形成对历史演化过程的内部表示。若序列较长LSTM 可以在较大时间跨度内仍保持对关键状态的记忆从而让预测不仅基于最近片段还能综合远期上下文。该模块负责“记住时间关系”是模型能够理解动态演化的关键部分。对于工业参数预测、流量预测和环境指标预测这种长依赖建模能力通常直接决定最终精度上限。四、Attention 权重分配模块Attention 模块的目标是让模型学会“关注什么”。在 LSTM 输出的隐藏状态序列中不同时间步对最终预测的贡献往往不同某些时刻虽然距离当前较远却可能因对应关键事件而具有更高价值某些时间步虽然数值变化明显但对目标影响并不大。Attention 的基本原理是通过一个可学习的评分函数为每个隐藏状态分配权重再对所有状态进行加权汇聚生成上下文向量。这样模型在形成最终预测前会先筛选出更重要的时间片段与特征表达。与单纯取最后一个时间步输出相比Attention 更能保留全局信息也更容易缓解长序列中后段信息占主导、前段信息被遗忘的问题。对于多变量任务Attention 还可增强可解释性使得分析者能够观察网络更关注哪些时段从而结合业务知识判断模型是否捕获到关键事件。该模块负责“挑重点”是提升精度与解释性的关键增强层。五、输出层与回归映射模块输出层承担将高维时序表示映射到预测值空间的任务。经过 CNN、LSTM 与 Attention 处理后网络已经形成了较为浓缩且富含时序语义的信息表示最后通常通过全连接层或回归层将其转换为目标变量的预测结果。若任务为单步预测输出层可直接给出一个未来时刻的连续值若任务为多步预测输出层可设计为多个神经元同时输出若干未来步长。其基本原理是学习特征空间到目标空间之间的非线性映射使用均方误差、平均绝对误差等损失函数进行优化。输出层的设计需要与任务定义紧密匹配并兼顾数值稳定性与实际业务需求。对于回归场景输出层一般不使用分类激活而是保持线性映射以便输出连续数值。该模块是模型从“理解输入”到“生成预测”的最终转换环节决定了结果表达形式和业务可用性。项目模型描述及代码示例一、数据读取与窗口构造 clc; % 清空命令行窗口便于查看本次运行输出 clear; % 清除工作区变量避免历史数据干扰当前实验 close all; % 关闭所有图窗保证绘图环境干净 rng(42,twister); % 固定随机种子保证实验可复现 data readmatrix(multivariate_data.csv); % 读取多变量时序原始数据要求列为不同变量 data fillmissing(data,linear); % 对缺失值进行线性插补降低不完整样本影响 data smoothdata(data,1,movmean,5); % 沿时间维进行滑动均值平滑抑制高频噪声 numFeatures size(data,2)-1; % 设定输入特征数最后一列作为预测目标 target data(:,end); % 提取预测目标序列作为监督学习标签 inputs data(:,1:end-1); % 提取输入变量序列作为模型输入特征 lookback 24; % 设置历史窗口长度表示利用过去24个时间步 horizon 1; % 设置预测步长为1表示预测下一时刻 numSamples size(data,1) - lookback - horizon 1; % 计算可生成的监督样本数量 X zeros(lookback, numFeatures, numSamples); % 预分配三维输入张量提升运行效率 Y zeros(numSamples,1); % 预分配目标向量用于存储每个窗口对应标签 for i 1:numSamples % 遍历所有可用滑动窗口 X(:,:,i) inputs(i:ilookback-1,:); % 取出连续历史片段作为一个输入样本 Y(i) target(ilookbackhorizon-1); % 取窗口后指定步长位置的目标值作为标签 end % 完成全部样本构造 idxTrain 1:floor(0.7*numSamples); % 按时间顺序划分训练集避免未来信息泄漏 idxVal floor(0.7*numSamples)1:floor(0.85*numSamples);% 划分验证集用于早停与调参 idxTest floor(0.85*numSamples)1:numSamples; % 划分测试集用于最终泛化评估 XTrain X(:,:,idxTrain); % 提取训练输入样本 YTrain Y(idxTrain); % 提取训练标签 XVal X(:,:,idxVal); % 提取验证输入样本 YVal Y(idxVal); % 提取验证标签 XTest X(:,:,idxTest); % 提取测试输入样本 YTest Y(idxTest); % 提取测试标签 二、标准化与输入格式调整 muX mean(reshape(XTrain,[],numFeatures),1); % 计算训练集各特征均值仅使用训练数据统计量 sigX std(reshape(XTrain,[],numFeatures),0,1); % 计算训练集各特征标准差用于标准化尺度统一 sigX(sigX0) 1; % 防止某些特征标准差为0导致除零错误 for i 1:size(XTrain,3) % 遍历训练样本 XTrain(:,:,i) (XTrain(:,:,i) - muX) ./ sigX; % 对训练样本逐特征标准化 end % 完成训练集标准化 for i 1:size(XVal,3) % 遍历验证样本 XVal(:,:,i) (XVal(:,:,i) - muX) ./ sigX; % 使用训练集统计量标准化验证样本 end % 完成验证集标准化 for i 1:size(XTest,3) % 遍历测试样本 XTest(:,:,i) (XTest(:,:,i) - muX) ./ sigX; % 使用相同统计量标准化测试样本 end % 完成测试集标准化 muY mean(YTrain); % 计算训练标签均值便于回归目标标准化 sigY std(YTrain); % 计算训练标签标准差便于数值稳定训练 if sigY 0 % 判断标签是否为常数 sigY 1; % 若标准差为0则置1避免归一化报错 end % 完成异常保护 YTrainN (YTrain - muY) ./ sigY; % 归一化训练标签减轻梯度尺度波动 YValN (YVal - muY) ./ sigY; % 归一化验证标签保持同一量纲 YTestN (YTest - muY) ./ sigY; % 归一化测试标签用于统一评估 XTrainCell cell(size(XTrain,3),1); % 创建序列输入单元数组适配网络序列输入 YTrainCell cell(size(XTrain,3),1); % 创建标签单元数组与序列输入逐样本对应 for i 1:size(XTrain,3) % 遍历训练样本索引 XTrainCell{i} squeeze(XTrain(:,:,i)); % 转换为特征数乘时间步格式适配序列网络 YTrainCell{i} YTrainN(i); % 存储对应归一化标签 end % 完成训练集单元格式转换 XValCell cell(size(XVal,3),1); % 创建验证集单元数组 YValCell cell(size(XVal,3),1); % 创建验证标签单元数组 for i 1:size(XVal,3) % 遍历验证样本 XValCell{i} squeeze(XVal(:,:,i)); % 转换验证样本格式 YValCell{i} YValN(i); % 存储验证标签 end % 完成验证集转换 XTestCell cell(size(XTest,3),1); % 创建测试集单元数组 YTestCell cell(size(XTest,3),1); % 创建测试标签单元数组 for i 1:size(XTest,3) % 遍历测试样本 XTestCell{i} squeeze(XTest(:,:,i)); % 转换测试样本格式 YTestCell{i} YTestN(i); % 存储测试标签 end % 完成测试集转换 三、CNN LSTM Attention 网络搭建 layers [ % 定义深度网络层序列 sequenceInputLayer(numFeatures,Name,input) % 输入层接收多变量时间序列 convolution1dLayer(3,32,Padding,same,Name,conv1) % 一维卷积层提取局部时序模式 batchNormalizationLayer(Name,bn1) % 批归一化层稳定训练分布 reluLayer(Name,relu1) % ReLU激活层增强非线性表达 convolution1dLayer(3,64,Padding,same,Name,conv2) % 第二层卷积抽取更高层局部特征 batchNormalizationLayer(Name,bn2) % 第二个批归一化层减少内部协变量偏移 reluLayer(Name,relu2) % 第二个ReLU激活层 flattenLayer(Name,flatten) % 展平卷积输出便于送入LSTM lstmLayer(128,OutputMode,sequence,Name,lstm) % LSTM层输出完整序列以便注意力加权 dropoutLayer(0.2,Name,drop1) % Dropout层降低过拟合风险 selfAttentionLayer(4,64,Name,attn) % 自注意力层增强时间步间依赖建模 globalAveragePooling1dLayer(Name,gap) % 全局平均池化汇聚注意力后的时序表示 fullyConnectedLayer(64,Name,fc1) % 全连接层进行高维映射 reluLayer(Name,relu3) % ReLU激活增强回归非线性 fullyConnectedLayer(1,Name,fc2) % 输出层输出单步回归值 regressionLayer(Name,reg)]; % 回归损失层采用均方误差训练 options trainingOptions(adam, ... % 选择Adam优化器适合复杂深度网络 MaxEpochs,80, ... % 设置最大训练轮数 MiniBatchSize,32, ... % 设置小批量大小平衡速度与稳定性 InitialLearnRate,1e-3, ... % 设置初始学习率 Shuffle,every-epoch, ... % 每轮打乱训练样本增强泛化 ValidationData,{XValCell,YValCell}, ... % 指定验证集 ValidationFrequency,20, ... % 设置验证频率 Plots,training-progress, ... % 显示训练过程曲线 Verbose,false, ... % 关闭冗长命令行输出 ExecutionEnvironment,auto); % 自动选择CPU或GPU net trainNetwork(XTrainCell,YTrainCell,layers,options); % 训练 CNN LSTM Attention 融合网络 四、预测与反归一化 YPredN predict(net,XTestCell,MiniBatchSize,32); % 对测试集进行归一化空间预测 YPredN double(YPredN); % 转换为双精度便于后续数值运算 YPred YPredN .* sigY muY; % 将预测结果反归一化回原始量纲 YTrue YTestN .* sigY muY; % 将真实值从标准化空间恢复为原始量纲 YPred YPred(:); % 转换为列向量便于指标计算 YTrue YTrue(:); % 转换为列向量保持形状一致 五、性能指标计算 rmseVal sqrt(mean((YPred - YTrue).^2)); % 计算均方根误差衡量总体偏差 maeVal mean(abs(YPred - YTrue)); % 计算平均绝对误差衡量绝对偏离程度 mapeVal mean(abs((YPred - YTrue) ./ max(abs(YTrue),eps))) * 100; % 计算平均绝对百分比误差避免除零 ssRes sum((YTrue - YPred).^2); % 计算残差平方和 ssTot sum((YTrue - mean(YTrue)).^2); % 计算总平方和 r2Val 1 - ssRes/ssTot; % 计算决定系数衡量拟合优度 fprintf(RMSE %.4f\n,rmseVal); % 输出RMSE结果便于查看误差水平 fprintf(MAE %.4f\n,maeVal); % 输出MAE结果便于查看平均偏差 fprintf(MAPE %.2f%%\n,mapeVal); % 输出MAPE结果便于查看相对误差 fprintf(R2 %.4f\n,r2Val); % 输出R2结果便于查看拟合质量 六、结果可视化与对比分析 fig1 figure(Name,Prediction Comparison,Color,w); % 创建白色背景图窗 plot(YTrue,LineWidth,1.5); % 绘制真实值曲线 hold on; % 保持当前图像叠加预测曲线 plot(YPred,LineWidth,1.5); % 绘制预测值曲线 grid on; % 显示网格增强阅读性 legend({真实值,预测值},Location,best); % 添加图例区分曲线含义 xlabel(样本序号); % 设置横轴标签 ylabel(目标值); % 设置纵轴标签 title(CNN-LSTM-Attention 多变量时序预测结果); % 设置图题 colormap(fig1,turbo); % 设置配色方案符合R2025b建议 fig2 figure(Name,Error Histogram,Color,w); % 创建误差分布图窗 histogram(YTrue-YPred,30,FaceColor,[0.2 0.6 0.8]); % 绘制预测误差直方图 grid on; % 打开网格 xlabel(预测误差); % 设置横轴标签 ylabel(频数); % 设置纵轴标签 title(预测误差分布); % 设置图题一、数据读取与窗口构造clc; % 清空命令行窗口便于查看本次运行输出clear; % 清除工作区变量避免历史数据干扰当前实验close all; % 关闭所有图窗保证绘图环境干净rng(42,twister); % 固定随机种子保证实验可复现data readmatrix(multivariate_data.csv); % 读取多变量时序原始数据要求列为不同变量data fillmissing(data,linear); % 对缺失值进行线性插补降低不完整样本影响data smoothdata(data,1,movmean,5); % 沿时间维进行滑动均值平滑抑制高频噪声numFeatures size(data,2)-1; % 设定输入特征数最后一列作为预测目标target data(:,end); % 提取预测目标序列作为监督学习标签inputs data(:,1:end-1); % 提取输入变量序列作为模型输入特征lookback 24; % 设置历史窗口长度表示利用过去24个时间步horizon 1; % 设置预测步长为1表示预测下一时刻numSamples size(data,1) - lookback - horizon 1; % 计算可生成的监督样本数量X zeros(lookback, numFeatures, numSamples); % 预分配三维输入张量提升运行效率Y zeros(numSamples,1); % 预分配目标向量用于存储每个窗口对应标签for i 1:numSamples % 遍历所有可用滑动窗口X(:,:,i) inputs(i:ilookback-1,:); % 取出连续历史片段作为一个输入样本Y(i) target(ilookbackhorizon-1); % 取窗口后指定步长位置的目标值作为标签end % 完成全部样本构造idxTrain 1:floor(0.7*numSamples); % 按时间顺序划分训练集避免未来信息泄漏idxVal floor(0.7*numSamples)1:floor(0.85*numSamples);% 划分验证集用于早停与调参idxTest floor(0.85*numSamples)1:numSamples; % 划分测试集用于最终泛化评估XTrain X(:,:,idxTrain); % 提取训练输入样本YTrain Y(idxTrain); % 提取训练标签XVal X(:,:,idxVal); % 提取验证输入样本YVal Y(idxVal); % 提取验证标签XTest X(:,:,idxTest); % 提取测试输入样本YTest Y(idxTest); % 提取测试标签二、标准化与输入格式调整muX mean(reshape(XTrain,[],numFeatures),1); % 计算训练集各特征均值仅使用训练数据统计量sigX std(reshape(XTrain,[],numFeatures),0,1); % 计算训练集各特征标准差用于标准化尺度统一sigX(sigX0) 1; % 防止某些特征标准差为0导致除零错误for i 1:size(XTrain,3) % 遍历训练样本XTrain(:,:,i) (XTrain(:,:,i) - muX) ./ sigX; % 对训练样本逐特征标准化end % 完成训练集标准化for i 1:size(XVal,3) % 遍历验证样本XVal(:,:,i) (XVal(:,:,i) - muX) ./ sigX; % 使用训练集统计量标准化验证样本end % 完成验证集标准化for i 1:size(XTest,3) % 遍历测试样本XTest(:,:,i) (XTest(:,:,i) - muX) ./ sigX; % 使用相同统计量标准化测试样本end % 完成测试集标准化muY mean(YTrain); % 计算训练标签均值便于回归目标标准化sigY std(YTrain); % 计算训练标签标准差便于数值稳定训练if sigY 0 % 判断标签是否为常数sigY 1; % 若标准差为0则置1避免归一化报错end % 完成异常保护YTrainN (YTrain - muY) ./ sigY; % 归一化训练标签减轻梯度尺度波动YValN (YVal - muY) ./ sigY; % 归一化验证标签保持同一量纲YTestN (YTest - muY) ./ sigY; % 归一化测试标签用于统一评估XTrainCell cell(size(XTrain,3),1); % 创建序列输入单元数组适配网络序列输入YTrainCell cell(size(XTrain,3),1); % 创建标签单元数组与序列输入逐样本对应for i 1:size(XTrain,3) % 遍历训练样本索引XTrainCell{i} squeeze(XTrain(:,:,i)); % 转换为特征数乘时间步格式适配序列网络YTrainCell{i} YTrainN(i); % 存储对应归一化标签end % 完成训练集单元格式转换XValCell cell(size(XVal,3),1); % 创建验证集单元数组YValCell cell(size(XVal,3),1); % 创建验证标签单元数组for i 1:size(XVal,3) % 遍历验证样本XValCell{i} squeeze(XVal(:,:,i)); % 转换验证样本格式YValCell{i} YValN(i); % 存储验证标签end % 完成验证集转换XTestCell cell(size(XTest,3),1); % 创建测试集单元数组YTestCell cell(size(XTest,3),1); % 创建测试标签单元数组for i 1:size(XTest,3) % 遍历测试样本XTestCell{i} squeeze(XTest(:,:,i)); % 转换测试样本格式YTestCell{i} YTestN(i); % 存储测试标签end % 完成测试集转换三、CNN LSTM Attention 网络搭建layers [ % 定义深度网络层序列sequenceInputLayer(numFeatures,Name,input) % 输入层接收多变量时间序列convolution1dLayer(3,32,Padding,same,Name,conv1) % 一维卷积层提取局部时序模式batchNormalizationLayer(Name,bn1) % 批归一化层稳定训练分布reluLayer(Name,relu1) % ReLU激活层增强非线性表达convolution1dLayer(3,64,Padding,same,Name,conv2) % 第二层卷积抽取更高层局部特征batchNormalizationLayer(Name,bn2) % 第二个批归一化层减少内部协变量偏移reluLayer(Name,relu2) % 第二个ReLU激活层flattenLayer(Name,flatten) % 展平卷积输出便于送入LSTMlstmLayer(128,OutputMode,sequence,Name,lstm) % LSTM层输出完整序列以便注意力加权dropoutLayer(0.2,Name,drop1) % Dropout层降低过拟合风险selfAttentionLayer(4,64,Name,attn) % 自注意力层增强时间步间依赖建模globalAveragePooling1dLayer(Name,gap) % 全局平均池化汇聚注意力后的时序表示fullyConnectedLayer(64,Name,fc1) % 全连接层进行高维映射reluLayer(Name,relu3) % ReLU激活增强回归非线性fullyConnectedLayer(1,Name,fc2) % 输出层输出单步回归值regressionLayer(Name,reg)]; % 回归损失层采用均方误差训练options trainingOptions(adam, ... % 选择Adam优化器适合复杂深度网络MaxEpochs,80, ... % 设置最大训练轮数MiniBatchSize,32, ... % 设置小批量大小平衡速度与稳定性InitialLearnRate,1e-3, ... % 设置初始学习率Shuffle,every-epoch, ... % 每轮打乱训练样本增强泛化ValidationData,{XValCell,YValCell}, ... % 指定验证集ValidationFrequency,20, ... % 设置验证频率Plots,training-progress, ... % 显示训练过程曲线Verbose,false, ... % 关闭冗长命令行输出ExecutionEnvironment,auto); % 自动选择CPU或GPUnet trainNetwork(XTrainCell,YTrainCell,layers,options); % 训练 CNN LSTM Attention 融合网络四、预测与反归一化YPredN predict(net,XTestCell,MiniBatchSize,32); % 对测试集进行归一化空间预测YPredN double(YPredN); % 转换为双精度便于后续数值运算YPred YPredN .* sigY muY; % 将预测结果反归一化回原始量纲YTrue YTestN .* sigY muY; % 将真实值从标准化空间恢复为原始量纲YPred YPred(:); % 转换为列向量便于指标计算YTrue YTrue(:); % 转换为列向量保持形状一致五、性能指标计算rmseVal sqrt(mean((YPred - YTrue).^2)); % 计算均方根误差衡量总体偏差maeVal mean(abs(YPred - YTrue)); % 计算平均绝对误差衡量绝对偏离程度mapeVal mean(abs((YPred - YTrue) ./ max(abs(YTrue),eps))) * 100; % 计算平均绝对百分比误差避免除零ssRes sum((YTrue - YPred).^2); % 计算残差平方和ssTot sum((YTrue - mean(YTrue)).^2); % 计算总平方和r2Val 1 - ssRes/ssTot; % 计算决定系数衡量拟合优度fprintf(RMSE %.4f\n,rmseVal); % 输出RMSE结果便于查看误差水平fprintf(MAE %.4f\n,maeVal); % 输出MAE结果便于查看平均偏差fprintf(MAPE %.2f%%\n,mapeVal); % 输出MAPE结果便于查看相对误差fprintf(R2 %.4f\n,r2Val); % 输出R2结果便于查看拟合质量六、结果可视化与对比分析fig1 figure(Name,Prediction Comparison,Color,w); % 创建白色背景图窗plot(YTrue,LineWidth,1.5); % 绘制真实值曲线hold on; % 保持当前图像叠加预测曲线plot(YPred,LineWidth,1.5); % 绘制预测值曲线grid on; % 显示网格增强阅读性legend({真实值,预测值},Location,best); % 添加图例区分曲线含义xlabel(样本序号); % 设置横轴标签ylabel(目标值); % 设置纵轴标签title(CNN-LSTM-Attention 多变量时序预测结果); % 设置图题colormap(fig1,turbo); % 设置配色方案符合R2025b建议fig2 figure(Name,Error Histogram,Color,w); % 创建误差分布图窗histogram(YTrue-YPred,30,FaceColor,[0.2 0.6 0.8]); % 绘制预测误差直方图grid on; % 打开网格xlabel(预测误差); % 设置横轴标签ylabel(频数); % 设置纵轴标签title(预测误差分布); % 设置图题更多详细内容请访问http://【多变量时序预测】MATLAB实现基于CNN-LSTM-Attention卷积神经网络CNN结合长短期记忆网络LSTM融合注意力机制进行多变量时序预测的详细项目实例含完整的程序GUI设计和_基于GUI的时间序列预测项目资源-CSDN下载 https://download.csdn.net/download/xiaoxingkongyuxi/90392762https://download.csdn.net/download/xiaoxingkongyuxi/90392762https://download.csdn.net/download/xiaoxingkongyuxi/90392762