1. 程式人生 > >SVM三種尋優方法matlab程式碼 grid search、GA、PSO

SVM三種尋優方法matlab程式碼 grid search、GA、PSO

  1. function [bestCVaccuarcy,bestc,bestg,pso_option] = psoSVMcgForClass(train_label,train,pso_option)
  2. % psoSVMcgForClass
  3. %%
  4. % by faruto
  5. %Email:[email protected] QQ:516667408 http://blog.sina.com.cn/faruto BNU
  6. %last modified 2010.01.17
  7. %% 若轉載請註明:
  8. % faruto and liyang , LIBSVM-farutoUltimateVersion 
  9. % a toolbox with implements for support vector machines based on libsvm, 2009. 

  10. % Chih-Chung Chang and Chih-Jen Lin, LIBSVM : a library for
  11. % support vector machines, 2001. Software available at
  12. % http://www.csie.ntu.edu.tw/~cjlin/libsvm
  13. %% 引數初始化
  14. if nargin == 2
  15.     pso_option = struct('c1',1.5,'c2',1.7,'maxgen',200,'sizepop',20, ...
  16.         'k',0.6,'wV',1,'wP',1,'v',5, ...
  17.         'popcmax',10^2,'popcmin',10^(-1),'popgmax',10^3,'popgmin',10^(-2));
  18. end
  19. % c1:初始為1.5,pso引數區域性搜尋能力
  20. % c2:初始為1.7,pso引數全域性搜尋能力
  21. % maxgen:初始為200,最大進化數量
  22. % sizepop:初始為20,種群最大數量
  23. % k:初始為0.6(k belongs to [0.1,1.0]),速率和x的關係(V = kX)
  24. % wV:初始為1(wV best belongs to [0.8,1.2]),速率更新公式中速度前面的彈性係數
  25. % wP:初始為1,種群更新公式中速度前面的彈性係數
  26. % v:初始為3,SVM Cross Validation引數
  27. % popcmax:初始為100,SVM 引數c的變化的最大值.
  28. % popcmin:初始為0.1,SVM 引數c的變化的最小值.
  29. % popgmax:初始為1000,SVM 引數g的變化的最大值.
  30. % popgmin:初始為0.01,SVM 引數c的變化的最小值.
  31. Vcmax = pso_option.k*pso_option.popcmax;
  32. Vcmin = -Vcmax ;
  33. Vgmax = pso_option.k*pso_option.popgmax;
  34. Vgmin = -Vgmax ;
  35. eps = 10^(-3);
  36. %% 產生初始粒子和速度
  37. for i=1:pso_option.sizepop
  38.     % 隨機產生種群和速度
  39.     pop(i,1) = (pso_option.popcmax-pso_option.popcmin)*rand+pso_option.popcmin;
  40.     pop(i,2) = (pso_option.popgmax-pso_option.popgmin)*rand+pso_option.popgmin;
  41.     V(i,1)=Vcmax*rands(1,1);
  42.     V(i,2)=Vgmax*rands(1,1);
  43.     % 計算初始適應度
  44.     cmd = ['-v ',num2str(pso_option.v),' -c ',num2str( pop(i,1) ),' -g ',num2str( pop(i,2) )];
  45.     fitness(i) = svmtrain(train_label, train, cmd);
  46.     fitness(i) = -fitness(i);
  47. end
  48. % 找極值和極值點
  49. [global_fitness bestindex]=min(fitness); % 全域性極值
  50. local_fitness=fitness;   % 個體極值初始化
  51. global_x=pop(bestindex,:);   % 全域性極值點
  52. local_x=pop;    % 個體極值點初始化
  53. % 每一代種群的平均適應度
  54. avgfitness_gen = zeros(1,pso_option.maxgen);
  55. %% 迭代尋優
  56. for i=1:pso_option.maxgen
  57.     for j=1:pso_option.sizepop
  58.         %速度更新
  59.         V(j,:) = pso_option.wV*V(j,:) + pso_option.c1*rand*(local_x(j,:) - pop(j,:)) + pso_option.c2*rand*(global_x - pop(j,:));
  60.         if V(j,1) > Vcmax
  61.             V(j,1) = Vcmax;
  62.         end
  63.         if V(j,1) < Vcmin
  64.             V(j,1) = Vcmin;
  65.         end
  66.         if V(j,2) > Vgmax
  67.             V(j,2) = Vgmax;
  68.         end
  69.         if V(j,2) < Vgmin
  70.             V(j,2) = Vgmin;
  71.         end
  72.         %種群更新
  73.         pop(j,:)=pop(j,:) + pso_option.wP*V(j,:);
  74.         if pop(j,1) > pso_option.popcmax
  75.             pop(j,1) = pso_option.popcmax;
  76.         end
  77.         if pop(j,1) < pso_option.popcmin
  78.             pop(j,1) = pso_option.popcmin;
  79.         end
  80.         if pop(j,2) > pso_option.popgmax
  81.             pop(j,2) = pso_option.popgmax;
  82.         end
  83.         if pop(j,2) < pso_option.popgmin
  84.             pop(j,2) = pso_option.popgmin;
  85.         end
  86.         % 自適應粒子變異
  87.         if rand>0.5
  88.             k=ceil(2*rand);
  89.             if k == 1
  90.                 pop(j,k) = (20-1)*rand+1;
  91.             end
  92.             if k == 2
  93.                 pop(j,k) = (pso_option.popgmax-pso_option.popgmin)*rand + pso_option.popgmin;
  94.             end
  95.         end
  96.         %適應度值
  97.         cmd = ['-v ',num2str(pso_option.v),' -c ',num2str( pop(j,1) ),' -g ',num2str( pop(j,2) )];
  98.         fitness(j) = svmtrain(train_label, train, cmd);
  99.         fitness(j) = -fitness(j);
  100.         cmd_temp = ['-c ',num2str( pop(j,1) ),' -g ',num2str( pop(j,2) )];
  101.         model = svmtrain(train_label, train, cmd_temp);
  102.         if fitness(j) >= -65
  103.             continue;
  104.         end
  105.         %個體最優更新
  106.         if fitness(j) < local_fitness(j)
  107.             local_x(j,:) = pop(j,:);
  108.             local_fitness(j) = fitness(j);
  109.         end
  110.         if abs( fitness(j)-local_fitness(j) )<=eps && pop(j,1) < local_x(j,1)
  111.             local_x(j,:) = pop(j,:);
  112.             local_fitness(j) = fitness(j);
  113.         end
  114.         %群體最優更新
  115.         if fitness(j) < global_fitness
  116.             global_x = pop(j,:);
  117.             global_fitness = fitness(j);
  118.         end
  119.         if abs( fitness(j)-global_fitness )<=eps && pop(j,1) < global_x(1)
  120.             global_x = pop(j,:);
  121.             global_fitness = fitness(j);
  122.         end
  123.     end
  124.     fit_gen(i) = global_fitness;
  125.     avgfitness_gen(i) = sum(fitness)/pso_option.sizepop;
  126. end
  127. %% 結果分析
  128. figure;
  129. hold on;
  130. plot(-fit_gen,'r*-','LineWidth',1.5);
  131. plot(-avgfitness_gen,'o-','LineWidth',1.5);
  132. legend('最佳適應度','平均適應度',3);
  133. xlabel('進化代數','FontSize',12);
  134. ylabel('適應度','FontSize',12);
  135. grid on;
  136. % print -dtiff -r600 pso
  137. bestc = global_x(1);
  138. bestg = global_x(2);
  139. bestCVaccuarcy = -fit_gen(pso_option.maxgen);
  140. line1 = '適應度曲線Accuracy[PSOmethod]';
  141. line2 = ['(引數c1=',num2str(pso_option.c1), ...
  142.     ',c2=',num2str(pso_option.c2),',終止代數=', ...
  143.     num2str(pso_option.maxgen),',種群數量pop=', ...
  144.     num2str(pso_option.sizepop),')'];
  145. % line3 = ['Best c=',num2str(bestc),' g=',num2str(bestg), ...
  146. %     ' CVAccuracy=',num2str(bestCVaccuarcy),'%'];
  147. % title({line1;line2;line3},'FontSize',12);
  148. title({line1;line2},'FontSize',12);