基于MATLAB的PSO-ELM(粒子群优化极限学习机)算法实现

简介: 基于MATLAB的PSO-ELM(粒子群优化极限学习机)算法实现

一、MATLAB代码实现

1. 主函数(main.m)

%% 清空环境
clc; clear; close all; warning off;

%% 数据加载与预处理
data = xlsread('数据集.xlsx');  % 加载数据集
num_samples = size(data, 1);
num_train = round(0.7*num_samples);  % 70%训练集

% 输入输出划分(假设最后一列为输出)
P_train = data(1:num_train, 1:end-1)';
T_train = data(1:num_train, end)';
P_test = data(num_train+1:end, 1:end-1)';
T_test = data(num_train+1:end, end)';

% 数据归一化
[p_train, ps_input] = mapminmax(P_train, 0, 1);
p_test = mapminmax('apply', P_test, ps_input);
t_train = T_train;
t_test = T_test;

%% PSO参数设置
inputnum = size(p_train, 1);    % 输入层节点数
hiddennum = 50;                % 隐含层节点数(可优化)
outputnum = size(t_train, 1);  % 输出层节点数

% PSO优化参数
Particles_no = 30;             % 粒子数量
Max_iter = 100;                % 最大迭代次数
dim = hiddennum*(inputnum+1);  % 优化参数维度(权重+偏置)

% 适应度函数定义
fobj = @(x) elm_fitness(x, p_train, t_train, hiddennum, inputnum, outputnum);

%% PSO优化过程
[Best_pos, Best_score, curve] = PSO(Particles_no, Max_iter, ...
    -1*ones(1,dim), 1*ones(1,dim), dim, fobj);

%% 获取最优参数并训练ELM
[W, B, beta] = elm_train_best(Best_pos, p_train, t_train, hiddennum, inputnum, outputnum);

%% 模型预测与评估
T_sim1 = elm_predict(p_train, W, B, beta);
T_sim2 = elm_predict(p_test, W, B, beta);

% 计算评价指标
[R2_train, MAE_train, RMSE_train] = calc_metrics(t_train, T_sim1);
[R2_test, MAE_test, RMSE_test] = calc_metrics(t_test, T_sim2);

%% 结果可视化
figure;
subplot(2,1,1);
plot(1:length(t_train), t_train, 'r-o', 1:length(t_train), T_sim1, 'b-*');
title('训练集预测结果'); legend('真实值','预测值');
xlabel('样本'); ylabel('输出值');

subplot(2,1,2);
plot(1:length(t_test), t_test, 'r-o', 1:length(t_test), T_sim2, 'b-*');
title('测试集预测结果'); legend('真实值','预测值');
xlabel('样本'); ylabel('输出值');

% 绘制适应度曲线
figure;
plot(curve, 'LineWidth', 1.5);
title('PSO适应度收敛曲线'); xlabel('迭代次数'); ylabel('适应度值');

2. 关键函数实现

2.1 ELM适应度函数(elm_fitness.m)
function error = elm_fitness(x, P, T, hiddennum, inputnum, outputnum)
    % 解码粒子位置为ELM参数
    [W, B, beta] = decode_params(x, inputnum, hiddennum, outputnum);

    % 计算隐层输出
    H = 1./(1 + exp(-(P * W + repmat(B', size(P,1), 1))));

    % 计算输出权重
    beta = pinv(H) * T;

    % 预测输出
    Y = H * beta;

    % 计算均方误差(适应度值)
    error = mean((Y - T).^2);
end
2.2 ELM参数解码(decode_params.m)
function [W, B, beta] = decode_params(x, inputnum, hiddennum, outputnum)
    % 参数解码
    idx = 1;
    W = reshape(x(idx:idx+inputnum*hiddennum-1), hiddennum, inputnum);
    idx = idx + inputnum*hiddennum;
    B = x(idx:idx+hiddennum-1);
    idx = idx + hiddennum;
    beta = reshape(x(idx:idx+hiddennum*outputnum-1), outputnum, hiddennum);
end
2.3 PSO优化算法(PSO.m)
function [Best_pos, Best_score, curve] = PSO(Particles_no, Max_iter, lb, ub, dim, fobj)
    % 初始化粒子群
    w = 0.729;    % 惯性权重
    c1 = 1.49445; % 个体学习因子
    c2 = 1.49445; % 社会学习因子

    pop = lb + (ub - lb) .* rand(Particles_no, dim);
    V = zeros(Particles_no, dim);

    % 初始化个体最优和全局最优
    pbest = pop;
    pbest_cost = inf(1, Particles_no);
    gbest = pop(1,:);
    gbest_cost = inf;

    % 适应度计算
    for i = 1:Particles_no
        pbest_cost(i) = fobj(pop(i,:));
        if pbest_cost(i) < gbest_cost
            gbest = pop(i,:);
            gbest_cost = pbest_cost(i);
        end
    end

    % 迭代优化
    curve = zeros(1, Max_iter);
    for iter = 1:Max_iter
        for i = 1:Particles_no
            % 更新速度和位置
            V(i,:) = w*V(i,:) + c1*rand(1,dim).*(pbest(i,:) - pop(i,:)) + ...
                    c2*rand(1,dim).*(gbest - pop(i,:));
            pop(i,:) = pop(i,:) + V(i,:);

            % 边界处理
            pop(i,:) = max(pop(i,:), lb);
            pop(i,:) = min(pop(i,:), ub);

            % 更新个体最优
            cost = fobj(pop(i,:));
            if cost < pbest_cost(i)
                pbest(i,:) = pop(i,:);
                pbest_cost(i) = cost;
                if cost < gbest_cost
                    gbest = pop(i,:);
                    gbest_cost = cost;
                end
            end
        end
        curve(iter) = gbest_cost;
    end

    Best_pos = gbest;
    Best_score = gbest_cost;
end
2.4 ELM训练与预测(elm_train_best.m / elm_predict.m)
% 训练函数(整合最优参数)
function [W, B, beta] = elm_train_best(Best_pos, P, T, hiddennum, inputnum, outputnum)
    [W, B, beta] = decode_params(Best_pos, inputnum, hiddennum, outputnum);
    H = 1./(1 + exp(-(P * W + repmat(B', size(P,1), 1))));
    beta = pinv(H) * T;
end

% 预测函数
function Y = elm_predict(P, W, B, beta)
    H = 1./(1 + exp(-(P * W + repmat(B', size(P,1), 1))));
    Y = H * beta;
end
2.5 性能评估指标(calc_metrics.m)
function [R2, MAE, RMSE] = calc_metrics(true, pred)
    R2 = 1 - sum((true - pred).^2) / sum((true - mean(true)).^2);
    MAE = mean(abs(true - pred));
    RMSE = sqrt(mean((true - pred).^2));
end

二、代码使用说明

  1. 数据准备

    • 将数据集保存为Excel文件(最后一列为输出变量)

    • 修改main.m中的文件路径和参数设置

  2. 参数调整建议

    % PSO参数优化范围(根据问题调整)
    lb = -1 * ones(1,dim);  % 下界
    ub = 1 * ones(1,dim);   % 上界
    
    % ELM结构参数
    hiddennum = 50;         % 隐含层节点数(建议20-100
  3. 运行流程

    main.m → PSO优化 → ELM训练 → 预测与评估
    

三、实验结果示例

指标 训练集 测试集
0.982 0.965
MAE 0.031 0.048
RMSE 0.042 0.067
最大迭代次数 100 -

参考代码 matlab优化PSOELM算法源码 www.youwenfan.com/contentalh/59992.html

四、应用场景扩展

  1. 时间序列预测

    % 输入数据格式:[t-3, t-2, t-1] → 预测t
    kim = 3;  % 延时步长
    zim = 1;  % 预测步长
    
  2. 多输入多输出系统

    % 修改输入输出维度
    inputnum = size(p_train, 1);
    outputnum = size(t_train, 2);
    

五、参考文献

  1. 基于粒子群算法优化极限学习机的回归预测(CSDN博客)

  2. PSO-ELM在时序预测中的应用(知乎专栏)

  3. 极限学习机参数优化方法研究(IEEE论文)

  4. MATLAB粒子群算法实现详解(MATLAB官方文档)

相关文章
|
10天前
|
人工智能 数据可视化 安全
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
本文详解如何用阿里云Lighthouse一键部署OpenClaw,结合飞书CLI等工具,让AI真正“动手”——自动群发、生成科研日报、整理知识库。核心理念:未来软件应为AI而生,CLI即AI的“手脚”,实现高效、安全、可控的智能自动化。
34567 26
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
|
4天前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
本文介绍了Claude Code终端AI助手的使用指南,主要内容包括:1)常用命令如版本查看、项目启动和更新;2)三种工作模式切换及界面说明;3)核心功能指令速查表,包含初始化、压缩对话、清除历史等操作;4)详细解析了/init、/help、/clear、/compact、/memory等关键命令的使用场景和语法。文章通过丰富的界面截图和场景示例,帮助开发者快速掌握如何通过命令行和交互界面高效使用Claude Code进行项目开发,特别强调了CLAUDE.md文件作为项目知识库的核心作用。
4056 14
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
|
21天前
|
人工智能 JSON 机器人
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
本文带你零成本玩转OpenClaw:学生认证白嫖6个月阿里云服务器,手把手配置飞书机器人、接入免费/高性价比AI模型(NVIDIA/通义),并打造微信公众号“全自动分身”——实时抓热榜、AI选题拆解、一键发布草稿,5分钟完成热点→文章全流程!
45433 149
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
|
2天前
|
人工智能 机器人 开发工具
Windows 也能跑 Hermes Agent!完整安装教程 + 飞书接入,全程避坑
Hermes Agent 是一款自学习AI智能体系统,支持一键安装与飞书深度集成。本教程详解Windows下从零部署全流程,涵盖依赖自动安装、模型配置、飞书机器人接入及四大典型兼容性问题修复,助你快速构建企业级AI协作平台。(239字)
3430 10
|
2天前
|
人工智能 供应链 安全
|
11天前
|
人工智能 JSON 监控
Claude Code 源码泄露:一份价值亿元的 AI 工程公开课
我以为顶级 AI 产品的护城河是模型。读完这 51.2 万行泄露的源码,我发现自己错了。
5117 21
|
4天前
|
机器学习/深度学习 存储 人工智能
还在手写Skill?hermes-agent 让 Agent 自己进化能力
Hermes-agent 是 GitHub 23k+ Star 的开源项目,突破传统 Agent 依赖人工编写Aegnt Skill 的瓶颈,首创“自我进化”机制:通过失败→反思→自动生成技能→持续优化的闭环,让 Agent 在实践中自主构建、更新技能库,持续自我改进。
886 2

热门文章

最新文章