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('测试样本实际分类标签','测试样本预测分类标签')