
简介基于鲸鱼算法(WOA)优化极限学习机(ELM)的多变量回归预测实现面向Matlab用户及需要开展回归预测建模的科研人员、工程师。资源提供完整可运行程序与示例数据集可帮助快速掌握WOA-ELM的建模流程、参数寻优及结果评价方法尤其适合在多输入单输出场景下进行预测研究。压缩包共7个文件包体仅18KB含6个Matlab脚本和1个Excel数据集其中m文件涵盖WOA主程序、ELM训练与预测函数、适应度计算及主运行入口各模块划分清晰便于二次开发与算法改进。已有267人学习下载。程序在2018及以上版本均可运行输出MAE、MAPE、MSE、RMSE、R2等通用评价指标代码注释完整、质量较高替换数据集即可移植到自身任务中适合作为回归预测基线模型或算法对比参考。1. 先把WOA-ELM这组组合说清楚多变量输入回归为什么要选它鲸鱼算法WOA优化极限学习机ELM回归预测说的是拿WOA的寻优能力去替换ELM里随机生成的输入权重和阈值让极限学习机在保持“训练只需一次矩阵求逆”的速度优势时把预测精度抬到能用、好用的水平。多变量输入模型指每个样本带多个特征列这是工业仿真和实验数据里最常见的形态几个物理量同时影响一个待预测量。这类组合适合小样本仿真数据预测ELM本身不依赖梯度迭代训练WOA只需要一个适应度函数就能驱动搜索两者耦合点干净在Matlab里落地很顺。适合手里握有一组多维输入、想快速搭预测模型又不想被BP神经网络调参磨人的工程师和研究生。下面按原理、程序结构、参数设定和踩坑记录展开。2. ELM回归建模原理与Matlab代码随机权重到最小二乘输出2.1 ELM回归的数学结构为什么训练只需要一次矩阵求逆极限学习机的设计初衷可以概括成一句话把单隐层前馈神经网络里的输入权重和阈值当作随机变量只训练输出层的线性权重。对包含n个样本、d个特征的多变量输入矩阵X隐藏层有L个神经元记隐藏层输出矩阵H为n×L矩阵每个元素是激活函数作用在加权和上的结果。H_ij g(x_i · w_j b_j)其中w_j是第j个神经元的输入权重向量b_j是阈值g是激活函数。常见的选型有sigmoid、tanh、ReLU。这里要说明白一点ELM用的激活函数和深度网络里习惯选的不完全是一回事ELM里tanh在[-1,1]输入范围下表现普遍更稳定因为随机权重的初始化范围通常也是[-1,1]两者尺度匹配。输出层是纯线性的ELM要训练的只剩下一个L×1的输出权重β。训练目标写成矩阵形式Hβ TT是n×1的训练输出列。因为H通常不是方阵β的最小二乘解为β H⁺TH⁺是H的Moore-Penrose伪逆Matlab里用pinv()直接求。这就是“训练只需一次矩阵求逆”的来源——整个训练过程没有反向传播、没有梯度迭代、没有学习率随机生成w和b算一次H求一次伪逆β到手。ELM因此训练耗时极短短到有空间被WOA这种需要反复评估适应度函数的群智能算法包一层。这个特性决定了WOA-ELM组合的合理性。群智能算法搜参数时每个个体每轮都要重新训练一次模型如果底层模型是BP一次迭代几百轮算下来整个搜索过程可能几小时底层换ELM每次适应度评估就在毫秒级几百个个体跑几十轮也就几十秒。这也是为什么有人尝试“粒子群优化BP”之后回头用“WOA优化ELM”不是算法本身谁更高级而是底子快才有条件被反复搜。2.2 Matlab最小实现手写ELM并落地多变量输入我拿到一个回归预测任务不会先跑完整WOA-ELM而是先写一个最小可运行ELM脚本确认基础模型没有逻辑问题再叠WOA。这个习惯救过我很多次因为叠加优化算法后一旦结果很差排查范围会被压缩很多。最小版本代码如下%% 最小ELM回归实现随机权重 最小二乘输出权重 % trainX: n*d 多变量输入每一行是一个样本每一列是一个特征 % trainY: n*1 输出 % testX : m*d 待预测样本 % hiddenNum: 隐藏层神经元数量 function predictY elm_base(trainX, trainY, testX, hiddenNum) [n, d] size(trainX); % 随机输入权重 w: L*d, 阈值 b: L*1 rng(default); % 固定随机种子便于复现 w (rand(hiddenNum, d) - 0.5) * 2; % 范围 [-1, 1] b (rand(hiddenNum, 1) - 0.5) * 2; % 训练构造隐藏层输出矩阵 Htanh 激活 H tanh(trainX * w repmat(b, n, 1)); % 输出权重 beta: L*1, 伪逆一次求解 beta pinv(H) * trainY; % 测试构造测试隐藏层矩阵并预测 m size(testX, 1); H_test tanh(testX * w repmat(b, m, 1)); predictY H_test * beta; end这段代码里有几个细节值得展开。第一是repmat(b, n, 1)它把阈值向量广播成n×L矩阵让每个样本都叠加同一组阈值直接用trainX * w b会因维度不一致报错或者在低版本Matlab里的隐式扩展结果和预期不符。第二是pinv而不是invH是n行L列的矩形矩阵逆矩阵通常不存在伪逆才是最小二乘意义下的解。第三是rng(default)写论文和做对比实验时建议保留这行ELM的随机初始化让每次运行结果天然不同如果不固定随机种子你无法判断一个改动是真实优化还是随机波动。2.3 隐藏层神经元数、激活函数选型对预测精度的具体影响隐藏层神经元数量L是ELM中影响精度最直接的手动参数。L太小H的表达能力不足出现欠拟合L太大H维度膨胀训练误差会很低但测试集泛化能力掉得厉害。我一般以输入特征数的2到5倍为起点做网格搜索比如4个输入变量试L等于8、12、16、20、24用测试集RMSE做参考选最优。数据集越小L越要克制小样本场景下L超过样本数的一半就容易过拟合这是一条经验边界。激活函数的选择与输入数据的数值范围强相关。数据做[-1,1]归一化时tanh和sigmoid差别不大如果输入是未经处理的原始物理量且数值较大tanh会迅速进入饱和区梯度信息丢失改用ReLU反而稳。WOA-ELM里我习惯用tanh的理由很简单WOA种群的解范围初始化是[-1,1]数据也归一化到[-1,1]tanh在这个区间的响应曲线刚好位于敏感段H矩阵的动态范围最大。还需要提一个常见误用有人为了让WOA“优化得更彻底”把ELM的输出权重β也加入个体编码放弃最小二乘直接用WOA搜β。结果往往是训练集误差很低、测试集误差很高因为这个做法违背了ELM的理论基础——输出权重的最小二乘解是全局最优用随机搜索去逼近它本身是舍近求远。WOA优化的是输入权重w和阈值bβ始终由pinv(H) * trainY算出这条边界必须在代码里明确。3. WOA算法原理与参数设定三个更新规则决定搜索行为3.1 从座头鲸捕食行为到三个寻优阶段鲸鱼算法是Mirjalili在2016年提出的群智能优化算法模拟座头鲸用气泡网捕食磷虾的行为。它在工程应用里流行核心原因是结构简洁、参数少——相比粒子群要调惯性权重和两个学习因子WOA只有a和C两个系数和ELM配合时手动干预的空间小。算法包含三个阶段对应三套位置更新规则。第一阶段是包围猎物。当前种群里的最优个体被视为猎物位置其余个体向它靠拢更新公式是D |C * X_best - X|X_new X_best - A * D。其中A 2a * r1 - aC 2 * r2r1和r2是[0,1]均匀随机数a从2线性递减到0。|A|1时个体向最优位置收缩A的绝对值控制搜索的收敛速度。第二阶段是气泡网攻击对应局部精细搜索。数学上用对数螺旋位置更新模拟D |X_best - X|X_new D * e^(b*l) * cos(2πl) X_best。参数b控制螺旋形状通常取1l是[-1,1]随机数。每轮迭代时用一个概率p决定走收缩包围还是螺旋更新p是[0,1]随机数小于0.5走收缩包围大于等于0.5走螺旋。这是原作者论文里定下的设置实现时照做即可。第三阶段是随机搜索对应全局探索。当|A|1时个体不跟随当前最优而是从种群中随机选一个个体作参照向远处搜索X_new X_rand - A * |C * X_rand - X|。这一步是为了防止算法过早陷入局部最优。三个阶段的占比随迭代进程变化迭代前期a大|A|1频繁出现全局探索多于局部挖掘迭代后期a接近0个体向最优靠拢精细搜索主导。它和ELM的耦合会用到同样的逻辑只是把适应度换成ELM回归误差把位置向量换成ELM权重编码。3.2 WOA-ELM参数编码与适应度函数设计WOA和ELM耦合的第一步是确定个体编码。一个鲸鱼个体是dim维连续位置向量在WOA-ELM里必须携带ELM训练所需的全部自由参数输入权重wL×d矩阵和阈值bL×1向量。因此个体长度是dim hiddenNum * (inputNum 1)。假设输入特征4个、隐藏层神经元15个个体向量长度就是75。编码解码时行列顺序要保持一致否则整个搜索会在不知不觉中错位而适应度曲线看起来还在下降这种隐性错误最折磨人。适应度函数决定搜索导向。常见做法是用ELM在训练数据上算均方根误差RMSE作为适应度值越小越好也可以划出一部分验证集用验证集误差做适应度抗过拟合更强。更讲究的做法是用交叉验证的平均误差但计算量成倍增加群智能算法通常扛不住。我一般用训练集RMSE做适应度最后单独用测试集验证兼顾速度与可信度。WOA每评估一次适应度就要完整执行一次ELM的H矩阵计算和伪逆求解。隐藏层神经元数量和种群规模都别贪大否则一次搜索跑完非常耗时。解码和适应度评估的核心代码如下%% 鲸鱼个体解码为ELM权重并计算适应度 % position: 1*dim 的鲸鱼个体 % dim hiddenNum * (inputNum 1) function fitness woa_elm_fitness(position, trainX, trainY, hiddenNum) inputNum size(trainX, 2); % 解码前 hiddenNum*inputNum 个分量是输入权重 w reshape(position(1 : hiddenNum * inputNum), hiddenNum, inputNum); % 后面 hiddenNum 个分量是阈值 b position(hiddenNum * inputNum 1 : end); % 隐藏层输出矩阵 H tanh(trainX * w repmat(b, size(trainX, 1), 1)); % 伪逆求输出权重 beta pinv(H) * trainY; % 预测值和适应度 Y_pred H * beta; fitness sqrt(mean((trainY - Y_pred).^2)); % RMSE end这里reshape的解码顺序和初始化时保持一致即可没有绝对对错但建议用注释把每个区段的长度写清楚。用RMSE做适应度有一个好处它和最终评价指标一致WOA在寻优过程中优化什么最后就用什么去评价模型不会出现“适应度降了但测试指标没变”的割裂感。3.3 WOA主循环的Matlab实现与三个阶段切换主循环逻辑初始化种群计算每个个体适应度找到当前最优然后迭代更新。每轮对每个个体按概率p选择收缩包围或螺旋更新再结合|A|判断用随机搜索还是跟随最优。边界钳制这一步不能省否则更新公式算出的位置会跑飞导致H矩阵出现NaN。实现如下%% WOA 主循环实现 % popSize: 种群规模, maxIter: 最大迭代次数, dim: 个体维度 % lb, ub: 个体取值的上下界向量维度为1*dim % positions: popSize*dim 的种群位置矩阵 for t 1:maxIter a 2 - 2 * t / maxIter; % a 从 2 线性降到 0 for i 1:popSize r1 rand(); r2 rand(); A 2 * a * r1 - a; C 2 * r2; p rand(); if p 0.5 if abs(A) 1 % 收缩包围向当前最优位置靠近 D abs(C * bestPosition - positions(i, :)); positions(i, :) bestPosition - A * D; else % 全局搜索随机选一个个体作为参照 randIndex randi(popSize); D abs(C * positions(randIndex, :) - positions(i, :)); positions(i, :) positions(randIndex, :) - A * D; end else % 气泡网螺旋更新 l -1 2 * rand(); D abs(bestPosition - positions(i, :)); positions(i, :) D * exp(l) .* cos(2 * pi * l) bestPosition; end % 边界检查超出上下界的分量拉回边界 positions(i, :) max(positions(i, :), lb); positions(i, :) min(positions(i, :), ub); % 重新计算适应度并更新当前最优 curFit woa_elm_fitness(positions(i, :), trainX, trainY, hiddenNum); if curFit bestFitness bestFitness curFit; bestPosition positions(i, :); end end end位置更新的三种策略里随机数r1、r2、p各自独立生成p管策略切换r1和r2通过A和C管搜索步长。边界钳制用两次min/max向量化操作完成冗余但直观新手复制过去不会写错。注意螺旋更新里的公式涉及逐元素乘法这里用.而不是这是Matlab里容易翻车的一个点。WOA的三个主要运行参数对最终效果影响很大。种群规模popSize控制每轮搜索的个体数量太小会陷入局部最优太大会让每轮耗时线性增长结合ELM毫秒级的训练时间20到50之间是比较合理的区间。最大迭代次数maxIter控制搜索总步数ELM回归场景下50到200轮足够收敛超过200轮后期适应度曲线基本走平再跑就是浪费算力。b是螺旋形状常数取1就是标准螺旋一般不用动。一个经验值输入特征数4、隐藏层神经元15的典型配置下popSize取30、maxIter取100一次完整WOA-ELM训练用普通笔记本跑大约30到60秒属于可以接受的耗时。4. 把WOA嵌入ELM完整训练流程Matlab程序结构与关键配置4.1 数据预处理与样本划分的落地顺序标题里写了“多变量输入模型”这在实际代码组织上对应着数据文件怎么落地。我通常把数据存成xlsx或mat文件特征矩阵X每一列是一个物理变量每一行是一个时间点或实验样本。数据读入后先做两件事缺失值和异常值处理。WOA的适应度函数对NaN零容忍H矩阵一旦传入NaNpinv算出的β全变NaN整个搜索过程白跑。异常值检测用箱形图法或者3σ法都可以样本量小的时候宁可删除也不要随便填充因为填充值会直接进入H矩阵参与训练对拟合结果造成真实影响。归一化在ELM里几乎必做隐藏层的加权和是特征与权重的线性组合如果特征量级差距大权重搜索会被大数值特征支配。常见的做法是用mapminmax把X和Y都映射到[-1,1]训练完后预测输出再做逆映射回到原始量纲。这里有一个必须强调的细节归一化参数的拟合只能在训练集上完成测试集要用训练集的映射参数来变换不能在测试集上重新调用mapminmax否则测试结果会失真。%% 数据读取、划分与归一化 data load(sample_data.mat); % 内含 X: n*d, Y: n*1 X data.X; Y data.Y; % 划分训练集和测试集前80%训练后20%测试 trainNum round(size(X, 1) * 0.8); trainX X(1:trainNum, :); trainY Y(1:trainNum); testX X(trainNum1:end, :); testY Y(trainNum1:end); % 数据归一化到 [-1,1]注意测试集使用训练集的映射参数 [Xn, psX] mapminmax(trainX, -1, 1); trainXn Xn; [Yn, psY] mapminmax(trainY, -1, 1); trainYn Yn; testXn mapminmax(apply, testX, psX);mapminmax是按列操作的所以这里必须先转置让每个特征占一列归一化完再转置回来。psX结构体保存的是训练集每列的最小值和最大值测试集用apply模式套用同一组参数这样训练集和测试集处在同一个特征尺度下模型训练和预测的输入分布才一致。4.2 完整WOA-ELM主程序从权重初始化到预测输出把前面的模块拼起来主程序的结构就是加载数据、归一化、设置WOA参数和ELM参数、初始化种群、跑WOA主循环、解码最优个体、算测试集预测指标。这里给出主程序骨架方便对照自己的代码查漏。%% WOA-ELM 多变量回归预测主程序 clear; clc; close all; rng(42); % 固定随机种子 %% 1. 加载与预处理数据具体实现见4.1 data load(sample_data.mat); % ... 划分 trainX/trainY/testX/testY并做归一化 %% 2. 算法参数设置 inputNum size(trainXn, 2); % 输入特征数 hiddenNum 15; % 隐藏层神经元个数 popSize 30; % WOA种群规模 maxIter 100; % 最大迭代次数 dim hiddenNum * (inputNum 1); % 个体维度 lb -ones(1, dim); % 权重和阈值下界 ub ones(1, dim); % 权重和阈值上界 %% 3. 初始化鲸鱼种群 positions rand(popSize, dim) .* (ub - lb) lb; bestPosition zeros(1, dim); bestFitness inf; %% 4. 计算初始适应度 for i 1:popSize curFit woa_elm_fitness(positions(i, :), trainXn, trainYn, hiddenNum); if curFit bestFitness bestFitness curFit; bestPosition positions(i, :); end end %% 5. WOA主循环代码见3.3结束后得到最优 bestPosition %% 6. 用最优个体训练最终ELM并预测 w_opt reshape(bestPosition(1:hiddenNum*inputNum), hiddenNum, inputNum); b_opt bestPosition(hiddenNum*inputNum1:end); H_train tanh(trainXn * w_opt repmat(b_opt, size(trainXn,1), 1)); beta_opt pinv(H_train) * trainYn; H_test tanh(testXn * w_opt repmat(b_opt, size(testXn,1), 1)); predYn H_test * beta_opt; % 逆归一化得到原始量纲预测 predY mapminmax(reverse, predYn, psY);代码里的数据划分和归一化占位实际运行时用4.1的完整段落替换。第2段参数设置是整个程序的调节入口dim的计算公式必须和适应度函数里的编码完全一致这是程序能跑通的前提。第6段里b_opt做了一次转置是因为解码出来的b是行向量而适应度函数里直接用end索引保持了行向量训练最终模型时统一转成列向量和repmat广播方向匹配。完整程序在这个方向建议拆成三个文件来组织。主程序负责加载数据、设置参数、串起WOA循环和最终预测woa_elm_fitness.m独立放适应度函数便于调试时单独验证数据文件单独放一个mat或xlsx路径用相对路径引用。这样拆的好处有两个一是WOA主循环参数改动时不需要动适应度函数二是排查问题时可以在主程序里单独调用一次woa_elm_fitness对比解码是否正确。很多第一次跑这个方案的人把所有代码塞进一个脚本出了NaN或者维度错误时定位问题的成本会高很多。4.3 参数表种群规模、迭代次数、隐藏层神经元数的合理区间WOA-ELM的调参顺序我一般是从里到外先固定WOA参数单独用网格搜索定hiddenNum再回来调popSize和maxIter。下表是默认值和建议区间供参考参数默认值建议区间调参方向hiddenNum15输入特征数×2 到 ×5偏大则过拟合偏小则欠拟合popSize3020~50小于20易早熟大于50耗时线性增加maxIter10050~200超过200后曲线基本走平边界 lb/ub-1/1按归一化范围别随意放大会让tanh进入饱和区激活函数tanhtanh / sigmoid / relu输入尺度决定归一化后用tanh最稳隐藏层神经元数量是第一个要定的参数。用输入特征数乘以3作为起点然后做一轮4到6个候选值的网格搜索用测试集RMSE择优。种群规模和迭代次数的关系是maxIter够大时popSize可以小一点因为长迭代弥补了初始样本多样性不足maxIter受限时popSize要适当加大让每轮覆盖更多解空间。边界lb和ub如果数据是[-1,1]归一化保持[-1,1]即可放大边界反而会让tanh在饱和区失去梯度适应度曲线提前走平。一个典型配置下完整程序运行30到60秒其中90%的时间消耗在WOA循环里的适应度评估。每次适应度评估包含一次训练集H矩阵计算和一次pinv伪逆伪逆的时间复杂度大约是O(n * L^2)n是样本数、L是隐藏层神经元数。样本数超过5000、隐藏层超过50时建议先做特征降维或者减少hiddenNum否则单次搜索时间会以平方级别上涨。为了让迭代过程可视化我习惯在WOA循环里每10轮记录一次bestFitness画一条收敛曲线这条曲线能直接反映搜索是否正常。5. WOA-ELM回归预测避坑指南五种典型翻车记录5.1 训练集误差很低测试集误差却异常高现象WOA优化过程中训练集RMSE一路下降测试集预测曲线和真实值严重偏离。原因最典型的是隐藏层神经元数过多模型把训练集的噪声也拟合进去了。其次是训练样本太少ELM在20个样本上训练隐藏层设了30个神经元H矩阵自由度远超样本数量过拟合几乎是必然。解决先把hiddenNum降到样本数的1/2以下或者用交叉验证重新定神经元数。如果样本实在少考虑在归一化后加入少量噪声做数据增强不过这仍是治标最有效的办法是减少特征数——把相关性低于阈值的特征列删掉减轻输入维度压力。5.2 WOA迭代曲线一直不降甚至升高现象bestFitness曲线在前几轮之后基本不动或者偶尔小幅提升搜索永远停在初始解附近。原因一是编码解码错位reshape的方向和维度与初始化时不一致导致每个个体的适应度都是随机的噪声二是搜索边界太窄所有个体挤在很小的区间内初始最优位置已经接近边界后期更新根本无法跳出三是适应度函数里误把训练标签当成了预测输出参与RMSE计算。解决单独写一个测试脚本固定一组已知的w和b手动构造H并算一次适应度和手推结果对比。边界设置上检查lb和ub是否覆盖了权重应有的取值范围。5.3 预测结果全是NaN或Inf现象训练过程正常但预测阶段输出向量中出现NaN或Inf绘图时曲线直接消失。原因首要嫌疑是输入数据里本身有NaN或Inf。其次是边界钳制缺失WOA更新公式生成的位置超出合理范围tanh输入过大进入饱和区H矩阵出现NaN。第三是数据归一化时出现了0/0某列特征全为零或方差为零mapminmax产生了无效参数。解决加载数据后立即用isnan和isinf做一次检查。边界钳制在WOA主循环的每一次位置更新后都要执行不能只在最后做一次。全零特征列直接删除或加极小扰动。5.4 中文注释在Matlab新版界面显示乱码现象从旧版本或老服务器拷过来的程序注释里的中文在2023b或2025版本里显示成乱码程序本身能跑但注释完全没法阅读。原因文件内部编码是GBK新版Matlab默认使用UTF-8切换编码后中文字节被错误解析。这在跨版本分享程序时非常常见尤其是从CSDN或老论坛下载的代码包。解决在命令行执行edit命令打开文件后检查编码设置将编辑器中的文件编码改成GBK。如果程序是从压缩包解压直接拖进去的批量检查所有m文件的编码。最稳妥的做法是程序里只保留英文注释中文说明单独放在README这个习惯能省掉很多跨版本沟通成本。5.5 每次运行结果都不一样无法判断哪个改动有效现象同样的代码、同样的数据两次运行预测指标差别明显甚至有一次效果很好、下一次就翻车。原因WOA初始化种群和ELM随机权重都依赖系统随机数没有固定随机种子。很多人只在主程序开头写rng(42)但忽略了数据划分、种群初始化、适应度函数内部各自调用的随机数生成种子并没有真正锁住整个流程。解决主程序开头统一rng之后再把数据划分和初始种群生成这两个环节分别rng一次。对比实验的流程里每次运行前固定种子确保对比变量只有一个。写论文用的时候固定种子后跑三次取均值会更稳。5.6 测试集整体偏移但曲线形状接近归一化映射参数用错对象现象测试集预测曲线贴合真实曲线的波动趋势但整体向上或向下偏移一段距离RMSE看着不大但R2偏小。原因最常见的是先归一化完整数据集再划分训练测试测试集信息混入训练集。其次是某处手误在测试集重新调用了mapminmax导致归一化后的数据分布被拉伸。解决划分必须在归一化之前完成psX和psY只能由训练集计算产生。代码里测试集归一化后立刻对比一次特征的min和max确认与训练集一致再继续跑。6. 验证WOA-ELM模型的正确姿势指标解读与边界场景提醒6.1 三个必看回归指标RMSE、MAE、R²的计算与解读RMSE均方根误差、MAE平均绝对误差、决定系数R²是回归预测里最常见的三件套。RMSE对大误差敏感实测里一个离群点可能让RMSE翻倍而MAE更接近中位数误差的直觉。R²衡量模型解释了多大比例的数据波动接近1说明拟合效果好接近0说明模型基本没有预测能力。%% 回归指标计算代码 err testY - predY; RMSE sqrt(mean(err.^2)); MAE mean(abs(err)); SS_res sum(err.^2); SS_tot sum((testY - mean(testY)).^2); R2 1 - SS_res / SS_tot;这个指标组合在论文里比较常见但实际工程判断时RMSE要结合数据本身的量级看。比如预测对象是温度RMSE在1以内可以接受预测对象是转速RMSE达到50也可能是好模型。给测试集预测值和真实值画散点图也是判断模型好坏非常直观的手段比盯一个数字更可靠。6.2 对比实验怎么设ELM原始版、WOA-ELM、BP三张表验证WOA-ELM是否有价值应该把原始随机权重的ELM拿来对比。原始ELM在相同数据上用rng固定初始化训练和测试WOA-ELM在其基础上增加WOA搜索对比两者的RMSE和R²。还可以加一个BP神经网络因为BP是更多人熟悉的对照模型跑几轮梯度下降后看它和WOA-ELM的差距可以从速度与精度两个维度判断“WOA搜索权重的收益”是否值得。6.3 小样本仿真数据预测的边界什么时候别迷信WOA-ELM高斯过程回归也是适合小样本仿真数据预测的模型它的优势在于自带置信区间不用调网络结构但高斯过程在小样本上的参数优化同样容易受核函数和噪声假设影响。WOA-ELM的适用边界在样本量大约几十到几百、特征数为个位数到两位数这个区间当样本量超过数千、特征维度上百ELM的训练优势不再明显而深度网络的表达能力和特征学习能力会更合适。当数据本身是非线性很强的混沌系统时WOA种群初始化的随机性会导致每次搜索的终点不同这时固定随机种子做多次运行取均值得到的结果才稳定可复现。我跑这个方向几年下来最大的教训是WOA-ELM的精度上限很大程度上由ELM的基础结构和数据质量决定WOA只是把随机给定的参数重新搜索了一遍而不是万能药。数据里噪声大、特征和输出相关性弱时再怎么调WOA都是白费。先做特征相关性分析再跑模型最后再谈优化算法顺序不要反。希望帮到你。本文还有配套的精品资源点击获取