11-PSO优化的SVM的多分类问题
SVM为二分类表现优异,如何多分类呢?本视频进行了细致讲解:百度网盘视频链接:https://pan.baidu.com/s/1zLwBypanMv7PgXCAjmAPYw 提取码:xeir
录制的视频是算法底层原理讲解,底层代码实现,方便大家真正掌握算法实质,开发出更加出色的算法。录制视频的初衷是:避免读者朋友利用大把时间学习已有常见算法,本系列视频旨在让读者朋友快速深入了解这些常见算法原理,有更多的时间去研究更加高大上算法(价值)。
具体链接在halcom.cn论坛,联系人QQ:3283892722
该论坛是一个学习交流平台,我会逐一的和大家分享学习。
欢迎大家录制视频,并提交给我,我来设置视频,你可在论坛进行打赏分享。
视频专用播放器:http://halcom.cn/forum.php?mod=viewthread&tid=258&extra=page%3D1
主程序:
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_output_data =;
test_data =;
test_output_data =;
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 = ;
% 适应度函数
fitness(i) = fun2( pop(i,:),train_data,train_output_data , test_data, test_output_data);
end
clear pop1
V = Vmax*rands(sizepop,2); % 初始化速度
= 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*( - ) +...
c2*rand*( - );
V(j,find(V(j,:)>Vmax))=Vmax;% 上限
V(j,find(V(j,:)<Vmin))=Vmin;% 下限
% 种群更新
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 = ; % 记录最优的种群
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;
% 计算适应度值
= 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('测试样本实际分类标签','测试样本预测分类标签')适应度函数如下:**** Hidden Message *****
谢谢楼主分享! 很好,对我的帮助很大
,感谢博主 没有数据么 楼主太好了。谢谢! 非常好的代码 楼主 不好意思为什么视频看不了?:'( 感谢分享,好好学习一下 matlab可读性不太好,感谢楼主耐心注释 谢谢分享~学习学习