[机器学习实验6]线性SVM分类和非线性SVM分类

在开始实验之前我们需要先下载LIBSVM库
http://www.csie.ntu.edu.tw/~cjlin/libsvm/下载后解压后如下图
[机器学习实验6]线性SVM分类和非线性SVM分类_第1张图片
我们要使用matlab部分,这里说明一下,用最新的版本的LIBSVM出现了问题的话,任何问题(除了找不到编译器)其他的问题,请下一个最新版本的Matlab,比如我用的是Matlab2016b,之前用的Matlab2012,之前有个问题几天都没解决掉,换到新版就好了,然后编译器用比Matlab版本低一点的VS即可,我用的VS2013。

线性SVM分类

放上题目链接
http://openclassroom.stanford.edu/MainFolder/DocumentPage.php?course=MachineLearning&doc=exercises/ex7/ex7.html
数据在这里下载:
http://openclassroom.stanford.edu/MainFolder/courses/MachineLearning/exercises/ex7materials/ex7Data.zip

我们使用的SVM公式如下,推导和求解的方法都比较复杂,所以这里只给出公式,具体的可以去看看其他的机器学习视频,来学习SVM的原理
[机器学习实验6]线性SVM分类和非线性SVM分类_第2张图片
我们下载好的数据集只有一个特征值,所以直接用线性SVM即可分类
调节C可以调节分类面的Margin,C越大,Margin越小正确率也越高,但是在非线性的分类问题中可能是会出现过拟合的,后面会看到,下面是线性分类的结果
[机器学习实验6]线性SVM分类和非线性SVM分类_第3张图片
[机器学习实验6]线性SVM分类和非线性SVM分类_第4张图片

在我们下载的数据集中还有垃圾邮件分类的数据集
这里写图片描述
代码如下

% SVM Email text classification

clear all; close all; clc

% Load training features and labels
[train_y, train_x] = libsvmread('email_train-50.txt');

% Train the model and get the primal variables w, b from the model

% Libsvm options
% -t 0 : linear kernel
% Leave other options as their defaults 
% model = svmtrain(train_y, train_x, '-t 0');
% w = model.SVs' * model.sv_coef;
% b = -model.rho;
% if (model.Label(1) == -1)
%     w = -w; b = -b;
% end

model = svmtrain(train_y, train_x, sprintf('-s 0 -t 0'));

% Load testing features and labels
[test_y, test_x] = libsvmread('email_test.txt');

[predicted_label, accuracy, decision_values] = svmpredict(test_y, test_x, model);
% After running svmpredict, the accuracy should be printed to the matlab
% console

选择不同的训练集的规模来做比较,可以得到一个结论当训练集规模越大的时候,那么我们预测时的误差也就越小,下图分别是50、100、400规模的训练集时得到的准确度
[机器学习实验6]线性SVM分类和非线性SVM分类_第5张图片
因为分类器的特征值的维度太高,无法画出分界面来直观观看。

非线性SVM分类

数据集下载
http://openclassroom.stanford.edu/MainFolder/courses/MachineLearning/exercises/ex8materials/ex8Data.zip
题目链接
http://openclassroom.stanford.edu/MainFolder/DocumentPage.php?course=MachineLearning&doc=exercises/ex8/ex8.html
我们使用的核函数是RBF(高斯核)
[机器学习实验6]线性SVM分类和非线性SVM分类_第6张图片
具体核函数的概念这里就不讲了。直接使用LIBSVM中的选择高斯核来训练我们的model

clear all; close all; clc

% Load training features and labels
[y, x] = libsvmread('ex8a.txt');

gamma = 100;

% Libsvm options
% -s 0 : classification
% -t 2 : RBF kernel
% -g : gamma in the RBF kernel

model = svmtrain(y, x, sprintf('-s 0 -t 2 -g %g', gamma));

% Display training accuracy
[predicted_label, accuracy, decision_values] = svmpredict(y, x, model);

% Plot training data and decision boundary
plotboundary(y, x, model);

title(sprintf('\\gamma = %g', gamma), 'FontSize', 14);

通过选择合适的γ值来调整Margin,γ越大越容易过拟合(对应高斯函数越尖)
这里写图片描述
[机器学习实验6]线性SVM分类和非线性SVM分类_第7张图片
[机器学习实验6]线性SVM分类和非线性SVM分类_第8张图片
[机器学习实验6]线性SVM分类和非线性SVM分类_第9张图片
[机器学习实验6]线性SVM分类和非线性SVM分类_第10张图片
可以看出随着γ的增大,过拟合越来越明显,Margin越来越小。所以在使用SVM时要选择合适的C和γ值,下一篇博文将讲讲怎么选择合适的参数。
另一个数据集出来的训练结果如下,也可以尝试其他的伽马值,不过100的伽马效果感觉是最佳的。
[机器学习实验6]线性SVM分类和非线性SVM分类_第11张图片

你可能感兴趣的:(机器学习)