利用GA优化SVM参数的一点小探索
利用GA优化SVM参数的一点小探索利用 GA优化 SVM 参数的一点小探索其中 GA 代码思路,部分参照版主shiOlfg的进行的修改.部分参照雷英杰MATLAB遗传 算法工具箱与应用中算法自己实现.O(G_G)O.利用GA优化SVM中的c和gPS:图像好像有问题,怎么最佳适应度有的点会比平均的小?怪不管了.反正结 果图如此,晚上回来再看看怎么回事先这样.O(G_G)OPPS:那个啥bug找到了.已作了修改.S还做了一 点小优化从使用grid search优化SVM参 数到用PSO,再到用GA优化SVM参数,俺 总结出一个经验,把 C 控制住了.不能让 C太大!!!无论你用什么办法优化,在分 类准确率都达到最高的参数里,优先选 择C小的那组参数才是上策 当然只是我个人的一点小经验!o(n_n)o图:结果: 复制内容到剪贴板代码:bestc =7.7161bestg =2.7382 bestCVaccuarcy =98.8764Accuracy = 100% (89/89) (classification)Accuracy = 96.6292% (86/89) (classification)Elapsed time is 41.767334 seconds.代码:测试文件代码: 复制内容到剪贴板代码:% 清空环境clcclear%load wine;train = wine(1:30,:);wine(60:95,:);wine(131:153,:); train_label =wine_labels(1:30);wine_labels(60:95);wine_labels(131:153); test = wine(31:59,:);wine(96:130,:);wine(154:178,:); test_label =wine_labels(31:59);wine_labels(96:130);wine_labels(154:178);train,pstrain = mapminmax(train');pstrain.ymin = 0;pstrain.ymax = 1;train,pstrain = mapminmax(train,pstrain);test,pstest = mapminmax(test');pstest.ymin = 0;pstest.ymax = 1;test,pstest = mapminmax(test,pstest);train = train'test = test'%tic;ga_option.maxgen = 200;ga_option.sizepop = 50; ga_option.pCrossover = 0.4;ga_option.pMutation = 0.01; ga_option.cbound = 0.1,100; ga_option.gbound = 0.01,1000;ga_option.v = 3; bestCVaccuarcy,bestc,bestg,ga_option = gaSVMcgForClass(train_label,train,ga_option);bestcbestg bestCVaccuarcy cmd = '-c ',num2str(bestc),' -g ',num2str(bestg); model = svmtrain(train_label,train,cmd);pretrain,trainacc = svmpredict(train_label,train,model); pretest,testacc = svmpredict(test_label,test,model);toc;gaSVMcgForClass.m 代码复制内容到剪贴板代码:function bestCVaccuarcy,bestc,bestg,ga_option = gaSVMcgForClass(train_label,train,ga_option)% gaSVMcgForClass% by faruto% 2009.10.07% 参数初始化if nargin = 2 ga_option =struct('maxgen',100,'sizepop',20,'pCrossover',0.4,'pMutation',0.01, .'cbound',0.1,100,'gbound',0.01,1000,'v',3);end% maxgen: 最大的进化代数 , 默认为 100, 一般取值范围为 100,500% sizepop: 种群最大数量 , 默认为 20, 一般取值范围为 20,100% pCrossover: 交叉概率 , 默认为 0.4, 一般取值范围为 0.4,0.99% pMutation: 变异概率 , 默认为 0.01, 一般取值范围为 0.0001,0.1% cbound = cmin,cmax, 参数 c 的变化范围 , 默认为 0.1,100% gbound = gmin,gmax, 参数 g 的变化范围 , 默认为 0.01,1000% v:SVM Cross Validation 参数 , 默认为 3c_len_chromosome = ceil(log2(ga_option.cbound(2)-ga_option.cbound(1)*100);g_len_chromosome = ceil(log2(ga_option.gbound(2)-ga_option.gbound(1)*100); len_chromosome = c_len_chromosome+g_len_chromosome;% 将种群信息定义为一个结构体 individuals=struct('fitness',zeros(1,ga_option.sizepop), .'chromosome',zeros(ga_option.sizepop,len_chromosom e);% 每一代种群的平均适应度 avgfitness_gen = zeros(1,ga_option.maxgen);% 每一代种群的最佳适应度 bestfitness_gen = zeros(1,ga_option.maxgen);% 最佳适应度bestfitness = 0;% 适应度最好的染色体 bestchromosome = zeros(1,len_chromosome);% 初始化种群for i = 1:ga_option.sizepop% 编码individuals.chromosome(i,:) = unidrnd(2,1,len_chromosome)-1;% 解码c,g = ga_decode(individuals.chromosome(i,:),ga_option.cbound,ga_option.gbou nd);% 计算初始适应度 (CV 准确率 )cmd = '-v ',num2str(ga_option.v),' -c ',num2str( c ),' -g ',num2str( g );individuals.fitness(i) = svmtrain(train_label, train, cmd); end% 找最佳的适应度和最好的染色体的位置 bestfitness,bestindex=max(individuals.fitness);% 最好的染色体bestchromosome = individuals.chromosome(bestindex,:);% 初始染色体的平均适应度avgfitness_gen(1) = sum(individuals.fitness)/ga_option.sizepop;% 迭代寻优for i=1:ga_option.maxgen% Selection Operatorindividuals = Selection(individuals,ga_option);% Crossover Operatorindividuals = Crossover(individuals,ga_option);% Mutation Operatorindividuals = Mutation(individuals,ga_option);% 计算适应度for j = 1:ga_option.sizepop% 解码c,g = ga_decode(individuals.chromosome(j,:),ga_option.cbound,ga_option.gbou nd);% 计算初始适应度 (CV 准确率 )cmd = '-v ',num2str(ga_option.v),' -c ',num2str( c ),' -g ',num2str( g );individuals.fitness(j) = svmtrain(train_label, train, cmd); end% 找最佳的适应度和最好的染色体的位置 new_bestfitness,bestindex=max(individuals.fitness);% 最好的染色体new_bestchromosome = individuals.chromosome(bestindex,:);new_c,g = ga_decode(new_bestchromosome,ga_option.cbound,ga_option.gbound);c,g = ga_decode(bestchromosome,ga_option.cbound,ga_option.gbound);if new_bestfitness = bestfitness && new_c < cbestfitness = new_bestfitness;bestchromosome = new_bestchromosome;endif new_bestfitness > bestfitnessbestfitness = new_bestfitness;bestchromosome = new_bestchromosome;end% 这一代染色体的最佳适应度 bestfitness_gen(i) = bestfitness;% 这一代染色体的平均适应度avgfitness_gen(i) = sum(individuals.fitness)/ga_option.sizepop;end% 结果分析figure;hold on;plot(bestfitness_gen,'r'); plot(avgfitness_gen);legend('最佳适应度',平均适应度');title('适应度曲线','(终止代数二',num2str(ga_option.maxgen),',种群数量 pop=',num2str(ga_option.sizepop),')');xlabel('进化代数');ylabel('适应度');axis(0 ga_option.maxgen 0 100);grid on;bestc,bestg = ga_decode(bestchromosome,ga_option.cbound,ga_option.gbound); bestCVaccuarcy = bestfitness_gen(ga_option.maxgen);回头 libsvm-mat-faruto version 就又可以更新了. 嘿嘿