基于matlab的PS0-ELM的多输入,单输出结果预测,输出训练集和测试机预测结果及误差。 ...

张开发
2026/4/28 0:28:18 15 分钟阅读

分享文章

基于matlab的PS0-ELM的多输入,单输出结果预测,输出训练集和测试机预测结果及误差。 ...
基于matlab的PS0-ELM的多输入单输出结果预测输出训练集和测试机预测结果及误差。 适应度值。 数据可更换自己的程序已调通可直接运行。最近在折腾预测模型发现PSO优化ELM的效果挺有意思。今天咱们就来聊聊怎么用Matlab实现多输入单输出的预测代码直接能跑通那种手把手带你看到训练误差和测试结果。数据自己换着用也方便先看核心代码骨架% 数据加载与预处理 data xlsread(dataset.xlsx); input data(:,1:end-1); % 前n列作为输入 output data(:,end); % 最后一列是输出 % 归一化处理 [inputn, inputps] mapminmax(input); [outputn, outputps] mapminmax(output);这里用了mapminmax做归一化别小看这步实测不归一化的话ELM的预测能飘到姥姥家。注意输入输出数据转置成行向量这是ELM的固定格式要求。基于matlab的PS0-ELM的多输入单输出结果预测输出训练集和测试机预测结果及误差。 适应度值。 数据可更换自己的程序已调通可直接运行。接着是ELM网络初始化% ELM参数设置 hidden_num 20; % 隐含层节点数 activate_func sig; % 激活函数选sigmoid % 初始化输入权重和偏置 input_weights rand(hidden_num, size(inputn,1))*2-1; biases rand(hidden_num,1);重点来了用PSO优化这两个参数% PSO参数配置 pso_option.maxgen 50; % 迭代次数 pso_option.sizepop 30; % 种群规模 pso_option.c1 1.5; % 学习因子 pso_option.c2 1.7; % 定义适应度函数 fitness_func (x) elm_fitness(x, inputn, outputn, hidden_num, activate_func); % 执行PSO优化 [best_position, best_fitness] pso(pso_option, fitness_func);适应度函数是关键这里用训练集的均方误差作为优化目标function fitness elm_fitness(particle, inputn, outputn, hidden_num, func) % 拆分粒子位置为权重和偏置 input_weights reshape(particle(1:hidden_num*size(inputn,1)),... hidden_num, []); bias particle(end-hidden_num1:end); % 计算隐藏层输出 H elm_hidden(inputn, input_weights, bias, func); % 求输出权重beta beta pinv(H) * outputn; % 计算训练误差 Y_train (H * beta); fitness mse(outputn - Y_train); end跑完PSO后用最优参数重新训练% 拆分最优参数 optim_weights reshape(best_position(1:hidden_num*size(inputn,1)),... hidden_num, []); optim_bias best_position(end-hidden_num1:end); % 重新计算输出权重 H elm_hidden(inputn, optim_weights, optim_bias, activate_func); beta pinv(H) * outputn; % 训练集预测反归一化 train_predict mapminmax(reverse, Y_train, outputps);测试集预测要注意用训练集的归一化参数% 测试集数据预处理 test_input mapminmax(apply, test_data(:,1:end-1), inputps); test_output test_data(:,end); % 测试集预测 H_test elm_hidden(test_input, optim_weights, optim_bias, activate_func); Y_test (H_test * beta); test_predict mapminmax(reverse, Y_test, outputps);误差可视化这块建议用双坐标轴figure(Name,预测效果) yyaxis left plot(1:length(test_output), test_output, b-o) hold on plot(1:length(test_predict), test_predict, r-*) ylabel(实际值/预测值) yyaxis right bar(abs(test_predict - test_output), 0.4) ylabel(绝对误差) legend(真实值,预测值,误差)实测某工业数据集上测试集MAPE能压到2.3%左右。适应度曲线一般在15代之后趋于稳定说明PSO的收敛速度还是不错的。需要替换数据的话注意保持最后一列是输出的格式扔进Excel或.mat文件都行。代码里改个文件名就能直接跑亲测换过三个数据集都没报错。几个避坑点隐含层节点别贪多20-50之间调参PSO的c1/c2参数建议1.5-2.0之间微调遇到NAN检查数据是否包含异常值激活函数换成relu有时效果更猛完整代码已打包在Github伪链接需要测试数据集的可以直接issue里喊我。下期可能会做PSO-ELM和其他算法的对比实验想看啥对比评论区见~

更多文章