遗传算法
前言:
放假前偷偷跑到杭州玩了几天,虽然没有预料中那么美丽,不过还是很开心,感谢老严的热情款待。回到南京后,距离完成任务就剩3天时间,而且师兄逼的很紧,于是夜以继日,实现了对比算法《Multimodal Sparse Representation-Based Classification for Lung Needle Biopsy Images》(Google学术搜索)。
遗传算法虽然如雷贯耳,但是一直未有接触,此次从零开始,看算法、看论文,对了,还要招待从云南回来的基友。时间虽然很紧,但是最后还是圆满完成任务,得以回家过年,感觉很充实。
网上有很多GA的参考文章,我就不画蛇添足了,但大多数文章只是给出的很简单函数的例子,浅尝辄止,目标函数太过简单,感觉很不过瘾。于是乎我将我实现的本篇文章的matlab代码记录于此,写的很乱,轻喷。
文章的大意是通过肺细胞的形状、颜色和纹理,利用SRC学习构造3个子字典(代码中是4个模态),然后分别对测试样本做预测,最后通过mSRC进行分类。
主函数:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Copyright (c) 2014 七年之后. All rights reserved.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Name: main.m
%省略数据集预处理
for loop = 1:20 %循环20次,得到20个结果取平均值
n=train_num*class_num; %beta字符串长度,即训练样本个数
beta1=round(rand(K,n)); %随机01字符串,K为种群大小
beta2=round(rand(K,n));
beta3=round(rand(K,n));
beta4=round(rand(K,n));
%产生初始群体
Dict=tr_dat(:,:,:);
for g=1:G %G为迭代次数
g
kappa=[0.001];
lambda=0.1;
%更新beta
newbeta1=beta1;
newbeta2=beta2;
newbeta3=beta3;
newbeta4=beta4;
newtrls1=[];
newtrls2=[];
newtrls3=[];
newtrls4=[];
%%%%% 更新子字典 %%%%%%
Dict1=[];
Dict2=[];
Dict3=[];
Dict4=[];
fit=[]; %适应值
for i=1:K %K个种群
%Dict为样本集,分别构造4个模态下的子字典
for j=1:n %n个样本
if(newbeta1(i,j)==1)
Dict1=[Dict1,Dict(:,j,1)];
newtrls1=[newtrls1,trls(j)]; %训练样本标记
end
if(newbeta2(i,j)==1)
Dict2=[Dict2,Dict(:,j,2)];
newtrls2=[newtrls2,trls(j)];
end
if(newbeta3(i,j)==1)
Dict3=[Dict3,Dict(:,j,3)];
newtrls3=[newtrls3,trls(j)];
end
if(newbeta4(i,j)==1)
Dict4=[Dict4,Dict(:,j,4)];
newtrls4=[newtrls4,trls(j)];
end
end
%%%%%% 稀疏编码,计算fitness %%%%%
count1=0;
count2=0;
for j=1:n %n训练样本个数
%稀疏编码分类,此处省略,id分别为预测值
if(id1==trls(j)||id2==trls(j)||id3==trls(j)||id4==trls(j))
count1=count1+1;
end
if(id1==id2||id1==id3||id1==id4||id2==id3||id2==id4||id3==id4)
count2=count2+1;
end
end
fitvalue=1/n*count1+1/n*lambda*(4-count2);
fit=[fit,fitvalue];
end
if(g~=G) %最后一次跳出循环
newbeta1=[];
newbeta2=[];
newbeta3=[];
newbeta4=[];
%newbeta增加一列,然后按照fitness排序
newbeta1=[beta1(:,:),fit'];
newbeta2=[beta2(:,:),fit'];
newbeta3=[beta3(:,:),fit'];
newbeta4=[beta4(:,:),fit'];
newbeta1=sortrows(newbeta1,n+1);
newbeta2=sortrows(newbeta2,n+1);
newbeta3=sortrows(newbeta3,n+1);
newbeta4=sortrows(newbeta4,n+1);
%去掉fitness
newbeta1(:,n+1)=[];
newbeta2(:,n+1)=[];
newbeta3(:,n+1)=[];
newbeta4(:,n+1)=[];
%去掉fitness小的种群
newbeta1(K/2+1:K,:)=[];
newbeta2(K/2+1:K,:)=[];
newbeta3(K/2+1:K,:)=[];
newbeta4(K/2+1:K,:)=[];
%交叉变异
[newbeta1]=crossover(newbeta1,pc);%交叉
[newbeta1]=mutation(newbeta1,pm);%变异
[newbeta2]=crossover(newbeta2,pc);%交叉
[newbeta2]=mutation(newbeta2,pm);%变异
[newbeta3]=crossover(newbeta3,pc);%交叉
[newbeta3]=mutation(newbeta3,pm);%变异
[newbeta4]=crossover(newbeta4,pc);%交叉
[newbeta4]=mutation(newbeta4,pm);%变异
%随机增加K/2个染色体
add_beta1=round(rand(K/2,n));
add_beta2=round(rand(K/2,n));
add_beta3=round(rand(K/2,n));
add_beta4=round(rand(K/2,n));
newbeta1=[newbeta1;add_beta1];
newbeta2=[newbeta2;add_beta2];
newbeta3=[newbeta3;add_beta3];
newbeta4=[newbeta4;add_beta4];
end
end
%选一个最大的beta构造最终子字典
maxindex=find(fit==max(fit)); %最大fitness下标
lastbeta1=newbeta1(maxindex,:);
lastbeta2=newbeta2(maxindex,:);
lastbeta3=newbeta3(maxindex,:);
lastbeta4=newbeta4(maxindex,:);
%%%%%% 最终子字典 %%%%%%
Dict1=[];
Dict2=[];
Dict3=[];
Dict4=[];
%样本标记
Drls1=[];
Drls2=[];
Drls3=[];
Drls4=[];
for j=1:n %样本
if(lastbeta1(j)==1)
Dict1=[Dict1,Dict(:,j,1)];
Drls1=[Drls1,floor(j/train_num)+1];
end
if(lastbeta2(j)==1)
Dict2=[Dict2,Dict(:,j,2)];
Drls2=[Drls2,floor(j/train_num)+1];
end
if(lastbeta3(j)==1)
Dict3=[Dict3,Dict(:,j,3)];
Drls3=[Drls3,floor(j/train_num)+1];
end
if(lastbeta4(j)==1)
Dict4=[Dict4,Dict(:,j,4)];
Drls4=[Drls4,floor(j/train_num)+1];
end
end
count=0; %统计分类正确个数
% mSRC分类,此处省略
right_num=[right_num,count/length(ttls)]
end
交叉函数:
%Name: crossover.m %交叉
function [newpop]=crossover(pop,pc) %pc是交叉概率
[rows,cols]=size(pop);
newpop=pop(:,:);
for i=1:2:rows-1
if(rand<pc)
cpoint=round(rand*cols);
newpop(i,:)=[pop(i,1:cpoint),pop(i+1,cpoint+1:cols)];
newpop(i+1,:)=[pop(i+1,1:cpoint),pop(i,cpoint+1:cols)];
end
end
变异函数:
%Name: mutation.m %变异
function [newpop]=mutation(pop,pm) %pm是变异概率
[rows,cols]=size(pop);
newpop=pop(:,:);
for i=1:rows
if(rand<pm)
mpoint=round(rand*cols);
if mpoint<=0
mpoint=1;
end
newpop(i)=pop(i);
if any(newpop(i,mpoint))==0
newpop(i,mpoint)=1;
else
newpop(i,mpoint)=0;
end
end
end

浙公网安备 33010602011771号