目录
引言
基本原理
主要特点
应用领域
发展趋势
智能优化算法——蜣螂优化算法(DBO)
算法原理
算法特点
应用前景
代码实现
ELM训练函数——elmtrain 函数
ELM预测函数——elmpredict 函数
适应度函数
主函数
极限学习机(Extreme Learning Machine,ELM)是一种单隐层前馈神经网络(SLFNs)的学习算法,由黄广斌教授于2004年提出。ELM以其训练速度快、泛化能力强、易于实现等优点,在模式识别、回归预测、数据挖掘等领域得到了广泛的应用。
ELM的基本原理是通过随机化选择输入层到隐层的连接权重(input weights)和隐层神经元的偏置(biases),并且这些参数在训练过程中保持不变。然后,通过求解一个线性系统来确定输出权重(output weights),从而使得网络的输出能够尽可能地逼近训练样本的标签或目标值。
推导过程参考:极限学习机(ELM)的原理和matlab代码实现-CSDN博客
训练速度快:由于ELM的输入权重和偏置是随机生成的,并且在训练过程中保持不变,因此ELM的训练过程主要集中在求解输出权重上,这通常可以通过解一个线性方程组来高效完成。
泛化能力强:ELM的随机化特性使得它在训练过程中能够避免过拟合问题,因此具有较好的泛化能力。此外,ELM还可以通过调整隐层神经元的数量来平衡模型的复杂性和泛化能力。
易于实现:ELM算法简单易懂,实现起来相对容易。同时,由于ELM的训练过程不需要迭代调整参数,因此可以很容易地与其他算法进行结合使用。
ELM已经成功应用于多个领域,包括:
随着深度学习、强化学习等技术的不断发展,ELM也在不断地进行改进和扩展。例如,一些研究者提出了基于ELM的深度学习模型,通过增加多个隐层来提高模型的表达能力和泛化能力。此外,还有一些研究者将ELM与其他优化算法相结合,如遗传算法、粒子群算法等,以进一步提高ELM的性能和稳定性。
总之,极限学习机作为一种高效、简单且泛化能力强的学习算法,在多个领域都有着广泛的应用前景。随着技术的不断发展,ELM的性能和应用范围也将得到进一步的提升和扩展。
蜣螂优化算法(Dung Beetle Optimizer, DBO)是一种新型的群智能优化算法,其灵感来源于蜣螂(俗称屎壳郎)的滚球、跳舞、觅食、偷窃和繁殖等自然行为。以下是关于蜣螂优化算法的详细介绍:
蜣螂优化算法由Jiankai Xue和Bo Shen在2022年提出,并发表在知名SCI期刊《THE JOURNAL OF SUPERCOMPUTING》上。该算法主要受到蜣螂的滚球、跳舞、觅食、偷窃和繁殖等行为的启发。
进化能力强:通过模拟蜣螂的自然行为,算法具有较强的进化能力,能够有效地解决复杂的寻优问题。
搜索速度快:算法中的五种主要操作(滚球、跳舞、觅食、偷窃和繁殖)模拟了蜣螂的生存行为,使得算法具有较快的搜索速度。
寻优能力强:算法同时考虑了全局探索和局部开发,具有收敛速度快和准确率高的特点。
function [ bestX,fMin , Convergence_curve ] = DBO(pop, M,c,d,dim,fobj )
P_percent = 0.2; % The population size of producers accounts for "P_percent" percent of the total population size
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
pNum = round( pop * P_percent ); % The population size of the producers
lb= c.*ones( 1,dim ); % Lower limit/bounds/ a vector
ub= d.*ones( 1,dim ); % Upper limit/bounds/ a vector
%Initialization
for i = 1 : pop
x( i, : ) = lb + (ub - lb) .* rand( 1, dim );
fit( i ) = fobj( x( i, : ) ) ;
end
pFit = fit;
pX = x;
XX=pX;
[ fMin, bestI ] = min( fit ); % fMin denotes the global optimum fitness value
bestX = x( bestI, : ); % bestX denotes the global optimum position corresponding to fMin
% Start updating the solutions.
for t = 1 : M
[fmax,B]=max(fit);
worse= x(B,:);
r2=rand(1);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i = 1 : pNum
if(r2<0.9)
r1=rand(1);
a=rand(1,1);
if (a>0.1)
a=1;
else
a=-1;
end
x( i , : ) = pX( i , :)+0.3*abs(pX(i , : )-worse)+a*0.1*(XX( i , :)); % Equation (1)
else
aaa= randperm(180,1);
if ( aaa==0 ||aaa==90 ||aaa==180 )
x( i , : ) = pX( i , :);
end
theta= aaa*pi/180;
x( i , : ) = pX( i , :)+tan(theta).*abs(pX(i , : )-XX( i , :)); % Equation (2)
end
x( i , : ) = Bounds( x(i , : ), lb, ub );
fit( i ) = fobj( x(i , : ) );
end
[ fMMin, bestII ] = min( fit ); % fMin denotes the current optimum fitness value
bestXX = x( bestII, : ); % bestXX denotes the current optimum position
R=1-t/M; %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Xnew1 = bestXX.*(1-R);
Xnew2 =bestXX.*(1+R); %%% Equation (3)
Xnew1= Bounds( Xnew1, lb, ub );
Xnew2 = Bounds( Xnew2, lb, ub );
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Xnew11 = bestX.*(1-R);
Xnew22 =bestX.*(1+R); %%% Equation (5)
Xnew11= Bounds( Xnew11, lb, ub );
Xnew22 = Bounds( Xnew22, lb, ub );
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i = ( pNum + 1 ) :12 % Equation (4)
x( i, : )=bestXX+((rand(1,dim)).*(pX( i , : )-Xnew1)+(rand(1,dim)).*(pX( i , : )-Xnew2));
x(i, : ) = Bounds( x(i, : ), Xnew1, Xnew2 );
fit(i ) = fobj( x(i,:) ) ;
end
for i = 13: 19 % Equation (6)
x( i, : )=pX( i , : )+((randn(1)).*(pX( i , : )-Xnew11)+((rand(1,dim)).*(pX( i , : )-Xnew22)));
x(i, : ) = Bounds( x(i, : ),lb, ub);
fit(i ) = fobj( x(i,:) ) ;
end
for j = 20 : pop % Equation (7)
x( j,: )=bestX+randn(1,dim).*((abs(( pX(j,: )-bestXX)))+(abs(( pX(j,: )-bestX))))./2;
x(j, : ) = Bounds( x(j, : ), lb, ub );
fit(j ) = fobj( x(j,:) ) ;
end
% Update the individual's best fitness vlaue and the global best fitness value
XX=pX;
for i = 1 : pop
if ( fit( i ) < pFit( i ) )
pFit( i ) = fit( i );
pX( i, : ) = x( i, : );
end
if( pFit( i ) < fMin )
% fMin= pFit( i );
fMin= pFit( i );
bestX = pX( i, : );
% a(i)=fMin;
end
end
Convergence_curve(t)=fMin;
end
% Application of simple limits/bounds
function s = Bounds( s, Lb, Ub)
% Apply the lower bound vector
temp = s;
I = temp < Lb;
temp(I) = Lb(I);
% Apply the upper bound vector
J = temp > Ub;
temp(J) = Ub(J);
% Update this new move
s = temp;
function S = Boundss( SS, LLb, UUb)
% Apply the lower bound vector
temp = SS;
I = temp < LLb;
temp(I) = LLb(I);
% Apply the upper bound vector
J = temp > UUb;
temp(J) = UUb(J);
% Update this new move
S = temp;
elmtrain
函数用于训练一个极端学习机模型。它接收以下输入参数:
P
:训练集输入矩阵(大小为 R×Q)。T
:训练集输出矩阵(大小为 S×Q)。N
:隐藏层神经元的数量(默认为 Q)。TF
:激活函数(默认为 'sig' 代表 Sigmoid 函数)。TYPE
:指定任务是回归(0,默认)还是分类(1)。它返回以下输出:
IW
:输入权重矩阵(大小为 N×R)。B
:隐藏层偏置矩阵(大小为 N×1)。LW
:输出权重矩阵(大小为 N×S)。TF
:激活函数的名称。TYPE
:任务的类型(回归或分类)。function [IW,B,LW,TF,TYPE] = elmtrain(P,T,N,TF,TYPE)
if nargin < 2
error('ELM:Arguments','Not enough input arguments.');
end
if nargin < 3
N = size(P,2);
end
if nargin < 4
TF = 'sig';
end
if nargin < 5
TYPE = 0;
end
if size(P,2) ~= size(T,2)
error('ELM:Arguments','The columns of P and T must be same.');
end
[R,Q] = size(P);
if TYPE == 1
T = ind2vec(T);
end
[S,Q] = size(T);
% Randomly Generate the Input Weight Matrix
IW = rand(N,R) * 2 - 1;
% Randomly Generate the Bias Matrix
B = rand(N,1);
BiasMatrix = repmat(B,1,Q);
% Calculate the Layer Output Matrix H
tempH = IW * P + BiasMatrix;
switch TF
case 'sig'
H = 1 ./ (1 + exp(-tempH));
case 'sin'
H = sin(tempH);
case 'hardlim'
H = hardlim(tempH);
end
% Calculate the Output Weight Matrix
LW = pinv(H') * T';
elmpredict
函数用于使用已训练的极端学习机模型进行预测。它接收以下输入参数:
P
:测试集输入矩阵(大小为 R×Q)。IW
:输入权重矩阵(大小为 N×R)。B
:隐藏层偏置矩阵(大小为 N×1)。LW
:输出权重矩阵(大小为 N×S)。TF
:激活函数的名称。TYPE
:任务的类型(回归或分类)。它返回以下输出:
Y
:预测输出矩阵(大小为 S×Q)function Y = elmpredict(P,IW,B,LW,TF,TYPE)
if nargin < 6
error('ELM:Arguments','Not enough input arguments.');
end
% Calculate the Layer Output Matrix H
Q = size(P,2);
BiasMatrix = repmat(B,1,Q);
tempH = IW * P + BiasMatrix;
switch TF
case 'sig'
H = 1 ./ (1 + exp(-tempH));
case 'sin'
H = sin(tempH);
case 'hardlim'
H = hardlim(tempH);
end
% Calculate the Simulate Output
Y = (H' * LW)';
if TYPE == 1
temp_Y = zeros(size(Y));
for i = 1:size(Y,2)
[max_Y,index] = max(Y(:,i));
temp_Y(index,i) = 1;
end
Y = vec2ind(temp_Y);
end
以训练集的误差mse做为适应度值。
function [fitness,IW,B,LW,TF,TYPE] = fun(x,Pn_train,Tn_train,N)
R = size(Pn_train,1);
S = size(Tn_train,1);
IW = x(1:N*R);
B = x(N*R+1:N*R+N);
IW = reshape(IW,[N,R]);
B = reshape(B,N,1);
TYPE = 0;%回归
TF = 'sig';
[IW,B,LW,TF,TYPE] = elmtrainNew(Pn_train,Tn_train,N,TF,TYPE,IW,B);
%% ELM仿真测试
Tn_sim1 = elmpredict(Pn_train,IW,B,LW,TF,TYPE);
%计算误差
E1 = Tn_sim1 - Tn_train;
fitness = mse(E1);
end
clear all
clc
%% 导入数据
load('data.mat'); % 加载数据文件
%% 随机生成训练集和测试集
rng(42); % 设置随机种子,以确保结果可重复性
% 计算样本数量
num_samples = size(input, 1);
% 随机排列索引
k = randperm(num_samples);
% 训练集——前 70% 的样本
train_samples = floor(0.7 * num_samples); % 70% 的样本作为训练集
P_train = input(k(1:train_samples), :)';
T_train = output(k(1:train_samples));
% 测试集——后 30% 的样本
P_test = input(k(train_samples+1:end), :)';
T_test = output(k(train_samples+1:end));
%% 归一化
% 使用 mapminmax 函数归一化训练集和测试集
[Pn_train, inputps] = mapminmax(P_train, -1, 1); % 归一化训练集,并记录参数
Pn_test = mapminmax('apply', P_test, inputps); % 应用训练集的归一化参数归一化测试集
[Tn_train, outputps] = mapminmax(T_train', -1, 1); % 归一化训练集标签
Tn_train = Tn_train'; % 转置回原始维度
Tn_test = mapminmax('apply', T_test', outputps); % 归一化测试集标签,并转置回原始维度
Tn_test = Tn_test';
% 训练数据相关尺寸
R = size(Pn_train, 1);
N = 70; % 隐含层神经元数量
%% 定义优化参数并进行优化
pop = 30; % 种群数量
Max_iteration = 400; % 最大迭代次数
dim = N * R + N; % 维度,即权值与阈值的个数
lb = [-1 .* ones(1, N * R), zeros(1, N)]; % 下边界
ub = [ones(1, N * R), ones(1, N)]; % 上边界
fobj = @(x) fun(x, Pn_train, Tn_train, N);
% 调用优化函数进行优化
[Best_pos, Best_score, DBO_curve] = DBO(pop, Max_iteration, lb, ub, dim, fobj);
% 获取优化后的相关参数
[fitness, IW, B, LW, TF, TYPE] = fun(Best_pos, Pn_train, Tn_train, N);
% 绘制收敛曲线
figure
plot(DBO_curve, 'linewidth', 1.5);
grid on
xlabel('迭代次数')
ylabel('适应度函数')
title('DBO-ELM收敛曲线')
%% DBO-ELM仿真测试
Tn_sim = elmpredict(Pn_test, IW, B, LW, TF, TYPE);
% 反归一化
T_sim = mapminmax('reverse', Tn_sim, outputps);
% 均方误差
E = mse(T_sim - T_test);
% 结果对比和R2
result = [T_test' T_sim'];
R2 = (60 * sum(T_sim .* T_test) - sum(T_sim) * sum(T_test))^2 / ((60 * sum(T_sim.^2)) - (sum(T_sim))^2 * (60 * sum(T_test.^2)) - (sum(T_test))^2);
% 绘制测试集输出对比图
figure
plot(T_test, 'r*')
hold on
plot(T_sim, 'b:o')
xlabel('测试集样本编号')
ylabel('测试集输出')
title('ELM测试集输出')
grid on;
legend('期望输出', 'DBO-ELM预测输出')
% 显示均方误差和R2分数
disp(['均方误差 (MSE): ', num2str(E)]);
disp(['R^2 分数: ', num2str(R2)]);