请选择 进入手机版 | 继续访问电脑版

Hello Mat

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3523|回复: 10

14-遗传算法GA优化SVM

[复制链接]

807

主题

953

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
30287
发表于 2019-8-11 12:48:01 | 显示全部楼层 |阅读模式
14-遗传算法GA优化SVM
百度网盘视频链接:https://pan.baidu.com/s/1JOABram0uPgUgBycDp900w 提取码:yp8c
录制的视频是算法底层原理讲解,底层代码实现,方便大家真正掌握算法实质,开发出更加出色的算法。录制视频的初衷是:避免读者朋友利用大把时间学习已有常见算法,本系列视频旨在让读者朋友快速深入了解这些常见算法原理,有更多的时间去研究更加高大上算法(价值)。

具体链接在halcom.cn论坛,联系人QQ:3283892722
该论坛是一个学习交流平台,我会逐一的和大家分享学习。
欢迎大家录制视频,并提交给我,我来设置视频,你可在论坛进行打赏分享。
视频专用播放器:http://halcom.cn/forum.php?mod=viewthread&tid=258&extra=page%3D1
主程序:
  1. clc,clear,close all
  2. warning off
  3. %% 增加路径
  4. addpath(genpath('./GAlib'))
  5. addpath(genpath('./libsvm-3.21'))
  6. tic;   % 计时
  7. %% 构造训练样本和测试样本
  8. load('traffic_double_10.mat')
  9. train_data =[];
  10. train_output_data = [];
  11. test_data=[];
  12. test_output_data=[];
  13. for i=1:10:length(traffic_label)
  14.     train_data =[train_data; traffic(i:i+7,:)];
  15.     train_output_data =[train_output_data; traffic_label(i:i+7,:)];
  16.     test_data =[test_data; traffic(i+8:i+9,:)];
  17.     test_output_data =[test_output_data; traffic_label(i+8:i+9,:)];
  18. end
  19. %% 归一化
  20. for i=1:size(train_data,2)  % 样本归一化
  21.     minmax(i,1) = min(train_data(:,i));
  22.     minmax(i,2) = max(train_data(:,i));
  23.     if isequal(minmax(i,2),minmax(i,1))
  24.         train_data(:,i) = ones(size(train_data,1),1);
  25.         test_data(:,i) = ones(size(test_data,1),1);
  26.     else
  27.         train_data(:,i) = (minmax(i,2)-train_data(:,i))./(minmax(i,2)-minmax(i,1));
  28.         test_data(:,i) = (minmax(i,2)-test_data(:,i))./(minmax(i,2)-minmax(i,1));
  29.     end
  30. end
  31. %% 遗传算法参数初始化
  32. maxgen = 20;                     % 进化代数,即迭代次数
  33. sizepop = 15;                    % 种群规模
  34. pcross = 0.75;                   % 交叉概率选择,0和1之间
  35. pmutation = 0.25;                % 变异概率选择,0和1之间
  36. % 变量坐标取值范围
  37. nvar = 2;                        % 未知量数量
  38. % 染色体设置
  39. lenchrom=nvar;
  40. popmin1 = 0.01;   popmax1 = 5;    % SVM惩罚系数C
  41. popmin2 = 0.01;   popmax2 = 5;    % SVM径向基函数基宽sigma
  42. bound=[popmin1,popmax1;
  43.     popmin2,popmax2];       % 数据范围  
  44. %---------------------------种群初始化------------------------------------
  45. individuals=struct('fitness',zeros(1,sizepop), 'chrom',[]);  %将种群信息定义为一个结构体
  46. avgfitness = [];                      %每一代种群的平均适应度
  47. bestfitness = [];                     %每一代种群的最佳适应度
  48. bestchrom = [];                       %适应度最好的染色体
  49. %% 初始化种群
  50. for i=1:sizepop
  51.     % 随机产生一个种群
  52.     individuals.chrom(i,:)=Code(lenchrom,bound); % 编码(binary和grey的编码结果为一个实数,float的编码结果为一个实数向量)
  53.     x=individuals.chrom(i,:);
  54.     pop.C = x(1);
  55.     pop.sigma = x(2);
  56.     % 计算适应度
  57.     individuals.fitness(i)=fun_libsvm321( pop,train_data,train_output_data,test_output_data, test_data );   % 染色体的适应度
  58. end
  59. %% 找最好的染色体
  60. [bestfitness,bestindex] = max(individuals.fitness);
  61. bestchrom = individuals.chrom(bestindex,:);    % 最好的染色体
  62. % 记录每一代进化中最好的适应度和平均适应度
  63. trace_max = []; trace_mean=[];
  64. %% 迭代求解最佳初始阀值和权值
  65. % 进化开始
  66. for i=1:maxgen
  67.     disp(['迭代次数:  ',num2str(i)])
  68.     % 选择
  69.     individuals=Select(individuals,sizepop);
  70.     % 交叉
  71.     individuals.chrom=Cross(pcross,lenchrom,individuals.chrom,sizepop,bound);
  72.     % 变异
  73.     individuals.chrom=Mutation(pmutation,lenchrom,individuals.chrom,sizepop,i,maxgen,bound);
  74.    
  75.     % 计算适应度
  76.     for j=1:sizepop
  77.         x=individuals.chrom(j,:);        % 解码
  78.         pop.C = x(1);
  79.         pop.sigma = x(2);
  80.         individuals.fitness(j)=fun_libsvm321( pop,train_data,train_output_data,test_output_data, test_data );   % 染色体的适应度
  81.     end
  82.    
  83.     % 找到最小和最大适应度的染色体及它们在种群中的位置
  84.     [newbestfitness,newbestindex]=max(individuals.fitness);
  85.     [worestfitness,worestindex]=min(individuals.fitness);
  86.    
  87.     % 代替上一次进化中最好的染色体
  88.     if bestfitness<newbestfitness
  89.         bestfitness=newbestfitness;
  90.         bestchrom=individuals.chrom(newbestindex,:);
  91.     end
  92.    
  93.     % 剔除最差个体
  94.     individuals.chrom(worestindex,:)=bestchrom; % 剔除最差个体
  95.     avgfitness = mean(individuals.fitness);    % 适应度平均值
  96.    
  97.     trace_max=[trace_max;bestfitness]; %记录每一代进化中最好的适应度
  98.     trace_mean=[trace_mean;avgfitness]; %记录每一代进化中最好的适应度
  99. end

  100. GAtime = toc;  % 计时结束
  101. disp(['CPU计算时间 =  ' num2str(GAtime)])
  102. %% 遗传算法结果分析
  103. figure(1),
  104. plot(trace_max,'b.-','linewidth',2);grid on;
  105. xlabel('迭代次数');ylabel('最优适应度值(精度%)');axis tight;
  106. figure(2),
  107. plot(trace_mean,'b.-','linewidth',2);grid on;
  108. xlabel('迭代次数');ylabel('平均适应度值(精度%)');axis tight;

  109. % 计算适应度值
  110. clc;fprintf('\n');
  111. disp(['最优惩罚因子C =  ' num2str(bestchrom(1))])
  112. disp(['最优径向基函数基宽sigma =  ' num2str(bestchrom(2))])

  113. % SVM向量机训练模型,'libsvm-3.21'
  114. libsvm_options = ['-c ', num2str(bestchrom(1)), ' -g ',num2str(bestchrom(2))];
  115. models = svmtrain(train_output_data,train_data,libsvm_options);
  116. [train_pred_class, train_acc, p] = svmpredict(train_output_data, train_data, models);
  117. figure(3),
  118. plot(train_output_data,'r.-','linewidth',2);axis tight;hold on
  119. plot(train_pred_class,'b.-','linewidth',2);axis tight;
  120. legend('原始训练样本','训练样本预测值');hold off;
  121. title(['训练样本预测精度  ',num2str(train_acc(1)),'%'])

  122. % SVM向量机训练模型,'libsvm-3.21'
  123. [test_pred_class, test_acc, p] = svmpredict(test_output_data, test_data, models);
  124. figure(4),
  125. plot(test_output_data,'r.-','linewidth',2);axis tight;hold on
  126. plot(test_pred_class,'b.-','linewidth',2);axis tight;
  127. legend('原始测试样本','测试样本预测值');hold off;
  128. title(['测试样本预测精度  ',num2str(test_acc(1)),'%'])


  129. %% 移除路径
  130. rmpath(genpath('./GAlib'))
  131. rmpath(genpath('./libsvm-3.21'))
复制代码
选择算子:
  1. function ret=Select(individuals,sizepop)
  2. % 该函数用于进行选择操作
  3. % individuals input    种群信息
  4. % sizepop     input    种群规模
  5. % ret         output   选择后的新种群

  6. %求适应度值倒数   
  7. fitness1=1./individuals.fitness; %individuals.fitness为个体适应度值

  8. %个体选择概率
  9. sumfitness=sum(fitness1);
  10. sumf=fitness1./sumfitness;

  11. %采用轮盘赌法选择新个体
  12. index=[];
  13. for i=1:sizepop   %sizepop为种群数
  14.     pick=rand;
  15.     while pick==0   
  16.         pick=rand;        
  17.     end
  18.     for i=1:sizepop   
  19.         pick=pick-sumf(i);        
  20.         if pick<0        
  21.             index=[index i];            
  22.             break;  
  23.         end
  24.     end
  25. end

  26. %新种群
  27. individuals.chrom=individuals.chrom(index,:);   %individuals.chrom为种群中个体
  28. individuals.fitness=individuals.fitness(index);
  29. ret=individuals;
复制代码
交叉算子:
  1. function ret=Cross(pcross,lenchrom,chrom,sizepop,bound)
  2. %本函数完成交叉操作
  3. % pcorss                input  : 交叉概率
  4. % lenchrom              input  : 染色体的长度
  5. % chrom     input  : 染色体群
  6. % sizepop               input  : 种群规模
  7. % ret                   output : 交叉后的染色体

  8. for i=1:sizepop  %每一轮for循环中,可能会进行一次交叉操作,染色体是随机选择的,交叉位置也是随机选择的,%但该轮for循环中是否进行交叉操作则由交叉概率决定(continue控制)
  9.      % 随机选择两个染色体进行交叉
  10.      pick=rand(1,2);
  11.      while prod(pick)==0
  12.          pick=rand(1,2);
  13.      end
  14.      index=ceil(pick.*sizepop);
  15.      % 交叉概率决定是否进行交叉
  16.      pick=rand;
  17.      while pick==0
  18.          pick=rand;
  19.      end
  20.      if pick>pcross
  21.          continue;
  22.      end
  23.      flag=0;
  24.      while flag==0
  25.          % 随机选择交叉位
  26.          pick=rand;
  27.          while pick==0
  28.              pick=rand;
  29.          end
  30.          pos=ceil(pick.*sum(lenchrom));  %随机选择进行交叉的位置,即选择第几个变量进行交叉,注意:两个染色体交叉的位置相同
  31.          pick=rand; %交叉开始
  32.          v1=chrom(index(1),pos);
  33.          v2=chrom(index(2),pos);
  34.          chrom(index(1),pos)=pick*v2+(1-pick)*v1;
  35.          chrom(index(2),pos)=pick*v1+(1-pick)*v2; %交叉结束
  36.          flag1=test(lenchrom,bound,chrom(index(1),:));  %检验染色体1的可行性
  37.          flag2=test(lenchrom,bound,chrom(index(2),:));  %检验染色体2的可行性
  38.          if flag1*flag2==0
  39.              flag=0;
  40.          else
  41.              flag=1;
  42.          end    %如果两个染色体不是都可行,则重新交叉
  43.      end
  44. end
  45. ret=chrom;
复制代码
变异算子:
  1. function ret=Mutation(pmutation,lenchrom,chrom,sizepop,num,maxgen,bound)
  2. % 本函数完成变异操作
  3. % pcorss                input  : 变异概率
  4. % lenchrom              input  : 染色体长度
  5. % chrom     input  : 染色体群
  6. % sizepop               input  : 种群规模
  7. % opts                  input  : 变异方法的选择
  8. % pop                   input  : 当前种群的进化代数和最大的进化代数信息
  9. % bound                 input  : 每个个体的上限和下限
  10. % maxgen                input  :最大迭代次数
  11. % num                   input  : 当前迭代次数
  12. % ret                   output : 变异后的染色体

  13. for i=1:sizepop   %每一轮for循环中,可能会进行一次变异操作,染色体是随机选择的,变异位置也是随机选择的,
  14.     %但该轮for循环中是否进行变异操作则由变异概率决定(continue控制)
  15.     % 随机选择一个染色体进行变异
  16.     pick=rand;
  17.     while pick==0
  18.         pick=rand;
  19.     end
  20.     index=ceil(pick*sizepop);
  21.     % 变异概率决定该轮循环是否进行变异
  22.     pick=rand;
  23.     if pick>pmutation
  24.         continue;
  25.     end
  26.     flag=0;
  27.     num = 0;
  28.     chrom1 = chrom(i,:);
  29.     while flag==0&&num<=20
  30.         % 变异位置
  31.         pick=rand;
  32.         while pick==0      
  33.             pick=rand;
  34.         end
  35.         pos=ceil(pick*sum(lenchrom));  %随机选择了染色体变异的位置,即选择了第pos个变量进行变异
  36.    
  37.         pick=rand; %变异开始     
  38.         fg=(rand*(1-num/maxgen))^2;
  39.         if pick>0.5
  40.             chrom(i,pos)=chrom(i,pos)+(bound(pos,2)-chrom(i,pos))*fg;
  41.         else
  42.             chrom(i,pos)=chrom(i,pos)-(chrom(i,pos)-bound(pos,1))*fg;
  43.         end   %变异结束
  44.         flag=test(lenchrom,bound,chrom(i,:));     %检验染色体的可行性
  45.          num = num+1;  % 检验次数设置
  46.     end
  47.     if num>20         % 如果大于20次,则不变异
  48.         chrom(i,:) = chrom1;
  49.     end
  50. end
  51. ret=chrom;
复制代码
Code初始化种群:
  1. function ret=Code(lenchrom,bound)
  2. %本函数将变量编码成染色体,用于随机初始化一个种群
  3. % lenchrom   input : 染色体长度
  4. % bound      input : 变量的取值范围
  5. % ret        output: 染色体的编码值

  6. flag=0;
  7. while flag==0
  8.     pick=rand(1,lenchrom);
  9.     ret=bound(:,1)'+(bound(:,2)-bound(:,1))'.*pick; %线性插值,编码结果以实数向量存入ret中
  10.     flag=test(lenchrom,bound,ret);     %检验染色体的可行性
  11. end
复制代码
范围约束判断:
  1. function flag=test(lenchrom,bound,code)
  2. % lenchrom   input : 染色体长度
  3. % bound      input : 变量的取值范围
  4. % code       output: 染色体的编码值

  5. flag=1;
  6. for i=1:lenchrom
  7.     if code(i)<bound(i,1)||code(i)>bound(i,2)
  8.         flag=0;
  9.     end
  10. end   
复制代码
适应度函数:
游客,如果您要查看本帖隐藏内容请回复










算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复

使用道具 举报

0

主题

17

帖子

93

积分

注册会员

Rank: 2

积分
93
发表于 2019-10-22 19:26:35 | 显示全部楼层
dhasd ajda;skd;askdlas;d
回复 支持 反对

使用道具 举报

0

主题

3

帖子

61

积分

注册会员

Rank: 2

积分
61
发表于 2020-2-20 01:11:10 | 显示全部楼层
谢谢,学习学习。
回复 支持 反对

使用道具 举报

0

主题

17

帖子

233

积分

中级会员

Rank: 3Rank: 3

积分
233
发表于 2020-3-8 15:22:31 | 显示全部楼层
谢谢楼主的分享
回复 支持 反对

使用道具 举报

0

主题

2

帖子

43

积分

新手上路

Rank: 1

积分
43
发表于 2020-4-19 10:33:46 | 显示全部楼层
不错看完以后真的很有用感谢
回复 支持 反对

使用道具 举报

1

主题

8

帖子

36

积分

新手上路

Rank: 1

积分
36
发表于 2020-5-7 20:50:26 | 显示全部楼层
好棒,谢谢分享,我会好好学习的
回复 支持 反对

使用道具 举报

0

主题

2

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2020-7-5 17:42:24 | 显示全部楼层
谢谢楼主分享。赞。
回复 支持 反对

使用道具 举报

0

主题

11

帖子

59

积分

注册会员

Rank: 2

积分
59
发表于 2020-7-14 10:30:32 | 显示全部楼层
感谢楼主分享,认真学习:lol
回复 支持 反对

使用道具 举报

0

主题

8

帖子

89

积分

注册会员

Rank: 2

积分
89
发表于 2020-7-15 14:28:07 | 显示全部楼层
谢谢楼主!!
回复

使用道具 举报

0

主题

7

帖子

46

积分

新手上路

Rank: 1

积分
46
发表于 2020-7-22 16:01:21 | 显示全部楼层
感谢楼主 学习一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Python|Opencv|MATLAB|Halcom.cn  

GMT+8, 2020-8-6 18:04 , Processed in 0.133864 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表