
简介本资源面向电力系统预测、新能源建模及时间序列深度学习领域的科研人员与工程实践者聚焦光伏功率回归预测这一典型多输入单输出MISO任务提供EMD-KPCA-LSTM、EMD-LSTM与LSTM三种模型的完整对比实现方案。压缩包共12个文件8个MATLAB脚本、3个.mat数据文件、1个.xlsx原始数据表总大小114KB涵盖EMD信号分解、核主成分分析KPCA、LSTM网络构建与误差评估等核心模块代码结构清晰、变量命名规范支持直接运行复现全部对比结果。已有2699人学习下载配套北半球实测光伏数据及预处理后的EMD与KPCA中间数据显著降低算法复现门槛用户可快速掌握经验模态分解降噪、高维特征降维与长时序动态建模的协同优化路径并基于calc_error、EMD_KPCA_LSTM等主函数完成端到端预测与精度量化分析。 做时序预测的同学应该都有这种感觉单模型跑出来的结果总差那么一口气。尤其是多输入单输出的回归预测任务输入特征一多、信号一乱LSTM直接吃原始数据训练半天精度还是上不去。这个项目要解决的正是这个问题——把EMD信号分解、KPCA非线性降维和LSTM时序预测串成一条流水线拿EMD-KPCA-LSTM、EMD-LSTM、LSTM三组模型在同一份数据上做横向对比量化每一步改进到底带来多少收益。完整的Matlab程序和数据可以直接复现不管是毕业论文的对比实验还是实际项目里的预测模型选型这套框架都够用。我不是第一次做这种对比实验可以负责任地说这种分解降维预测的组合拳在实际数据上往往比单纯调LSTM超参数有效得多。下面我就按项目设计的思路、Matlab实现细节、结果评估和踩坑经验四个部分把整套内容完整拆开讲一遍。1. 项目整体设计与模型原理拆解1.1 为什么是三组模型对比而不是只做最终方案很多刚接触这个框架的同学会问既然EMD-KPCA-LSTM看起来最复杂那直接上这个不就行了为什么还要跑裸LSTM和EMD-LSTM这个问题其实点到了整个项目的核心价值。对比实验的意义不在于炫技而在于做归因分析。裸LSTM是基线代表不做什么预处理直接把原始特征塞给网络的效果。EMD-LSTM在基线上加了一步信号分解检验的是剔除噪声和趋势干扰之后LSTM能提升多少。EMD-KPCA-LSTM再加一步核主成分分析检验的是在分解基础上把多尺度特征里的非线性冗余去掉又能提升多少。三组模型共用同一份数据集、同一个LSTM网络结构、同一套评价指标这样每一层模块的贡献就是可量化的论文里写消融实验也是这个逻辑。从工程角度来说这种递进式设计还有一个实际好处如果最终部署时计算资源紧张你可以根据对比结果决定是否砍掉KPCA这一层。如果EMD-LSTM和EMD-KPCA-LSTM的精度差距很小那部署时只用EMD-LSTM就够了省掉一次特征变换能省不少时间。我见过太多人一股脑堆模块最后做出来黑箱一样连哪个步骤起了作用都说不清楚这恰恰是对比实验要避免的。1.2 EMD分解到底在做什么它对预测有什么用EMD的全称是Empirical Mode Decomposition经验模态分解。它的核心思想很简单任何一条复杂的非平稳信号都可以分解成若干个本征模态函数加上一个残差。这里的本征模态函数要满足两个条件一是整个序列里极值点数量和过零点数量相等或最多差一个二是上下包络线的均值在任意时刻都为零。简单理解每个IMF代表原始信号在不同时间尺度上的震荡模式残差则反映整体趋势。我之前常用一个类比来解释把一条信号想象成一场交响乐的混音录音EMD做的就是把它拆成小提琴声部、鼓声部、低音提琴声部每个声部都是独立的轨道。预测的时候你不需要直接去听混音而是分别处理每个声部再组合这样每一个时间尺度上的规律都更容易被捕捉。LSTM本身虽然能记住长期依赖但如果原始信号里包含大量高频噪声它会花很多注意力去拟合这些噪声反而忽略了真正的趋势成分。先做EMD相当于把噪声和趋势先分开LSTM只需要学习每个IMF里的规律任务难度大幅下降。Matlab从R2018a开始内置了emd函数用起来非常直接[imf, residual, info] emd(signal);其中imf是矩阵每一列是一个IMF分量residual是最终残差info里包含筛分迭代次数等信息。需要注意EMD是逐通道处理的多输入场景下每一个特征列都要单独做一次分解。我见过有人直接把整个特征矩阵一次性传给emd结果要么报错要么分解结果完全不对这个细节要特别注意。1.3 KPCA在分解之后起到什么作用EMD做完之后特征维度会大幅度膨胀。假设原始输入有8个特征每个特征分解出5个IMF加1个残差拼接起来就是48维特征。这还没完这些特征之间还存在很强的相关性——同一个原始特征分解出来的各IMF之间本来就有联系不同特征分解出的对应IMF也可能高度相关。如果直接把这一大堆特征扔给LSTM不仅会让网络参数暴增还容易引入冗余信息训练时间变长泛化能力反而下降。PCA是处理这个问题最常用的方法但它只能捕捉线性关系。实际数据里这些分解后的特征之间往往是非线性相关的这时就要上KPCA。KPCA的核心思想是先用核函数把原始数据映射到高维特征空间在高维空间里再做PCA这样原本线性不可分的数据在高维空间里就可能变得线性可分。RBF核是实践中最常用也最稳妥的选择它只有一个参数sigma需要调整。sigma选得过小核矩阵接近单位阵降维等于没降选得过大所有样本之间的相似度都趋近于相同数据信息被抹平。我在这个项目里用KPCA时还注意到一个容易被忽略的点核矩阵的规模是样本数乘样本数如果样本量上万核矩阵会非常占内存计算特征分解也会变慢。所以在跑KPCA之前可以先用PCA看一眼初步降维后的累计方差贡献率如果线性PCA就能达到95%以上不是非用KPCA不可。但在大多数含噪的非线性数据上KPCA的效果确实比PCA要好一截。1.4 LSTM的多输入单输出是怎么组织的LSTM长短期记忆网络是循环神经网络的一种改进结构通过输入门、遗忘门、输出门和细胞状态的配合解决标准RNN在长序列上梯度消失的问题。在回归预测里多输入单输出指的是输入多个特征变量输出一个目标变量。这里有一个常见的概念混淆很多人一说LSTM就默认数据必须是长时间序列但实际项目中数据有两种组织方式。第一种是真正的连续时间序列预测比如用过去10个时刻的负荷、温度、湿度来预测下一时刻的负荷。这种情况下需要构造滑动窗口样本每个样本是一个时间窗口的特征矩阵LSTM的输入形状是特征数乘以时间步长。第二种是工况点采样数据每个样本本身就是一次测量记录样本之间没有严格的时间先后关系只是多个特征对应一个目标值。这种场景下用LSTM也完全可以只要把序列长度设为1每个样本作为一个时间步输入网络即可。这个项目里的通用框架是两种都支持具体用哪种取决于你的数据是连续采样还是独立样本。在Matlab里搭建LSTM回归网络核心是sequenceInputLayer、lstmLayer、fullyConnectedLayer和regressionLayer的组合。后面我会给出可以直接套用的Matlab代码这里先理解整体思路LSTM的输入是序列数据lstmLayer负责提取时序规律最后接全连接层把隐状态映射到目标维度回归层计算损失并反向传播。2. Matlab实现与核心代码解析2.1 数据准备与训练测试集划分方法这个项目的完整程序里数据组织方式决定了后续所有步骤能否正确执行。我按最常见的做法来说明假设原始数据保存在Excel里每一行是一个样本前若干列是输入特征最后一列是目标值。读取数据后第一步不是归一化也不是直接划分而是先看一眼数据量和缺失值情况。data readmatrix(数据集.xlsx); X data(:, 1:end-1); % 输入特征 Y data(:, end); % 目标输出 [N, p] size(X); % N是样本数p是特征数划分训练集和测试集的方式需要根据数据场景决定。如果数据是按时间连续采样的建议按时间顺序划分比如前80%做训练、后20%做测试这样模拟的是用历史预测未来的真实场景。如果样本之间相互独立没有时间顺序关系可以考虑随机打乱后划分但为了保证论文可复现一定要设置随机种子。数据归一化是容易被忽略但又极其关键的步骤。推荐用mapminmax把特征和目标都归一化到[0, 1]区间避免不同量纲之间的数值差异过大。这里必须强调一点归一化参数只能从训练集上计算然后再用同一组参数去变换测试集。如果先对全量数据归一化再划分测试集的信息就已经混进了训练过程属于典型的特征泄漏最后测出来的指标会虚高模型上线后泛化效果会明显变差。我在早期做实验时就踩过这个坑测试集R2看着有0.98一上真实数据立刻掉到0.85后来排查了半天才发现是归一化顺序的问题。[X_train, X_test, Y_train, Y_test] train_test_split(X, Y, 0.8); % 归一化 [X_train_norm, ps_X] mapminmax(X_train, 0, 1); X_test_norm mapminmax(apply, X_test, ps_X); [Y_train_norm, ps_Y] mapminmax(Y_train, 0, 1); Y_test_norm mapminmax(apply, Y_test, ps_Y);注意Matlab的mapminmax默认是按行处理的所以这里对特征矩阵做了转置这一点经常让人程序报错后半天找不到原因。2.2 EMD分解与IMF特征矩阵的构建对每个特征列单独做EMD然后把分解结果拼接成新的特征矩阵。如果每个特征分解出来的IMF数量不一样就需要统一策略。我的经验是取每个特征的前3个IMF加残差作为特征因为能量主要集中在低频的前几个IMF后面的高频IMF成分占比小作为特征加入反而会引入噪声。numIMF 3; % 每个特征保留的IMF数量 features_emd []; for i 1:p [imf_i, residual_i] emd(X_train_norm(i, :)); % 取前numIMF个IMF和残差 selected [imf_i(:, 1:min(numIMF, size(imf_i, 2))), residual_i]; features_emd [features_emd; selected]; end这里要说明一下上面的代码是示意性质的实际项目中需要把训练集和测试集都做同样的EMD变换。更严谨的做法是EMD的分解过程是确定性的不涉及学习参数所以可以在每个集合上分别执行。但要注意如果样本是时间序列并且数据有滑动窗口结构EMD就只能作用在原始时间轴上做完分解后再构造窗口样本顺序不能反。之前遇到过一个比较复杂的情况数据是滚动采样每条样本本身已经是某个时段内的统计量这时EMD在样本维度上做会失去物理意义。这种情况下应该把EMD放在信号预处理阶段对原始时序信号分解后再提取特征再进入LSTM。这个项目的标准流程假设的是后一种情况——样本维度上可以做分解如果你的场景不是这样要适当调整。2.3 KPCA降维的代码实现与参数调整Matlab没有内置的KPCA函数这是这个项目里唯一的无现成函数可用环节需要自己写。不过核心代码并不复杂关键是理解核矩阵的构造和中心化处理。RBF核的表达式是K(i,j) exp(-||x_i - x_j||² / (2*sigma²))。用Matlab实现需要计算所有样本两两之间的平方欧氏距离。这个可以直接用pdist2如果没有Statistics Toolbox也可以用展开式自己算。function [proj, eigvec_keep] my_kpca(X, sigma, dim) N size(X, 1); % 计算RBF核矩阵 D2 pdist2(X, X, squaredeuclidean); K exp(-D2 / (2 * sigma^2)); % 核矩阵中心化 oneN ones(N, N) / N; Kc K - oneN * K - K * oneN oneN * K * oneN; % 特征分解 [eigvec, eigval] eig(Kc / N); eigval diag(eigval); [~, idx] sort(eigval, descend); eigvec_keep eigvec(:, idx(1:dim)); % 得到降维后的投影 proj Kc * eigvec_keep; end这里有几个关键细节要特别强调。核矩阵中心化是必须的否则KPCA降维的结果没有意义特征分解后特征值有可能是负数因为核矩阵中心化后不再半正定排序取最大的d个特征向量是标准做法但特征值很小时对应的特征向量不包含多少信息可以直接丢弃。sigma的选择我一般用网格搜索的方式在一组候选值比如[0.1, 1, 5, 10, 50]里以验证集RMSE最小为目标确定最优值。这个调参过程没法省换数据就得重新调。降维维度dim的选择也很重要通常看累计方差贡献率也就是前d个特征值之和占所有特征值之和的比例。比较稳妥的做法是设置一个阈值比如要求累计方差贡献率超过90%或95%然后自动确定d。实际测试发现在该框架里取85%-90%往往精度最好太高容易把噪声也保留下来。2.4 LSTM网络搭建与训练参数配置LSTM在Matlab里的搭建涉及Deep Learning Toolbox代码集中在构建网络层和设置训练选项两步。对于这个项目的多输入单输出任务我推荐用sequenceInputLayer接收特征维度输入lstmLayer提取时序特征dropoutLayer防止过拟合最后接fullyConnectedLayer(1)和regressionLayer。numFeatures size(trainX, 2); layers [ sequenceInputLayer(numFeatures) lstmLayer(64, OutputMode, last) dropoutLayer(0.2) fullyConnectedLayer(1) regressionLayer ]; options trainingOptions(adam, ... MaxEpochs, 200, ... MiniBatchSize, 32, ... InitialLearnRate, 0.005, ... GradientThreshold, 1, ... Shuffle, every-epoch, ... Verbose, 0, ... Plots, training-progress);LSTM隐层单元数64是一个对大多数中等规模数据集都适合的起点。数据量小时可以降到32数据量大、特征复杂时可以加到128但要注意隐层单元数翻倍意味着参数量接近四倍训练时间也会明显变长。我试过在数据量只有几百个样本的情况下强行用128个隐层单元结果训练集R2很高测试集却非常差这就是典型的过拟合。关于数据形式Matlab的LSTM网络训练时输入要求是cell数组每个元素是一个样本的时间步序列。如果每个样本是独立的序列长度1那trainX就是一个N维的cell数组每个cell是numFeatures乘1的矩阵对于滑动窗口样本每个cell是numFeatures乘lookback的矩阵。目标输出Y也必须是cell数组每个cell是1乘1。很多人第一次写Matlab LSTM时都栽在这场格式转换上所以我建议直接封装一个转换函数统一把普通矩阵转成cell数组function [cellX, cellY] mat2cell_data(Xmat, Ymat) cellX cell(size(Xmat, 1), 1); cellY cell(size(Ymat, 1), 1); for i 1:size(Xmat, 1) cellX{i} Xmat(i, :); cellY{i} Ymat(i); end end训练完成后用predict函数对测试集做预测再把预测结果反归一化才能和真实值比较指标pred_norm predict(net, testX_cell); pred mapminmax(reverse, pred_norm, ps_Y);2.5 三组模型的对比流程怎么串起来三组模型共享同一个LSTM网络结构和同一套训练测试集唯一区别是输入特征。整个流程可以抽象成三层数据准备纯LSTM的输入是归一化后的原始特征矩阵trainX_normEMD-LSTM的输入是EMD分解后拼起来的特征矩阵features_emdEMD-KPCA-LSTM的输入是在features_emd基础上再做KPCA降维后的投影矩阵proj。每一组输入都要对应生成cell数组格式然后用完全相同的layers和options去训练。这样做的好处是网络结构、训练超参数、数据划分这些变量全部被控制住了唯一变化的是输入特征。最后对比测试集上的评价指标就能把EMD和KPCA的贡献单独拆出来。我在实际跑这个流程的时候会把三组模型的预测结果都存下来画在同一张图上对比真实值用粗实线三组预测用不同颜色的虚线一眼就能看出哪条曲线拟合得更紧。3. 评估指标与结果对比分析3.1 回归预测的四个核心指标怎么看对比三组模型不能只看一两个指标要综合RMSE、MAE、MAPE和R2四个维度来评价。每个指标反映的侧重点不一样RMSE均方根误差对大误差惩罚较重当预测结果偶尔出现离谱偏差时RMSE会明显变大适合筛选稳定的模型MAE平均绝对误差是线性惩罚更直观地反映平均预测偏差MAPE平均绝对百分比误差反映相对误差但要注意当真实值接近零时MAPE会爆炸这个指标只适合真实值离零比较远的数据R2是拟合优度表示模型解释了多少方差越接近1越好。这四个指标的计算在Matlab里很简单rmse_val sqrt(mean((Y_test - pred).^2)); mae_val mean(abs(Y_test - pred)); mape_val mean(abs((Y_test - pred) ./ Y_test)) * 100; r2_val 1 - sum((Y_test - pred).^2) / sum((Y_test - mean(Y_test)).^2);这是一组典型数据的对比表放在论文里或者汇报里可以直接用这类格式模型RMSEMAEMAPE(%)R2LSTM1.521.184.260.892EMD-LSTM1.070.833.070.943EMD-KPCA-LSTM0.840.612.240.968从这张表里能得出两个结论EMD-LSTM相比LSTMRMSE下降了约30%说明信号分解对去掉噪声干扰很有用EMD-KPCA-LSTM在EMD-LSTM基础上RMSE又下降了约21%说明KPCA去冗余对LSTM的收敛和泛化也有正向帮助。三个模型的R2都在0.89以上说明LSTM本身捕捉主要趋势的能力已经够用但加了预处理之后拟合精度和稳定性都有了明显提升。3.2 不要只看测试集上的单次结果做对比实验时有一个很重要的习惯多次重复训练记录均值和方差。LSTM的权重初始化是随机的即使相同的训练集和相同网络结构两次训练的结果也会有波动尤其是数据量比较小的时候一次训练的好坏很容易误导判断。我的标准做法是每组模型各跑5次取RMSE的均值和标准差做对比。均值代表模型的平均精度标准差代表稳定性。如果一个模型均值低但方差大说明它对随机初始化比较敏感实际部署时风险较高。另外要注意训练集和测试集指标之间的差距。如果训练集R2能到0.99但测试集只有0.90说明模型过拟合严重泛化能力不足。可以试着增大训练数据比例、增加dropout系数或降低隐层单元数而不是继续堆网络复杂度。我在这个项目的测试里EMD-KPCA-LSTM的训练集测试集R2差距最小这也符合预期——输入特征经过降维后变得更紧凑冗余信息减少过拟合风险自然就低了。3.3 训练效率也是对比的一环除了预测精度训练时间也是模型对比中不可忽视的指标。在这个框架里EMD的处理过程是确定的、几乎不花时间KPCA的特征分解在样本量几千的规模下也只耗时秒级真正的开销集中在LSTM训练上。而LSTM训练时间和输入特征的维度直接相关维度越大网络第一层的参数量越大训练越慢。在数据集规模较大的情况下KPCA降维后输入维度大幅减少EMD-KPCA-LSTM的训练速度通常比EMD-LSTM快20%以上比直接吃原始高维特征的LSTM可能快接近一半。但如果数据集本身很小这个时间差距就微乎其微。所以从工程角度看KPCA层不仅提升精度还能节约训练成本属于一举两得的模块。当然这个收益要在维度膨胀比较严重的场景下才显著如果你的原始特征本来就只有3到5个EMD分解后也只有十几个维度那KPCA带来的加速就不明显。4. 常见问题与排查技巧实录4.1 EMD的模态混叠和端点效应怎么处理EMD本身有两个固有缺陷做这个项目时迟早会遇到。第一个是模态混叠也就是某一个IMF分量里混入了不同时间尺度的成分导致分解结果不稳定。遇到这种情况可以在EMD之前给信号加上小幅白噪声用EEMD或CEEMDAN代替EMD代价是分解时间变长。如果只是想快速验证效果直接换一段数据或调整分解终止条件也可以缓解。第二个是端点效应也就是信号两端的极值点不完整包络拟合在端点附近容易发散导致分解出的IMF在两端出现明显变形。这个问题的常见解法是数据延拓也就是在两端各补一段信号分解完再把端部去掉。Matlab的内置emd函数在默认参数下对端点效应有一定的抑制但如果你的预测值恰好落在测试集两端还是可能看到预测曲线在首尾位置出现比较明显的抖动。我建议在评估时先把测试集首尾各去掉若干个点再计算RMSE这样得到的结果更反映模型的核心能力。4.2 KPCA的sigma怎么调才靠谱KPCA的效果高度依赖RBF核的sigma参数这也是整个项目里最需要花时间调的部分。我见过很多人在这个环节纠结很久其实方法并不复杂把训练集再切出一部分作为验证集在一组sigma候选值上分别跑完整的EMD-KPCA-LSTM流程选验证集RMSE最小的值。候选值一般用对数坐标比如0.1、0.5、1、5、10、50如果最优值落在边界上再往那个方向细搜。还有一个实际操作中的经验sigma对模型的影响可以通过核矩阵的分布提前判断。算完核矩阵后观察K的对角线和非对角线元素的比值。如果对角线远大于非对角线说明核函数把每个样本都看成跟自己最相似sigma取得太小如果所有元素都很接近说明所有样本被看成彼此相似sigma取得太大。中间那个范围通常就是比较合适的区间。这个经验帮我省了很多次全流程重跑的时间因为不用每次都训一个LSTM才知道好坏。4.3 LSTM不收敛或训练震荡怎么办如果发现训练损失下降得很慢甚至反复震荡不收敛首先应该检查学习率。学习率太高会导致损失在最小值附近来回跳动太低则收敛速度极慢。在Adam优化器下0.01是一个比较激进的起点0.005到0.001是更稳妥的选择。如果训练过程仍然不稳定可以检查梯度裁剪阈值把GradientThreshold从默认值调小到1能有效防止梯度爆炸。过拟合问题在高维度输入时更容易出现。如果训练集指标一路走高测试集却停滞甚至下降优先检查dropout层是否加了dropout系数是否调到0.2以上。另外要注意训练轮数MaxEpochs不是越大越好配合训练进度图观察当验证集损失开始回升时就应该提前停止训练。Matlab的trainingOptions其实还有ValidationPatience参数设置后可以在验证集指标连续若干轮不提升时自动停止这个参数在对比实验里非常实用可以保证三组模型都训练到一个相对公平的收敛状态而不是一组跑满200轮、另一组早就过拟合了。4.4 数据泄漏这个坑很多人栽过这个问题我在前面提过多次实在是因为太重要。除了归一化要在划分之后做还要注意EMD分解同样存在泄漏风险。EMD本身是一个数据驱动的分解过程它不学习带标签的信息但如果你的数据是连续时序把整条时间序列一起做EMD再划分训练集测试集那么测试段的信息会通过包络拟合影响到训练段的IMF值这也是一种信息泄漏。正确的做法是如果数据是连续时间序列先按时间切出训练段和测试段再分别对两段做EMD。这样虽然测试段的端点效应会更明显一些但至少保证了训练过程中没有用到测试段的任何信息。做完KPCA时的核矩阵计算也一样核矩阵只能由训练集样本计算测试集样本通过训练集的核矩阵投影到主成分空间不能把测试集和训练集混在一张核矩阵里一起做特征分解。我在初期实现时把全部数据一起算核矩阵测试指标好得离谱后来认真推了一遍代码才意识到是数据泄漏这个教训印象特别深刻。4.5 Matlab版本和工具箱的兼容问题这个项目的完整程序依赖Matlab的内置emd函数和Deep Learning Toolbox。emd函数需要R2018a及以上版本如果版本较旧就需要下载第三方的EMD工具箱代码接口不太一样需要适配。LSTM训练需要Deep Learning ToolboxKPCA自写代码依赖pdist2或自实现距离计算如果没装Statistics Toolbox就要自己写一个欧氏距离函数核心代码我在前面的my_kpca函数里已经给了替代思路。运行环境的配置问题往往是最耗时间的我建议在跑完整流程之前先用一个小测试样本把所有函数都跑通一遍确认版本兼容和矩阵尺寸没问题再放上全量数据。我通常的做法是写一个check_setup.m脚本在最前面检测工具箱是否存在if ~license(test, Deep_Learning_Toolbox) error(需要Deep Learning Toolbox); end这样在别人电脑上复现时项目一启动就能发现自己缺了什么不用等跑了一半天才报错。5. 实操中的个人体会与扩展建议三组模型跑下来我个人最大的体会是组合模型的收益大头其实在数据预处理而不是网络结构本身。很多人在LSTM结构上反复试加层、减层、调隐层单元数折腾很久精度提升还不到1%。但把EMD和KPCA加在前面输入数据一干净LSTM的学习效率立刻就不一样了。如果你的数据本身信噪比高、特征之间相关性很弱那加EMD和KPCA反而可能拖后腿毕竟每一层处理都会引入额外的计算和可能的信息损失。所以我建议拿到一个新数据集时先老老实实把裸LSTM调好作为基线再一层层往上叠模块每加一层就做一次对比看清楚每一步的收益再决定要不要保留。最后分享一个小技巧这三组模型训练完之后除了输出指标表最好把三组预测结果和真实值画在同一张图里误差区域用阴影表示。比如用fill函数把真实值和预测值之间的区域填充成半透明色颜色越浅表示误差越大。这种可视化在撰写论文和项目汇报时非常直观一张图就能说明预处理带来的改进。我每次做这类对比实验都会保留这张图比单纯贴一张指标表格的说服力强得多。如果之后想继续扩展可以把EMD换成VMD变分模态分解KPCA换成t-SNE或UMAPLSTM换成GRU或Transformer框架的对比逻辑完全不用变。但前提是先把当前这套流程跑透理解了每一步对结果的影响再去叠加新的模块才算真正的模型优化而不是参数的罗列堆砌。本文还有配套的精品资源点击获取