变色龙算法(CSA)优化支持向量机原理及Matlab代码

目录

0 引言

1 数学模型

2 优化方式

3 Maltab代码

3.1 伪代码

3.2 CSA主函数代码

3.3 CSA-SVM

4 视频讲解

0 引言

变色龙算法(Chameleon Swarm Algorithm,CSA)是由Malik Shehadeh Braik于2021年提出一种新型智能优化算法,该算法模拟了变色龙在树木、沙漠和沼泽附近寻找食物时的动态行为,该过程包括了变色龙将眼睛旋转到近360◦的视觉范围来定位猎物,并利用它们粘稠的舌头高速发射来抓住猎物。从而在解决问题能全局搜索和精确定位问题解。

1 数学模型

CSA算法对变色龙寻找食物动态行为进行建模,包括了其眼睛旋转到近360◦的视觉范围来定位猎物,并利用它们粘稠的舌头高速发射来抓住猎物的行为建模构建。

1)初始化种群:变色龙基于种群算法,故在初始设定种群上采用随机方式来布置变色龙位置。

式中t为种群数,d为问题维度,l,u为问题维度的上下界限,r为0到1的随机数。

2)寻找猎物:变色龙在觅食过程中的运动行为可以使用位置更新策略进行数学建模.

式中p1和p2为控制探索能力的俩个正数,P为全局变色龙最佳位置,G为个体最佳变色龙位置,r1,r2,r3为0到1的随机数,Pp为变色龙的感知猎物的概率,sgn(rand-0.5)为-1和1,主要影响探索和开发方向,u为迭代函数参数,其公式见Eq(6),γ,α,β是控制勘探和开发能力的三个常数值,分别为2,4,3,t为当前迭代次数,T为最大迭代次数。

3)变色龙的眼睛旋转:变色龙有能力通过眼睛的旋转特征来识别猎物的位置,从而靠近猎物来更新自身位置:

变色龙眼睛选自定位识别猎物位置:y(-)为变色龙各维度平均位置,yr旋转中心,见下式:

旋转中心模型构建:m为变色龙旋转的旋转矩阵,见式(14),yc为中心坐标,见下式:

中心坐标:

旋转矩阵:R为定义各轴的旋转矩阵,见式(16)和(17);Vz1,z2为坐标空间俩个正交向量,θ变色龙眼睛旋转角度,见式(15),

各轴的旋转矩阵:ϕ表示绕x轴,y轴的旋转角度

变色龙眼睛旋转角度:

4)捕食猎物:变色龙定位并接近猎物时,变色龙被认为是最好的变色龙会用舌头攻击猎物更新自身位置

变色龙攻击猎物后位置更新:V为变色龙舌头伸向猎物的速度,a为舌头伸向猎物的加速度,其速度模型均见下式

变色龙舌头伸向猎物的速度:ω为惯性权重,见式(19),p为控制开发能力的参数,c1和c2为控制全局和局部最佳位置变色龙对舌头速度的影响

舌头伸向猎物的加速度:

2 优化方式

前篇对支持向量机(支持向量机原理及matlab代码讲解(分类SVM和回归SVR)-CSDN博客)原理讲解,从支持向量机模型运算过程中,可以了解到模型高维映射核函数参数g和处罚因子c对模型预测结果影响最为重要。因此结合上述CSA原理介绍,可以将这些超参数作为变色龙的种群,每一个种群对应支持向量机的预测值,将这个预测值作为适应度更新变色龙的定位猎物和捕食猎物的活动,更新更佳的位置。

3 Maltab代码

3.1 伪代码

3.2 CSA主函数代码

%%参数
% searchAgents 种群
% dim 问题维度
% ub,lb 问题维度边界
% SYD 适应度函数
% iteMax 最大迭代次数
% rotation 变色龙眼睛旋转函数
% initialization 种群初始化函数


% 初始化种群
chameleonPositions=initialization(searchAgents,dim,ub,lb);

% 评估初始种群的适合度
fit=zeros(searchAgents,1);

for i=1:searchAgents
     fit(i,1)=SYD(chameleonPositions(i,:),net);
     net.trainParam.showWindow = 0;
end

% CSA 参数
fitness=fit; % 随机位置的初始适应度
[fmin0,index]=min(fit);

chameleonBestPosition = chameleonPositions; % 最佳位置初始化
gPosition = chameleonPositions(index,:); % 初始位置

v=0.1*chameleonBestPosition;% 初始速度

v0=0.0*v;

% CSA 的主要参数
rho=1;%管理开发的正数
p1=2;  
p2=2;  
c1=2; 
c2=1.80;  
gamma=2; %
alpha = 4;%  
beta=3;%控制勘探和开发能力的三个常量值 
Pp = 0.1;% 变色龙感知猎物的概率

for t=1:iteMax

    a = 2590*(1-exp(-log(t))); %表示变色龙舌头伸出的速度 
    omega=(1-(t/iteMax))^(rho*sqrt(t/iteMax)) ; %Eq(19)惯性权重
    p1 = 2* exp(-2*(t/iteMax)^2); %p1,p2控制探索能力的两个正数 
    p2 = 2/(1+exp((-t+iteMax/2)/100)) ;
    mu= gamma*exp(-(alpha*t/iteMax)^beta) ;%Eq(6)随着迭代次数的增加而减少的参数

    ch=ceil(searchAgents*rand(1,searchAgents));
    
    % 觅食过程的运动       
    for i=1:searchAgents
        if rand>=Pp
            chameleonPositions(i,:)= chameleonPositions(i,:)+ p1*(chameleonBestPosition(ch(i),:)-chameleonPositions(i,:))*rand()+... 
                     + p2*(gPosition -chameleonPositions(i,:))*rand();% Eq(3)
        else
            for j=1:dim
                chameleonPositions(i,j)=gPosition(j)+mu*((ub(j)-lb(j))*rand+lb(j))*sign(rand-0.50) ;% Eq(3)
            end
        end
    end 

    %(开发)

% 双向旋转 180 度或单向旋转180度(rotation函数来源作者,可不考虑此活动加注释)
[chameleonPositions] = rotation(chameleonPositions, searchAgents, dim);
 

% 变色龙速度更新并寻找食物来源
     for i=1:searchAgents
               
        v(i,:)= omega*v(i,:)+ p1*(chameleonBestPosition(i,:)-chameleonPositions(i,:))*rand +.... 
               + p2*(gPosition-chameleonPositions(i,:))*rand; %Eq (18)      

         chameleonPositions(i,:)=chameleonPositions(i,:)+(v(i,:).^2 - v0(i,:).^2)/(2*a);%Eq(20)    
     end
     v0=v;

     % 边界检查
     for i=1:searchAgents
         if chameleonPositions(i,:)<lb
        chameleonPositions(i,:)=lb;
         elseif chameleonPositions(i,:)>ub
            chameleonPositions(i,:)=ub;
         end
     end

     % 变色龙位置迁移(随机化) 
     for i=1:searchAgents

         ub_=sign(chameleonPositions(i,:)-ub)>0;
         lb_=sign(chameleonPositions(i,:)-lb)<0;
         chameleonPositions(i,:)=(chameleonPositions(i,:).*(~xor(lb_,ub_)))+ub.*ub_+lb.*lb_;
         fit(i,1)=SYD(chameleonPositions(i,:),net);
         net.trainParam.showWindow = 0;
         
         if fit(i)<fitness(i)
          chameleonBestPosition(i,:) = chameleonPositions(i,:); 
          fitness(i)=fit(i);
         end
     end

     [fmin,index]=min(fitness); % 寻找最佳位置  


     if fmin < fmin0
         gPosition = chameleonBestPosition(index,:); 
         fmin0 = fmin;
     end

   cg_curve(t)=fmin0; 
end
 
ngPosition=find(fitness== min(fitness)); 
g_best=chameleonBestPosition(ngPosition(1),:); 
fmin0 =SYD(g_best,net);
net.trainParam.showWindow = 0;

end

3.3 CSA-SVM

1)回归模型:回归模型:变色龙算法优化支持向量机模型(CSA-SVR)

2)分类模型:分类模型:变色龙算法优化支持向量机模型(CSA-SVM)

4 视频讲解

B站搜索:‘ 不想学习的陈成 ’

  • 8
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用变色龙算法(Chameleon Algorithm)优化支持向量机(SVM)回预测的 Python 代码示例: ```python import numpy as np from sklearn.svm import SVR from chameleon import chameleon # 定义适应度函数(SVM回归预测误差) def fitness(x, X, y): clf = SVR(C=x[0], gamma=x[1]) clf.fit(X, y) y_pred = clf.predict(X) return np.mean((y_pred - y) ** 2) # 定义变量取值范围 bounds = np.array([[0.1, 100], [0.0001, 1]]) # 定义数据集 X = np.array([[0, 0], [1, 1], [0, 1], [1, 0]]) y = np.array([0, 1, 1, 0]) # 使用变色龙算法优化 SVM 参数 x_opt, f_opt = chameleon(fitness, bounds, X=X, y=y, max_iter=100, pop_size=20) # 输出优化结果 print('C =', x_opt[0]) print('gamma =', x_opt[1]) print('MSE =', f_opt) ``` 在上述代码,我们使用了 `sklearn` 的 `SVR` 类来训练 SVM 模型,并使用模型的预测误差的均方误差(MSE)作为适应度函数。然后,我们将 `fitness()` 函数和变量取值范围传递给 `chameleon()` 函数,进行变色龙算法优化。最终,我们输出了优化得到的 SVM 参数和预测误差的均方误差。 需要注意的是,上述代码的 `chameleon()` 函数需要使用 `numpy` 库和自定义的 `chameleon.py` 模块,`chameleon.py` 模块可以通过以下方式导入: ```python from chameleon import chameleon ``` 另外,上述代码使用的是一个简单的数据集和较小的参数空间,实际应用需要根据具体问题进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值