目录
1. 麻雀搜索算法SSA
(1) 发现者位置更新
(2) 追随者的位置更新
(3) 预警行为
2. 实验数据
3. SSA-SVM算法步骤
4. 代码运行结果
5. 部分代码
麻雀搜索算法( sparrow search algorithm,SSA)是一种新颖的群体优化算法,受麻雀种群的觅食和反捕食行为启发,在2019年提出。将SSA 算法应用到SVM 的参数选择中,以SVM 训练集分类准确率最高为优化目标,选择最优的惩罚因子和核参数,建立SSA-SVM 分类诊断模型。
SSA算法是根据麻雀觅食并逃避捕食者的行为而提出的群智能优化算法,在麻雀觅食的过程中,分为发现者和追随者,发现者在种群中负责寻找食物并为整个麻雀种群提供觅食区域和方向,而追随者则是利用发现者来获取食物。为了获得食物,麻雀通常可以采用发现者和追随者这两种行为策略进行觅食。种群中的个体会监视群体中其他个体的行为,并且该种群中的攻击者会与高摄取量的同伴争夺食物资源,以提高自己的捕食率。此外,当麻雀种群意识到危险时会做出反捕食行为。
式(1)中:t为当前迭代次数;itermax为最大的迭代次数;Xti,j为第i个麻雀在第j维中的位置信息;α∈(0,1]是一个随机数;R2和ST分别表示预警值和安全值,其中,R2∈[0,1],ST∈[0.5,1];Q为服从正态分布的随机数;L为1×d的矩阵,其中该矩阵内每个元素全部为1。
式(2)中:XP为目前发现者所占据的最优位置;Xworst表示当前全局最差的位置;A为1×d的矩阵,其中每个元素随机赋值为1或-1,并且A+=AT(AAT)-1,其中A+为伪逆矩阵。
式(3)中:Xbest为当前的全局最优位置;β为步长控制参数,服从均值为0,方差为1的正态分布的随机数;K是一个随机数,表示麻雀移动的方向同时也是步长控制参数,且K∈[-1,1];fi为当前麻雀个体的适应度值;fg和fw分别为当前全局最佳和最差的适应度值;ε为最小的常数,以避免分母出现零。
算例采用美国西储大学提供的滚动轴承的故障数据来测试麻雀搜索算法SSA优化SVM轴承故障诊断模型的性能。以深沟球轴承SKF6205-2RS驱动端数据作为实验数据,输入轴转速为1797r/min,电机载荷为0HP,信号采样频率为12kHz,分别采集轴承正常状态、内圈故障、滚动体故障、外圈故障4种状态振动信号。将采集到的原始振动信号进行小波基函数为“db11”的三层小波包分解重构,将第3层6个节点(E1~E6)的能量特征值作为特征向量输入诊断模型。每种轴承状态分别选取60组数据(共240个样本),其中45组作为训练样本,15组作为测试样本。
(1)首先确定故障诊断模型的输入、输出。提取故障特征作为诊断模型输入,确定目标输出值。建立训练、测试样本集。
(2)初始化麻雀搜索算法相关参数,包括种群规模、最大迭代次数,SVM参数C、g。
(3)通过交叉验证,对训练样本进行分类,以交叉验证的准确率作为麻雀个体的适应度。保留最优的适应度值及位置信息。
(4)计算预警值,以预警值大小为依据,根据式(1)更新发现者的位置。
(5)根据式(2)更新追随者的位置。
(6)按照式(3)更新意识到危险的麻雀位置,处于种群外围的麻雀会向安全区域靠拢,处在种群中心的麻雀则随机行走以靠近别的麻雀。
(7)计算麻雀个体新位置的适应度值,将更新后的适应度值与原来的最优值进行比较,并更新全
局最优信息。
(8)判断迭代次数是否满足终止条件,如不满足,则重复步骤(3),反之则停止,输出最优参数,将测试集样本输入到最优的SVM模型,输出诊断结果。
SSA.m
function [Best_pos,Best_score,curve]=SSA(pop,Max_iter,lb,ub,dim,fobj)
% SSA优化SVM分类子函数
ST = 0.6;%预警值
PD = 0.7;%发现者的比列,剩下的是加入者
SD = 0.2;%意识到有危险麻雀的比重
PDNumber = pop*PD; %发现者数量
SDNumber = pop - pop*SD;%意识到有危险麻雀数量
if(max(size(ub)) == 1)
ub = ub.*ones(1,dim);
lb = lb.*ones(1,dim);
end
%种群初始化
X0=initialization(pop,dim,ub,lb);
X = X0;
%计算初始适应度值
fitness = zeros(1,pop);
for i = 1:pop
fitness(i) = fobj(X(i,:));
end
[fitness, index]= sort(fitness);%排序
BestF = fitness(1);
WorstF = fitness(end);
GBestF = fitness(1);%全局最优适应度值
for i = 1:pop
X(i,:) = X0(index(i),:);
end
curve=zeros(1,Max_iter);
GBestX = X(1,:);%全局最优位置
X_new = X;
for i = 1: Max_iter
disp(['current iteration is: ', num2str(i)])
BestF = fitness(1);
WorstF = fitness(end);
R2 = rand(1);
for j = 1:PDNumber
if(R2(pop/2))
if(j>(pop - PDNumber)/2 + PDNumber)
X_new(j,:)= randn().*exp((X(end,:) - X(j,:))/j^2);
else
%产生-1,1的随机数
A = ones(1,dim);
for a = 1:dim
if(rand()>0.5)
A(a) = -1;
end
end
AA = A'*inv(A*A');
X_new(j,:)= X(1,:) + abs(X(j,:) - X(1,:)).*AA';
end
end
Temp = randperm(pop);
SDchooseIndex = Temp(1:SDNumber);
for j = 1:SDNumber
if(fitness(SDchooseIndex(j))>BestF)
X_new(SDchooseIndex(j),:) = X(1,:) + randn().*abs(X(SDchooseIndex(j),:) - X(1,:));
elseif(fitness(SDchooseIndex(j))== BestF)
K = 2*rand() -1;
X_new(SDchooseIndex(j),:) = X(SDchooseIndex(j),:) + K.*(abs( X(SDchooseIndex(j),:) - X(end,:))./(fitness(SDchooseIndex(j)) - fitness(end) + 10^-8));
end
end
%边界控制
for j = 1:pop
for a = 1: dim
if(X_new(j,a)>ub)
X_new(j,a) =ub(a);
end
if(X_new(j,a)
代码地址为:
MATLAB代码地址https://mianbaoduo.com/o/bread/YZ6VlZlq