• 遗传算法


    前言:

          放假前偷偷跑到杭州玩了几天,虽然没有预料中那么美丽,不过还是很开心,感谢老严的热情款待。回到南京后,距离完成任务就剩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
    

      

      

      

  • 相关阅读:
    积分图像
    [悟] 因上努力,果上随缘(转)
    不要走的太匆忙( 转)
    一个程序员如何快速赚到一百万?(转)
    vi文字处理器
    Linux常用命令
    Hadoop之MapReduce
    Hadoop全分布模式操作
    Hadoop之HDFS
    Hadoop生态系统
  • 原文地址:https://www.cnblogs.com/Rosanna/p/3535335.html
Copyright © 2020-2023  润新知