目录
摘要
背影
Eggholder测试函数
MATALB编程 测试函数代码
麻雀算法原理
麻雀算法主要参数
麻雀算法流程图
麻雀算法优化测试函数代码
基于麻雀算法改进的SVM电器启动识别
matlab编程实现
效果图
结果分析
展望
摘要
麻雀算法理论,SSA-SVM,电器启动识别,测试函数Eggholder
背影
现代社会进入智能化社会,家用电器实现联网,远程控制开启是社会的发展趋势,电器启动识别是实现智能家居的必然要求之一,本文基于麻雀算法改进SVM对电器启动实现识别
Eggholder测试函数
函数特点
Eggholder函数是一个难以优化的函数,因为存在大量的局部极小值,并且波峰波谷陡峭,比较容易陷入局部最优,是测试各种算法的一个较好的函数,测试效果好就能说明算法性能优异,参数设置合理,同时能检验一个程序员是否真正掌握算法的精髓。一种新型的群智能优化算法,在2020年提出,主要是受麻雀的觅食行为和反捕食行为的启发,在麻雀觅食的过程中,分为发现者(探索者)和加入者(追随者),发现者在种群中负责寻找食物并为整个麻雀种群提供觅食区域和方向,而加入者则是利用发现者来获取食物。为了获得食物,麻雀通常可以采用发现者和加入者这两种行为策略进行觅食。种群中的个体会监视群体中其它个体的行为,并且该种群中的攻击者会与高摄取量的同伴争夺食物资源,以提高自己的捕食率。此外,当麻雀种群意识到危险时会做出反捕食行为,本文用麻雀算法ssa对Eggholder进行优化求解以验证麻雀算法的性能其中,
测试函数Eggholder图像如下:
MATALB编程的Eggholder函数代码如下:
clc
clear
close all
clc
clear
close all
[x,y]= meshgrid(-500:2:500);
[mx,my] = size(x);
z = zeros(size(x));
for ii = 1:mx
for jj = 1:my
z(ii,jj) = eggholderfun(x(ii,jj),y(ii,jj));
end
end
figure
surfc(x,y,z)
shading interp
xlabel(‘x’)
ylabel(‘y’)
zlabel(‘f’)
colormap(jet)
view([112 18])
set(gca,‘fontsize’,12)
axis([-600
function [y] = eggholderfun(x1,x2)
term1 = -(x2+47) * sin(sqrt(abs(x2+x1/2+47)));
term2 = -x1 * sin(sqrt(abs(x1-(x2+47))));
y = term1 + term2;
end
麻雀算法SSA的原理
主要公式
在SSA中,具有较好适应度值的发现者在搜索过程中会优先获取食物。此外,因为发现者负责为整个麻雀种群寻找食物并为所有加入者提供觅食的方向。因此,发现者可以获得比加入者更大的觅食搜索范围。在每次迭代的过程中,发现者的位置更新描述如下:
其中,t代表当前迭代数,itermax是一个常数,表示最大的迭代次数。Xij表示第i个麻雀在第j维中的位置信息。α∈(0,1]是一个随机数。R2(R2∈[0,1])和ST(ST∈[0.5,1])分别表示预警值和安全值。Q是服从正态分布的随机数。L表示一个1×d的矩阵,其中该矩阵内每个元素全部为1。当R2< ST 时,这意味着此时的觅食环境周围没有捕食者,发现者可以执行广泛的搜索操作。当R2 ≥ ST,这表示种群中的一些麻雀已经发现了捕食者,并向种群中其它麻雀发出了警报,此时所有麻雀都需要迅速飞到其它安全的地方进行觅食。
加入者(追随者)的位置更新描述如下:
其中,Xp是目前发现者所占据的最优位置,Xworst则表示当前全局最差的位置。A表示一个1×d的矩阵,其中每个元素随机赋值为1或-1,并且A+=AT(AAT)-1。当i >n/2时,这表明,适应度值较低的第i个加入者没有获得食物,处于十分饥饿的状态,此时需要飞往其它地方觅食,以获得更多的能量。
当意识到危险时,麻雀种群会做出反捕食行为,其数学表达式如下:
其中,其中Xbest是当前的全局最优位置。β作为步长控制参数,是服从均值为0,方差为1的正态分布的随机数。K∈[-1,1]是一个随机数,fi则是当前麻雀个体的适应度值。fg和fw分别是当前全局最佳和最差的适应度值。ε是最小的常数,以避免分母出现零。
为简单起见,当fi >fg表示此时的麻雀正处于种群的边缘,极其容易受到捕食者的攻击。fi = fg时,这表明处于种群中间的麻雀意识到了危险,需要靠近其它的麻雀以此尽量减少它们被捕食的风险。K表示麻雀移动的方向同时也是步长控制参数。
麻雀算法SSA的主要参数:
一、种群个数popsize,既算法中麻雀的个数;
二、最大迭代次数maxgen,既算法迭代gen次后停止迭代;
三、种群维度dim,既需要优化的自变量个数;
四、种群位置pop,既每个麻雀的对应的自变量的值,一个麻雀对应一组自变量,相当于一个解;
五、发现者比例P_percent,既麻雀算法发现者占所有麻雀的比例;
六、安全值ST,既这意味着此时的觅食环境周围没有捕食者;
麻雀算法流程图
麻雀算法SSA优化测试函数Eggholder的MATLAB代码如下:
% 清空环境
clc
clear
close all
warning off
%读取数据
fun = @eggholderfun;
dim=2;
maxgen=50; % 进化次数
sizepop=500; %种群规模
popmax=512 ;
popmin=-512;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
P_percent = 0.2; % The population size of producers accounts for “P_percent” percent of the total population size
pNum = round( sizepop * P_percent ); % The population size of the producers
beta=20;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:sizepop
pop(i,:)=2popmaxrand(1,dim)+popmin;
% V(i,:)=rands(1,21);
fitness(i)=fun(pop(i,1),pop(i,2));
end
pop0=pop;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
pFit = fitness;
[ fMin, bestI ] = min( fitness ); % fMin denotes the global optimum fitness value
bestX = pop( bestI, : ); % bestX denotes the global optimum position corresponding to fMin
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%麻雀搜索算法 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for t = 1 : maxgen
[ ans, sortIndex ] = sort( pFit );% Sort.
[fmax,B]=max( pFit );
worse= pop(B,:);
r2=rand(1);
if(r2<0.8)
for i = 1 : pNum % Equation (3)
r1=rand(1);
pop( sortIndex( i ), : ) = pop( sortIndex( i ), : )*exp(-(i)/(r1*maxgen));
for hh = 1:2
if pop( sortIndex( i ),hh)>popmax
pop( sortIndex( i ),hh)=popmax;
elseif pop( sortIndex( i ),hh)<popmin
pop( sortIndex( i ),hh)=popmin;
end
end
fitness(sortIndex( i ))=fun(pop(sortIndex( i ),1),pop(sortIndex( i ),2));
end
else
for i = 1 : pNum
pop( sortIndex( i ), : ) = pop( sortIndex( i ), : )+(beta*rand(1,dim)-beta/2).*ones(1,dim);
for hh = 1:2
if pop( sortIndex( i ),hh)>popmax
pop( sortIndex( i ),hh)=popmax;
elseif pop( sortIndex( i ),hh)<popmin
pop( sortIndex( i ),hh)=popmin;
end
end
fitness(sortIndex( i ))=fun(pop(sortIndex( i ),1),pop(sortIndex( i ),2));
end
end
[ fMMin, bestII ] = min( fitness );
bestXX = pop( bestII, : );
for i = ( pNum + 1 ) : sizepop % Equation (4)
A=floor(rand(1,dim)*2)*2-1;
if( i>(sizepop/2))
pop( sortIndex(i ), : )=rand(1)*exp((worse-pop( sortIndex( i ), : ))/(i)^2);
else
pop( sortIndex( i ), : )=bestXX+(abs(( pop( sortIndex( i ), : )-bestXX)))*(A'*(A*A')^(-1))*ones(1,dim);
end
for hh = 1:2
if pop( sortIndex( i ),hh)>popmax
pop( sortIndex( i ),hh)=popmax;
elseif pop( sortIndex( i ),hh)<popmin
pop( sortIndex( i ),hh)=popmin;
end
end
fitness(sortIndex( i ))=fun(pop(sortIndex( i ),1),pop(sortIndex( i ),2));
end
c=randperm(numel(sortIndex));
b=sortIndex(c(1:3));
for j = 1 : length(b) % Equation (5)
if( pFit( sortIndex( b(j) ) )>(fMin) )
pop( sortIndex( b(j) ), : )=bestX+beta*(randn(1,dim)).*(abs(( pop( sortIndex( b(j) ), : ) -bestX)));
else
pop( sortIndex( b(j) ), : ) =pop( sortIndex( b(j) ), : )+(beta*(2*rand(1)-1))*(abs(pop( sortIndex( b(j) ), : )-worse))/ ( pFit( sortIndex( b(j) ) )-fmax+1e-50);
end
for hh = 1:2
if pop( sortIndex( i ),hh)>popmax
pop( sortIndex( i ),hh)=popmax;
elseif pop( sortIndex( i ),hh)<popmin
pop( sortIndex( i ),hh)=popmin;
end
end
fitness(sortIndex( i ))=fun(pop(sortIndex( i ),1),pop(sortIndex( i ),2));
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i = 1 : sizepop
if ( fitness( i ) < pFit( i ) )
pFit( i ) = fitness( i );
pop(i,:) = pop(i,:);
end
if( pFit( i ) < fMin )
fMin= pFit( i );
bestX =pop( i, : );
end
end
yy(t)=fMin;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 迭代寻优
x=bestX
%% 结果分析
plot(yy)
title(['适应度曲线 ’ ‘终止代数=’ num2str(maxgen)]);
xlabel(‘进化代数’);ylabel(‘适应度’);
[x,y]= meshgrid(-500:2:500);
[mx,my] = size(x);
z = zeros(size(x));
for ii = 1:mx
for jj = 1:my
z(ii,jj) = eggholderfun(x(ii,jj),y(ii,jj));
end
end
figure
surf(x,y,z)
shading interp
hold on
plot3(pop(:,1),pop(:,2),fitness,‘ro’)
xlabel(‘x’)
ylabel(‘y’)
zlabel(‘f’)
colormap(jet)
view([112 18])
set(gca,‘fontsize’,12)
axis([-600 600 -600 600 -1000 1500])
title(‘SSA收敛后种群分布’)
figure
surf(x,y,z)
shading interp
hold on
plot3(pop0(:,1),pop0(:,2),fitness,‘ro’)
xlabel(‘x’)
ylabel(‘y’)
zlabel(‘f’)
colormap(jet)
view([112 18])
set(gca,‘fontsize’,12)
axis([-600 600 -600 600 -1000 1500])
title(‘SSA初始种群分布’)
麻雀算法ssa优化eggholder函数结果图如下:
通过测试函数可以看出来,麻雀算法可以拥有很好的优化能力,寻优能力比较钱,不易陷入局部最优。
麻雀算法改进的SVM电器启动识别
SVM的参数c和g对SVM的分类精度影响很大,并且很多时候,参数c和g的响应分布并不平滑,很难通过试凑法找到最佳的参数,所以用麻雀算法来寻找最佳的参数c和g,
MATALB编程代码如下;
%% 清空环境变量
close all;
clear;
clc;
format compact;
%% 数据提取
% 载入测试数据wine,其中包含的数据为classnumber = 3,wine:17813的矩阵,wine_labes:1781的列向量
load data1.mat;
data=tz;
k=rand(1,length(data));
[m,n]=sort(k);
m1=floor(length(m)*0.8); %80%作为训练集
%% 输入输出数据
input=data(:,1:end-1);
output=data(:,end);
%抽取前80%个样本为训练样本,后20%个样本为预测样本
input_train=input(n(1:m1)😅‘; %行为样本列为特征点
label_train=output(n(1:m1)😅’;%类似于标签
input_test=input(n(m1+1:end)😅‘;
label_test=output(n(m1+1:end)😅’;
train_wine_labels=label_train’;
test_wine_labels=label_test’;
%% 数据预处理
% 数据预处理,将训练集和测试集归一化到[0,1]区间
train_wine=input_train’;
test_wine=input_test’;
[mtrain,ntrain] = size(train_wine);
[mtest,ntest] = size(test_wine);
dataset = [train_wine;test_wine];
% mapminmax为MATLAB自带的归一化函数
[dataset_scale,ps] = mapminmax(dataset’,0,1);
dataset_scale = dataset_scale’;
train_wine = dataset_scale(1:mtrain,:);
test_wine = dataset_scale( (mtrain+1):(mtrain+mtest),: );
tic
% [ BPoutput,bpyk ,bpzhunlv] = bpfun(input_train,label_train,input_test,label_test );
BPtime = toc;
tic
[ yy,svmyk,svmzhunlv] = svmfun(train_wine_labels, train_wine, test_wine, test_wine_labels)
SVMtime=toc;
%% 智能算法优化SVM训练,若使用网络训练将这部分与下面优化部分删除即可。
tic
%% 麻雀参数设置
% 定义优化参数的个数,在该场景中,优化参数的个数dim为2 。
% 定义优化参数的上下限,如c的范围是[0.01, 1], g的范围是[2^-5, 2^5],那么参数的下限lb=[0.01, 2^-5];参数的上限ub=[1, 2^5]。
%目标函数
fun = @getObjValue;
% 优化参数的个数 (c、g)
dim = 2;
% 优化参数的取值下限
lb = [0.01, 0.01];
ub = [1000, 1000];
%% 参数设置
pop =100; %麻雀数量
Max_iteration=50;%最大迭代次数
%% 优化(这里主要调用函数)
[Best_pos,Best_score,curve]=SSA(pop,Max_iteration,lb,ub,dim,fun);
c = Best_pos(1, 1);
g = Best_pos(1, 2);
ssatime = toc;
% 用优化得到c,g训练和测试
cmd = ['-s 0 -t 2 ', '-c ', num2str©, ’ -g ‘, num2str(g), ’ -q’];
model = libsvmtrain(train_wine_labels, train_wine, cmd);
%% SVM网络预测
[predict_label, accuracy,decision_values] = libsvmpredict(test_wine_labels, test_wine, model);
% %% 结果分析
% figure;
% hold on;
% plot(test_wine_labels,‘o’);
% plot(predict_label,‘r*’);
% xlabel(‘测试集样本’,‘FontSize’,12);
% ylabel(‘类别标签’,‘FontSize’,12);
% legend(‘实际测试集分类’,‘预测测试集分类’);
% title(‘测试集的实际分类和预测分类图’,‘FontSize’,12);
% grid on;
disp([‘最终预测准确率:’,num2str(accuracy(1))])
[ssayk] = kappafun(test_wine_labels,predict_label,6)
yy=predict_label;
label_test=test_wine_labels;
tic
mainga
timegaelm= toc;
%% 制图_预测分类标签和实际分类标签对比图
figure
plot(yy,‘og’)
hold on
plot(label_test,‘r*’);
legend(‘预测标签’,‘实际标签’)
title(‘SSA-SVM预测分类与实际类别比对’,‘fontsize’,12)
ylabel(‘类别标签’,‘fontsize’,12)
xlabel(‘样本数目’,‘fontsize’,12)
ylim([0.5 6.5])
%% 混淆矩阵制图
[cfmat,order] = confusionmat(label_test,yy’);
mat=cfmat;
k=6;
figure
imagesc(mat); %# Create a colored plot of the matrix values
colormap(flipud(gray)); %# Change the colormap to gray (so higher values are
title(‘SSA-SVM混淆矩阵’);
textStrings = num2str(mat(😃,‘%0.02f’); %# Create strings from the matrix values
textStrings = strtrim(cellstr(textStrings)); %# Remove any space padding
[x,y] = meshgrid(1:k);
hStrings=text(x(😃,y(😃,textStrings(😃,‘HorizontalAlignment’,‘center’);
midValue = mean(get(gca,‘CLim’)); %# Get the middle value of the color range
textColors = repmat(mat(😃 > midValue,1,3);
set(hStrings,{‘Color’},num2cell(textColors,2)); %# Change the text colors;
set(gca,‘XTick’,1:6,…
‘XTickLabel’,{‘1’,‘2’,‘3’,‘4’,‘5’,‘6’},… %# and tick labels
‘YTick’,1:6,… %同上
‘YTickLabel’,{‘1’,‘2’,‘3’,‘4’,‘5’,‘6’},…
‘TickLength’,[0 0]);
% 麻雀优化算法 %
%_________________________________________________________________________%
function [Best_pos,Best_score,curve]=SSA(pop,Max_iter,lb,ub,dim,fobj)
ST = 0.6;%预警值
PD = 0.7;%发现者的比列,剩下的是加入者
SD = 0.2;%意识到有危险麻雀的比重
PDNumber = popPD; %发现者数量
SDNumber = pop - popPD;%意识到有危险麻雀数量
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
BestF = fitness(1);
WorstF = fitness(end);
R2 = rand(1);
for j = 1:PDNumber
if(R2<ST)
X_new(j,:) = X(j,:).*exp(-j/(rand(1)*Max_iter));
else
X_new(j,:) = X(j,:) + randn()*ones(1,dim);
end
end
for j = PDNumber+1:pop
% if(j>(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(AA’);
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 = 2rand() -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)<lb)
X_new(j,a) =lb(a);
end
end
end
%更新位置
for j=1:pop
fitness_new(j) = fobj(X_new(j,:));
end
for j = 1:pop
if(fitness_new(j) < GBestF)
GBestF = fitness_new(j);
GBestX = X_new(j,:);
end
end
X = X_new;
fitness = fitness_new;
%排序更新
[fitness, index]= sort(fitness);%排序
BestF = fitness(1);
WorstF = fitness(end);
for j = 1:pop
X(j,:) = X(index(j)😅;
end
curve(i) = GBestF;
end
Best_pos =GBestX;
Best_score = curve(end);
end
效果图
结果分析
从效果图上,可以看出来,麻雀算法改进的SVM,分类准确率更高,说明改进方法确实有效
展望
SVM是一种很好的分类识别器,可以改进的方法很多,主要是优化参数,其中,鲸鱼算法,狮群算法天鹰算法等相对较新,也可以通过和其他神经融合,优势互补,达到改进的目的,部分改进方式如下,有需要可以扫描二维码联系