1 实验目的
- 进一步掌握支持向量机的原理及应用;
- 基于MATLAB实现SVM。
2 实验内容
(1)掌握支持向量机(SVM)的原理,核函数类型选择以及核参数选择原则等,并用malab的SVM函数求解各类分类问题实例。
(2)熟悉基于libsvm二分类的一般流程与方法,并对"bedroom,forest"两组数据进行分类(二分类),最后对试验分类的准确率进行分析。
3实验原理
SVM学习的基本想法是求解能够正确划分训练数据集并且几何间隔最大的分离超平面。如下图所示,
即为分离超平面,对于线性可分的数据集来说,这样的超平面有无穷多个(即感知机),但是几何间隔最大的分离超平面却是唯一的。
4实验步骤
实现代码:
function normal = normalization(x,kind)
% by Li Yang BNU MATH Email:farutoliyang@gmail.com QQ:516667408
% last modified 2009.2.24
%
if nargin < 2
kind = 2;%kind = 1 or 2 表示第一类或第二类规范化
end
[m,n] = size(x);
normal = zeros(m,n);
%% normalize the data x to [0,1]
if kind == 1
for i = 1:m
ma = max( x(i,:) );
mi = min( x(i,:) );
normal(i,:) = ( x(i,:)-mi )./( ma-mi );
end
end
%% normalize the data x to [-1,1]
if kind == 2
for i = 1:m
mea = mean( x(i,:) );
va = var( x(i,:) );
normal(i,:) = ( x(i,:)-mea )/va;
end
end
clear;
clc;
load SVM
train_train = [train(1:4,:);train(5:11,:);train(12:19,:);train(20:30,:)];%手动划4分类
train_target = [target(1:4);target(5:11);target(12:19);target(20:30)];
test_simulation = [simulation(1:6,:);simulation(7:11,:);simulation(12:24,:);simulation(25:30,:)];
test_labels = [labels(1:6);labels(7:11);labels(12:24);labels(25:30)];
% train_train = normalization(train_train',2);
% test_simulation = normalization(test_simulation',2);
% train_train = train_train';
% test_simulation = test_simulation';
% bestcv = 0;
% for log2c = -10:10,
% for log2g = -10:10,
% cmd = ['-v 5 -c ', num2str(2^log2c), ' -g ',num2str(2^log2g)];%将训练集分为5类
% cv = svmtrain(train_target, train_train, cmd);
% if (cv >= bestcv),
% bestcv = cv; bestc = 2^log2c; bestg = 2^log2g;
% end
% end
% end
% fprintf('(best c=%g, g=%g, rate=%g)\n',bestc, bestg, bestcv);
% cmd = ['-c ', num2str(bestc), ' -g ', num2str(bestg)];
% model = svmtrain(train_target, train_train, cmd);
model = svmtrain(train_target, train_train, '-c 2 -g 0.2 -t 1');%核函数
[predict_label, accuracy] = svmpredict(test_labels, test_simulation, model);
predict_label
hold off
f=predict_label';
index1=find(f==1);
index2=find(f==2);
index3=find(f==3);
index4=find(f==4);
plot3(simulation(:,1),simulation(:,2),simulation(:,3),'o');
line(simulation(index1,1),simulation(index1,2),simulation(index1,3),'linestyle','none','marker','*','color','g');
line(simulation(index2,1),simulation(index2,2),simulation(index2,3),'linestyle','none','marker','<','color','r');
line(simulation(index3,1),simulation(index3,2),simulation(index3,3),'linestyle','none','marker','+','color','b');
line(simulation(index4,1),simulation(index4,2),simulation(index4,3),'linestyle','none','marker','>','color','y');
box;grid on;hold on;
xlabel('A');
ylabel('B');
zlabel('C');
title('支持向量机分析图');
实验结果: