|
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_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,:)<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 = [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('测试样本实际分类标签','测试样本预测分类标签')
复制代码 适应度函数如下:
|
|