pso-svm分类matlab,11-PSO优化的SVM的多分类问题

clc,clear,close all

warning off

tic

load('traffic_double_10.mat')

%% 构造训练样本和测试样本

train_data =[];

train_output_data = [];

test_data=[];

test_output_data=[];

for i=1:10:length(traffic_label)

train_data =[train_data; traffic(i:i+7,:)];

train_output_data =[train_output_data; traffic_label(i:i+7,:)];

test_data =[test_data; traffic(i+8:i+9,:)];

test_output_data =[test_output_data; traffic_label(i+8:i+9,:)];

end

%% 归一化

for i=1:size(train_data,2)  % 样本归一化

minmax(i,1) = min(train_data(:,i));

minmax(i,2) = max(train_data(:,i));

if isequal(minmax(i,2),minmax(i,1))

train_data(:,i) = ones(size(train_data,1),1);

test_data(:,i) = ones(size(test_data,1),1);

else

train_data(:,i) = (minmax(i,2)-train_data(:,i))./(minmax(i,2)-minmax(i,1));

test_data(:,i) = (minmax(i,2)-test_data(:,i))./(minmax(i,2)-minmax(i,1));

end

end

%% 粒子群PSO算法参数设置

maxgen = 10;    % 最大迭代次数

sizepop = 5;    % 种群数量

Vmax = 1;       % 粒子速度上限

Vmin = -1;      % 粒子速度下限

c1 = 1.4995;    % 学习因子1

c2 = 1.4995;    % 学习因子2

% 变量坐标取值范围

nvar = 2;                      % 未知量数量

popmin1 = 0.1;   popmax1 = 2;  % SVM惩罚系数C

popmin2 = 0.1;   popmax2 = 2;  % SVM径向基函数基宽sigma

%% 初始化粒子群PSO种群位置

pop=[];

for i=1:sizepop

pop1.C = unifrnd(popmin1,popmax1,1,1);      % 均匀分布解

pop1.sigma = unifrnd(popmin2,popmax2,1,1);  % 均匀分布解

pop = [pop; pop1];

% 适应度函数

fitness(i) = fun2( pop(i,:),train_data,train_output_data , test_data, test_output_data);

end

clear pop1

V = Vmax*rands(sizepop,2);         % 初始化速度

[bestfitness,bR]= max(fitness);    % 亮度最高的保留

zbest = pop(bR,:);                 % 全局最佳

fitnesszbest = bestfitness;        % 全局最佳适应度值

gbest = pop;                       % 个体最佳

fitnessgbest = fitness;            % 个体最佳适应度值

trace = zbest;                     % 记录最优的种群

%% 粒子群PSO算法迭代寻优

for i=1:maxgen

disp(['Iteration ' num2str(i)]);

% 计算适应度值

for j=1:sizepop

% 速度更新

V(j,:) = V(j,:) + c1*rand*([gbest(j).C,gbest(j).sigma] - [pop(j).C,pop(j).sigma] ) +...

c2*rand*([zbest.C,zbest.sigma] - [pop(j).C,pop(j).sigma] );

V(j,find(V(j,:)>Vmax))=Vmax;  % 上限

V(j,find(V(j,:)

% 种群更新

pop(j).C = pop(j).C + 0.5*V(j,1);

pop(j).sigma = pop(j).sigma + 0.5*V(j,2);

% pop个体取值范围约束

if pop(j).C > popmax1     % 上限

pop(j).C = popmax1 ;

elseif pop(j).C < popmin1 % 下限

pop(j).C = popmin1;

end

if pop(j).sigma > popmax2     % 上限

pop(j).sigma = popmax2 ;

elseif pop(j).sigma < popmin2 % 下限

pop(j).sigma = popmin2;

end

fitness(j) = fun2( pop(j,:) ,train_data,train_output_data, test_data, test_output_data ); % 计算适应度值

% 个体最优更新

if fitness(j) > fitnessgbest(j)

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

fitnessgbest(j) = fitness(j);

end

% 群体最优更新

if fitness(j) > fitnesszbest

zbest = pop(j,:);

fitnesszbest = fitness(j);

end

end

trace = [trace,zbest];           % 记录最优的种群

fitness_iter(i) = fitnesszbest;  % 最优适应度值

end

time = toc;

disp(['CPU计算时间 =  ' num2str(time)])

% save PSO_iter_result.mat fitness_iter trace zbest gbest train_data train_output_data data0 data test_data test_output_data minmax

%% 结果显示

figure(1),

plot(fitness_iter,'b.-','linewidth',2);grid on;

xlabel('迭代次数');ylabel('适应度值');axis tight;

% 计算适应度值

[fitnessZ,predict_result]= fun_predict( zbest,train_data,train_output_data,test_data );

disp(['最优惩罚因子C =  ' num2str(zbest.C)])

disp(['最优径向基函数基宽sigma =  ' num2str(zbest.sigma)])

figure(2)

plot(train_output_data,'ro-')

hold on

plot(predict_result{1},'bo-')

legend('训练样本实际分类标签','训练样本预测分类标签')

figure(3)

plot(test_output_data,'ro-')

hold on

plot(predict_result{2},'bo-')

legend('测试样本实际分类标签','测试样本预测分类标签')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值