基于GOA蚱蜢优化算法的KNN分类器最优特征选择matlab仿真
1.算法仿真效果
matlab2022a仿真结果如下:
2.算法涉及理论知识概要
蝗 虫 优 化 算 法 ( Grasshopper Optimization Algorithm, GOA) 是一种新型的元启发式算法,由 Mirjalili 等人于2017年提出。该算法受幼虫和成年蝗虫大范围移动与寻找食物源的聚集行为启发,具有操作参数少,公式简单的特点。针对基准测试函数优化问题的实验结果表明,GOA的收敛性优于粒子群算法。
2.1 GOA蚱蜢优化
蝗虫优化算法的基本实现步骤
1.初始化最大迭代次数N,种群大小n,变量范围,控制参数的最大值最小值等参数。
2.初始化种群位置,计算初始的个体适应度,并得到最优蝗虫位置与适应度。
3.开始循环(K=1):使用公式(2)、(3)更新参数。使用公式(1)更新蝗虫个体的位置,并检查是否越界。
4.计算每个蝗虫的适应度,更新到目前为止找到的最优食物源(即最优个体位置与适应度)。
5.重复执行步骤3和4,直到满足最大迭代次数,结束循环(K=N)。
6.返回最优的参数取值和最优的适应度值。
1 蝗虫群的位置移动
式中,d dd是表示变量维度,i , j i, ji,j表示蝗虫个体编号,u b d 、 l b d ub_d、lb_dubd、lbd分别表示变量的上限与下限,T d T_dT d表示最优的蝗虫个体位置,d i j d_{ij}dij是两个蝗虫个体之间的欧式距离,c是控制参数,用于平衡算法的全局探索和局部开发。函数s ( ) s( )s()表示两个蝗虫个体之间的交互力影响。
控制参数 c cc 一般设计为线性递减,使得算法具有动态与不确定搜索能力:
式中,c m a x 、 c m i n c_{max}、c_{min}c max 、cmin分别表示递减区间的最大值与最小值,t tt表示当前的迭代次数,T m a x T_{max}T max表示最大迭代次数。
2 蝗虫个体之间的相互影响
2.2 KNN分类器
何谓K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,单从名字来猜想,可以简单粗暴的认为是:分析一个人时,我们不妨观察和他最亲密的几个人。同理的,在判定一个未知事物时,可以观察离它最近的几个样本,这就是KNN(k最近邻)的方法。简单来说,KNN可以看成:有那么一堆你已经知道分类的数据,然后当一个新数据进入的时候,就开始跟训练数据里的每个点求距离,然后挑出离这个数据最近的K个点,看看这K个点属于什么类型,然后用少数服从多数的原则,给新数据归类。
k值通常是采用交叉检验来确定(以k=1为基准),交叉验证(将样本数据按照一定比例,拆分出训练用的数据和验证用的数据,比如6:4拆分出部分训练数据和验证数据),从选取一个较小的K值开始,不断增加K的值,然后计算验证集合的方差,最终找到一个比较合适的K值。
增大k的时候,一般错误率会先降低,因为有周围更多的样本可以借鉴了,分类效果会变好。但注意,当K值更大的时候,错误率会更高。这也很好理解,比如说你一共就35个样本,当你K增大到30的时候,KNN基本上就没意义了。
所以选择K点的时候可以选择一个较大的临界K点,当它继续增大或减小的时候,错误率都会上升。
3.MATLAB核心程序
GrassHopperPositions=round(initialization(N,dim,ub,lb)); GrassHopperFitness = zeros(1,N); fitness_history=zeros(N,Max_iter); position_history=zeros(N,Max_iter,dim); Convergence_curve=zeros(1,Max_iter); Trajectories=zeros(N,Max_iter); cMax=2.079; cMin=0.00004; ........................................................................ [sorted_fitness,sorted_indexes]=sort(GrassHopperFitness); for newindex=1:N Sorted_grasshopper(newindex,:)=GrassHopperPositions(sorted_indexes(newindex),:); end TargetPosition=Sorted_grasshopper(1,:); TargetFitness=sorted_fitness(1); l=2; while l<Max_iter+1 c=cMax-l*((cMax-cMin)/Max_iter); for i=1:size(GrassHopperPositions,1) temp= GrassHopperPositions'; for k=1:2:dim S_i=zeros(2,1); for j=1:N if i~=j Dist=distance(temp(k:k+1,j), temp(k:k+1,i)); r_ij_vec=(temp(k:k+1,j)-temp(k:k+1,i))/(Dist+eps); xj_xi=2+rem(Dist,2); s_ij=((ub(k:k+1) - lb(k:k+1))*c/2)*S_func(xj_xi).*r_ij_vec; S_i=S_i+s_ij; end end S_i_total(k:k+1, :) = S_i; end ........................................................................... fitness_history(i,l)=GrassHopperFitness(1,i); position_history(i,l,:)=GrassHopperPositions(i,:); Trajectories(:,l)=GrassHopperPositions(:,1); if GrassHopperFitness(1,i)<TargetFitness TargetPosition=GrassHopperPositions(i,:); TargetFitness=GrassHopperFitness(1,i); end end Convergence_curve(l)=TargetFitness; disp(['In GOA iteration #', num2str(l), ' , target''s objective = ', num2str(TargetFitness)]) l = l + 1; end if (flag==1) TargetPosition = TargetPosition(1:dim-1); end