SVM
在机器学习领域,支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,通常用来进行模式识别、分类、以及回归分析。
简单应用实例及matlab代码
*参考 :
1. http://blog.sina.com.cn/s/blog_71152aa70101tl62.html
2. http://www.cnblogs.com/darkknightzh/p/5554551.html
* 说明. matlab 版本: matlab_R2015a
**数据集: http://pan.baidu.com/s/1eRTNhXw,将参考1中数据集重新命名便于直接导入。
–icesongqiang
clear all;
clc;
%% 数据集已经整理,直接load
load ('bedroom.mat') % bedroom
load ('forest.mat') % forest
load ('labelset.mat') % labelset
dataset = [bedroom; forest];
%%
%% 训练集和测试集获取
% 取bedroom,forest的前5行作为训练集
train_set = [dataset(1:5, :); dataset(11:15, :)];
% 相应的训练集的标签
train_set_label = [labelset(1:5); labelset(11:15)];
% 将第一类的6-10,第二类的16-20,做为测试集
test_set = [dataset(6:10, :); dataset(16:20, :)];
% 相应的测试集的标签
test_set_label = [labelset(6:10); labelset(16:20)];
%%
%% 数据预处理,将训练集和测试集归一化到[0,1]区间
[mtrain, ntrain] = size(train_set);
[mtest, ntest] = size(test_set);
test_dataset = [train_set; test_set];
% mapminmax为matlab自带的归一化函数
[dataset_scale, ps] = mapminmax(test_dataset', 0, 1)
dataset_scale = dataset_scale';
train_set = dataset_scale((1:mtrain), :);
test_set = dataset_scale((mtrain+1):(mtrain+mtest), :);
%%
%% SVM网络训练
model = svmtrain(train_set, train_set_label,'kernel_function','linear','showplot',true);
%% SVM网络预测
[predict_label] = svmclassify(model, test_set, 'showplot', true);
%% 结果分析
% 测试集的实际分类和预测分类图
figure;
hold on;
plot(test_set_label,'o');
plot(predict_label,'r*');
xlabel('测试集样本','FontSize',12);
ylabel('类别标签','FontSize',12);
legend('实际测试集分类','预测测试集分类');
title('测试集的实际分类和预测分类图','FontSize',12);
grid on;

一些说明
- 最开始使用 参考1中
model = svmtrain(train_set_label, train_set, '-s 2 -c 1 -g 0.07');
- 1
- 1
会报出错误,个人感觉也应该是训练集参数在第一位,于是参考2中的
svmModel = svmtrain(trainData, trainLabel,'kernel_function','linear','showplot',true);
符合
SVMSTRUCT = svmtrain(TRAINING, Y, 'PARAM1',val1, 'PARAM2',val2, ...)
形式;
2. 参考1中
[predict_label] = svmpredict(test_set_labels, test_set, model);
没有svmpredict()函数,使用参考2中
predict_label = svmclassify(svmModel,testData,'showplot',true);
通过。
续
搞清楚了,原来上面是使用的matlab自带的SVM库,而参考1使用的libSVM,libSVM与matlab自带的SVM的区别参考3:
*参考3:
http://blog.sina.com.cn/s/blog_64b046c701018c8n.html
复制原文如下:
1 MATLAB自带的svm实现函数仅有的模型是C-SVC(C-support vector classification); 而libsvm工具箱有C-SVC(C-support vector classification),nu-SVC(nu-support vector classification),one-class SVM(distribution estimation),epsilon-SVR(epsilon-support vector regression),nu-SVR(nu-support vector regression)等多种模型可供使用。
2 MATLAB自带的svm实现函数仅支持分类问题,不支持回归问题;而libsvm不仅支持分类问题,亦支持回归问题。
3 MATLAB自带的svm实现函数仅支持二分类问题,多分类问题需按照多分类的相应算法编程实现;而libsvm采用1v1算法支持多分类。
4 MATLAB自带的svm实现函数采用RBF核函数时无法调节核函数的参数gamma,貌似仅能用默认的;而libsvm可以进行该参数的调节。
5 libsvm中的二次规划问题的解决算法是SMO;而MATLAB自带的svm实现函数中二次规划问题的解法有三种可以选择:经典二次方法;SMO;最小二乘。(这个是我目前发现的MATLAB自带的svm实现函数唯一的优点~)
而 libSVM的安装可以参考其他,不做其他深入了解。