我是靠谱客的博主 潇洒仙人掌,最近开发中收集的这篇文章主要介绍matlab faruto,faruto_psoSVMcgForRegress – MATLAB中文论坛,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

function [bestCVmse,bestc,bestg,pso_option] = psoSVMcgForRegress(train_label,train,pso_option)

% psoSVMcgForClass

% by faruto

% 2009.10.28

%% 参数初始化

if nargin == 2

pso_option = struct('c1',1.2,'c2',1,'maxgen',200,'sizepop',30, ...

'k',0.6,'wV',1,'wP',1,'v',5, ...

'popcmax',10^2,'popcmin',10^(-1),'popgmax',10^3,'popgmin',10^(-2));

end

% c1:初始为1.5,pso参数局部搜索能力

% c2:初始为1.7,pso参数全局搜索能力

% maxgen:初始为200,最大进化数量

% sizepop:初始为20,种群最大数量

% k:初始为0.6(k belongs to [0.1,1.0]),速率和x的关系(V = kX)

% wV:初始为1(wV best belongs to [0.8,1.2]),速率更新公式中速度前面的弹性系数

% wP:初始为1,种群更新公式中速度前面的弹性系数

% v:初始为3,SVM Cross Validation参数

% popcmax:初始为100,SVM 参数c的变化的最大值.

% popcmin:初始为0.1,SVM 参数c的变化的最小值.

% popgmax:初始为1000,SVM 参数g的变化的最大值.

% popgmin:初始为0.01,SVM 参数c的变化的最小值.

Vcmax = pso_option.k*pso_option.popcmax;

Vcmin = -Vcmax ;

Vgmax = pso_option.k*pso_option.popgmax;

Vgmin = -Vgmax ;

%% 产生初始粒子和速度

for i=1:pso_option.sizepop

% 随机产生种群和速度

pop(i,1) = (pso_option.popcmax-pso_option.popcmin)*rand+pso_option.popcmin;

pop(i,2) = (pso_option.popgmax-pso_option.popgmin)*rand+pso_option.popgmin;

V(i,1)=Vcmax*rands(1);

V(i,2)=Vgmax*rands(1);

% 计算初始适应度

cmd = ['-v ',num2str(pso_option.v),' -c ',num2str( pop(i,1) ),' -g ',num2str( pop(i,2) ),' -s 3 -p 0.1'];

fitness(i) = svmtrain(train_label, train, cmd);

end

% 找极值和极值点

[global_fitness bestindex]=min(fitness); % 全局极值

local_fitness=fitness;   % 个体极值初始化

global_x=pop(bestindex,:);   % 全局极值点

local_x=pop;    % 个体极值点初始化

%% 迭代寻优

for i=1:pso_option.maxgen

for j=1:pso_option.sizepop

%速度更新

V(j,:) = pso_option.wV*V(j,:) + pso_option.c1*rand*(local_x(j,:) - pop(j,:)) + pso_option.c2*rand*(global_x - pop(j,:));

if V(j,1) > Vcmax

V(j,1) = Vcmax;

end

if V(j,1) < Vcmin

V(j,1) = Vcmin;

end

if V(j,2) > Vgmax

V(j,2) = Vgmax;

end

if V(j,2) < Vgmin

V(j,2) = Vgmin;

end

%种群更新

pop(j,:)=pop(j,:) + pso_option.wP*V(j,:);

if pop(j,1) > pso_option.popcmax

pop(j,1) = pso_option.popcmax;

end

if pop(j,1) < pso_option.popcmin

pop(j,1) = pso_option.popcmin;

end

if pop(j,2) > pso_option.popgmax

pop(j,2) = pso_option.popgmax;

end

if pop(j,2) < pso_option.popgmin

pop(j,2) = pso_option.popgmin;

end

% 自适应粒子变异

if rand>0.5

k=ceil(2*rand);

if k == 1

pop(j,k) = (20-1)*rand+1;

end

if k == 2

pop(j,k) = (pso_option.popgmax-pso_option.popgmin)*rand + pso_option.popgmin;

end

end

%适应度值

cmd = ['-v ',num2str(pso_option.v),' -c ',num2str( pop(j,1) ),' -g ',num2str( pop(j,2) ),' -s 3 -p 0.1'];

fitness(j) = svmtrain(train_label, train, cmd);

end

%个体最优更新

if fitness(j) < local_fitness(j)

local_x(j,:) = pop(j,:);

local_fitness(j) = fitness(j);

end

%群体最优更新

if fitness(j) < global_fitness

global_x = pop(j,:);

global_fitness = fitness(j);

end

fit_gen(i)=global_fitness;

end

%% 结果分析

figure;

plot(fit_gen);

title(['适应度曲线','(参数c1=',num2str(pso_option.c1),',c2=',num2str(pso_option.c2),',终止代数=',num2str(pso_option.maxgen),',种群数量pop=',num2str(pso_option.sizepop),')']);

xlabel('进化代数');ylabel('适应度');

bestc = global_x(1);

bestg = global_x(2);

bestCVmse = fit_gen(pso_option.maxgen);

k.jpg

(80.23 KB, 下载次数: 0)

2017-3-28 15:01 上传

442a53943febe9465fc072b4fbe10813.gif

b2a5a3e0dcc7d508e00275fe42fce1b5.gif

参数k何用?用它有何优点

c3881289035060605699d256f4c71838.png

vgmax.png

(22.53 KB, 下载次数: 0)

2017-3-28 15:04 上传

442a53943febe9465fc072b4fbe10813.gif

b2a5a3e0dcc7d508e00275fe42fce1b5.gif

不一致啊,更新种群时用vc,更新速度为何不用vg呢?

1a05299ae80464b8e31e1d10a4a98071.png

最后

以上就是潇洒仙人掌为你收集整理的matlab faruto,faruto_psoSVMcgForRegress – MATLAB中文论坛的全部内容,希望文章能够帮你解决matlab faruto,faruto_psoSVMcgForRegress – MATLAB中文论坛所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部