【matlab】分类回归——智能优化算法极限学习机

目录

引言

基本原理

主要特点

应用领域

发展趋势

智能优化算法——蜣螂优化算法(DBO)

算法原理

 算法特点

应用前景

代码实现

ELM训练函数——elmtrain 函数

ELM预测函数——elmpredict 函数

适应度函数

主函数


引言

极限学习机(Extreme Learning Machine,ELM)是一种单隐层前馈神经网络(SLFNs)的学习算法,由黄广斌教授于2004年提出。ELM以其训练速度快、泛化能力强、易于实现等优点,在模式识别、回归预测、数据挖掘等领域得到了广泛的应用。

基本原理

ELM的基本原理是通过随机化选择输入层到隐层的连接权重(input weights)和隐层神经元的偏置(biases),并且这些参数在训练过程中保持不变。然后,通过求解一个线性系统来确定输出权重(output weights),从而使得网络的输出能够尽可能地逼近训练样本的标签或目标值。

推导过程参考:极限学习机(ELM)的原理和matlab代码实现-CSDN博客

主要特点
  1. 训练速度快:由于ELM的输入权重和偏置是随机生成的,并且在训练过程中保持不变,因此ELM的训练过程主要集中在求解输出权重上,这通常可以通过解一个线性方程组来高效完成。

  2. 泛化能力强:ELM的随机化特性使得它在训练过程中能够避免过拟合问题,因此具有较好的泛化能力。此外,ELM还可以通过调整隐层神经元的数量来平衡模型的复杂性和泛化能力。

  3. 易于实现:ELM算法简单易懂,实现起来相对容易。同时,由于ELM的训练过程不需要迭代调整参数,因此可以很容易地与其他算法进行结合使用。

应用领域

ELM已经成功应用于多个领域,包括:

  • 模式识别:如人脸识别、手写数字识别等。
  • 回归预测:如股票价格预测、气象预测等。
  • 数据挖掘:如聚类分析、异常检测等。
  • 生物信息学:如基因表达数据分析、蛋白质结构预测等。
发展趋势

随着深度学习、强化学习等技术的不断发展,ELM也在不断地进行改进和扩展。例如,一些研究者提出了基于ELM的深度学习模型,通过增加多个隐层来提高模型的表达能力和泛化能力。此外,还有一些研究者将ELM与其他优化算法相结合,如遗传算法、粒子群算法等,以进一步提高ELM的性能和稳定性。

总之,极限学习机作为一种高效、简单且泛化能力强的学习算法,在多个领域都有着广泛的应用前景。随着技术的不断发展,ELM的性能和应用范围也将得到进一步的提升和扩展。

蜣螂优化算法(Dung Beetle Optimizer, DBO)是一种新型的群智能优化算法,其灵感来源于蜣螂(俗称屎壳郎)的滚球、跳舞、觅食、偷窃和繁殖等自然行为。以下是关于蜣螂优化算法的详细介绍:

智能优化算法——蜣螂优化算法(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;

代码实现

ELM训练函数——elmtrain 函数

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';
ELM预测函数——elmpredict 函数

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)]);

你可能感兴趣的:(机器学习,智能优化算法,算法,回归,数据挖掘)