遗传算法选取最优参数MATLAB程序 下载本文

复制代码

在这里使用启发式算法GA(遗传算法)来进行参数寻优,用网格划分(grid search)来寻找最佳的参数c和g,虽然采用网格搜索能够找到在CV意义下的最高的分类准确率,即全局最优解,但有时候如果想在更大的范围内寻找最佳的参数c和g会很费时,采用启发式算法就可以不必遍历网格内的所有的参数点,也能找到全局最优解。

关于遗传算法这里不打算过多介绍,想要学习的朋友可以自己查看相关资料。

使用GA来进行参数寻优在在libsvm-mat-2.89-3[FarutoUltimate3.0]工具箱中已经实现gaSVMcgForClass.m(分类问题参数寻优)、gaSVMcgForRegress.m(回归问题参数寻优)。

1.

2. 3. 4. 5. 6. 7.

利用GA参数寻优函数(分类问题):gaSVMcgForClass [bestCVaccuracy,bestc,bestg,ga_option]= gaSVMcgForClass(train_label,train,ga_option) 输入:

train_label:训练集的标签,格式要求与svmtrain相同。 train:训练集,格式要求与svmtrain相同。

ga_option:GA中的一些参数设置,可不输入,有默认值,详细请看代码的帮助说明。 8. 输出:

9. bestCVaccuracy:最终CV意义下的最佳分类准确率。 10. bestc:最佳的参数c。 11. bestg:最佳的参数g。

12. ga_option:记录GA中的一些参数。

13. ========================================================== 14. 利用GA参数寻优函数(回归问题):gaSVMcgForRegress 15. [bestCVmse,bestc,bestg,ga_option]=

16. gaSVMcgForRegress(train_label,train,ga_option) 17. 其输入输出与gaSVMcgForClass类似,这里不再赘述。

复制代码

gaSVMcgForClass.m源代码:

1. function [BestCVaccuracy,Bestc,Bestg,ga_option] =

gaSVMcgForClass(train_label,train_data,ga_option) 2. % gaSVMcgForClass 3. 4. %%

5. % by faruto

6. %Email:patrick.lee@foxmail.com QQ:516667408

http://blog.sina.com.cn/faruto BNU 7. %last modified 2010.01.17 8.

9. %% 若转载请注明:

10. % faruto and liyang , LIBSVM-farutoUltimateVersion

11. % a toolbox with implements for support vector machines based on libsvm,

2009. 12. %

13. % Chih-Chung Chang and Chih-Jen Lin, LIBSVM : a library for 14. % support vector machines, 2001. Software available at 15. % http://www.csie.ntu.edu.tw/~cjlin/libsvm 16.

17. %% 参数初始化 18. if nargin == 2

19. ga_option = struct('maxgen',200,'sizepop',20,'ggap',0.9,... 20. 'cbound',[0,100],'gbound',[0,1000],'v',5); 21. end

22. % maxgen:最大的进化代数,默认为200,一般取值范围为[100,500] 23. % sizepop:种群最大数量,默认为20,一般取值范围为[20,100] 24. % cbound = [cmin,cmax],参数c的变化范围,默认为(0,100] 25. % gbound = [gmin,gmax],参数g的变化范围,默认为[0,1000] 26. % v:SVM Cross Validation参数,默认为5 27. 28. %%

29. MAXGEN = ga_option.maxgen; 30. NIND = ga_option.sizepop; 31. NVAR = 2; 32. PRECI = 20;

33. GGAP = ga_option.ggap; 34. trace = zeros(MAXGEN,2); 35.

36. FieldID = ...

37. [rep([PRECI],[1,NVAR]);[ga_option.cbound(1),ga_option.gbound(1);ga_

option.cbound(2),ga_option.gbound(2)]; ... 38. [1,1;0,0;0,1;1,1]]; 39.

40. Chrom = crtbp(NIND,NVAR*PRECI); 41.

42. gen = 1;

43. v = ga_option.v; 44. BestCVaccuracy = 0; 45. Bestc = 0; 46. Bestg = 0; 47. %%

48. cg = bs2rv(Chrom,FieldID); 49.

50. for nind = 1:NIND

51. cmd = ['-v ',num2str(v),' -c ',num2str(cg(nind,1)),' -g

',num2str(cg(nind,2))];

52. ObjV(nind,1) = svmtrain(train_label,train_data,cmd); 53. end

54. [BestCVaccuracy,I] = max(ObjV); 55. Bestc = cg(I,1); 56. Bestg = cg(I,2); 57. 58. %%

59. while 1

60. % for gen = 1:MAXGEN

61. FitnV = ranking(-ObjV); 62.

63. SelCh = select('sus',Chrom,FitnV,GGAP); 64. SelCh = recombin('xovsp',SelCh,0.7); 65. SelCh = mut(SelCh); 66.

67. cg = bs2rv(SelCh,FieldID); 68. for nind = 1:size(SelCh,1)

69. cmd = ['-v ',num2str(v),' -c ',num2str(cg(nind,1)),' -g

',num2str(cg(nind,2))];

70. ObjVSel(nind,1) = svmtrain(train_label,train_data,cmd); 71. end 72.

73. [Chrom,ObjV] = reins(Chrom,SelCh,1,1,ObjV,ObjVSel); 74.

75. if max(ObjV) <= 50 76. continue; 77. end 78.

79. [NewBestCVaccuracy,I] = max(ObjV); 80. cg_temp = bs2rv(Chrom,FieldID);

81. temp_NewBestCVaccuracy = NewBestCVaccuracy; 82.

83. if NewBestCVaccuracy > BestCVaccuracy 84. BestCVaccuracy = NewBestCVaccuracy; 85. Bestc = cg_temp(I,1); 86. Bestg = cg_temp(I,2); 87. end 88.

89. if abs( NewBestCVaccuracy-BestCVaccuracy ) <= 10^(-2) && ... 90. cg_temp(I,1) < Bestc

91. BestCVaccuracy = NewBestCVaccuracy; 92. Bestc = cg_temp(I,1); 93. Bestg = cg_temp(I,2); 94. end