第6章 支持向量机

来源:互联网 发布:苹果能看小说的软件 编辑:程序博客网 时间:2024/06/05 11:37

  • 间隔与支持向量
  • 对偶问题
    • SMO算法
  • 核函数
    • 几种常用的核函数
  • 软间隔与正则化
    • 软硬间隔
    • 替代损失函数
  • 支持向量回归
  • 核方法
  • 实验

1. 间隔与支持向量

为了对样本进行分类,需要在训练集中找到一个划分超平面,但能将样本分开的超平面有很多,按直观上看的话,应该去找位于两类训练样本“正中间”的划分超平面,如图。

这里写图片描述

在样本空间中,划分超平面可通过如下线性方程来描述:
这里写图片描述
这里写图片描述

这里写图片描述

至于间隔的话,我们可以通过约束参数w和b,使得r最大,来获得最大间隔。

这里写图片描述

由上式很容易看到,为了最大化间隔,只需最大化分母的-1次方,等价于最小化w的平方,于是,式6.5重写为

这里写图片描述

这就是支持向量机(SVM)的基本形。

2. 对偶问题

我们为了得到大间隔超平面所对应的模型,需要求出模型参数w和b。注意到式6.6是一个凸二次规划问题,能直接用现成的优化计算包求解,但我们可以有更高效的办法。

这里写图片描述
这里写图片描述

SMO算法

当求解式6.11 时, 不难发现,这是一个二次规划问题,如果使用通用的方法求解,那么会在实际中造成很大开销,因为该问题的规模正比于训练样本数。为了避开这个障碍,人们通过利用问题本身的特性,提出了很多高效算法,SMO是其中一个代表。

这里写图片描述
这里写图片描述

3. 核函数

当我们无法用一个划分超平面能将训练样本正确分类的时候,例如“异或”问题就不是线性可分的,对这样的问题,可将样本从原始空间映射到一个更高维的特征空间,使得样本在这个特征空间内线性可分。例如在图6.3中,若将原始的二维空间映射到一个合适的三维空间,就能找到一个合适的划分超平面。而且只要满足原始空间是有限维,即属性数有限,那么一定存在一个高维特征空间使样本可分。

这里写图片描述

这里写图片描述

这里写图片描述

几种常用的核函数

这里写图片描述

4. 软间隔与正则化

有的时候,即便恰好找到了某个核函数使训练集在特征空间中线性可分,也很难断定这个貌似线性可分的结果不是由于过拟合造成的。

软(硬)间隔

缓解上述问题的一个方法是,允许支持向量机在一些样本上出错,为此,引入“软间隔”的概念,就是允许某些样本不满足约束条件,而前面几节的SVM的形式是要求所有样本均满足约束,即所有样本都必须划分正确,称为“硬间隔”。如图

这里写图片描述

当然,在最大化间隔的同时,不满足约束的样本应尽可能少。于是,优化目标可写为
这里写图片描述

显然,当C为无穷大时,式6.29迫使所有样本均满足约束(6.28),于是式(6.29)等价于(6.6);当C取有限值时,式(6.29)允许一些样本不满足约束。

替代损失函数

这里写图片描述

这里写图片描述

5. 支持向量回归

这里写图片描述

这里写图片描述

6. 核方法

给定一些训练样本,若不考虑偏移项b,则无论SVM还是SVR,学得的模型总能表示成核函数的线性组合.

这里写图片描述

实验

转载自http://blog.csdn.net/on2way/article/details/47733861

样本集选择200个非线性样本集

%%% * libsvm 工具箱简单使用%%% 加载数据% * 最终data格式:m*n,m样本数,n维度% * label:m*1  标签为-1与1这两类clcclearclose alldata = load('data_test1.mat');data = data.data';%选择训练样本个数num_train = 80;%构造随机选择序列choose = randperm(length(data));train_data = data(choose(1:num_train),:);gscatter(train_data(:,1),train_data(:,2),train_data(:,3));label_train = train_data(:,end);test_data = data(choose(num_train+1:end),:);label_test = test_data(:,end);predict = zeros(length(test_data),1);%% ----训练模型并预测分类model = svmtrain(label_train,train_data(:,1:end-1),'-t 2');% -t = 2 选择径向基函数核 true_num = 0;for i = 1:length(test_data)    % 作为预测,svmpredict第一个参数随便给个就可以    predict(i) = svmpredict(1,test_data(i,1:end-1),model);end%% 显示结果figure;index1 = find(predict==1);data1 = (test_data(index1,:))';plot(data1(1,:),data1(2,:),'or');hold onindex2 = find(predict==-1);data2 = (test_data(index2,:))';plot(data2(1,:),data2(2,:),'*');hold onindexw = find(predict~=(label_test));dataw = (test_data(indexw,:))';plot(dataw(1,:),dataw(2,:),'+g','LineWidth',3);accuracy = length(find(predict==label_test))/length(test_data);title(['predict the testing data and the accuracy is :',num2str(accuracy)]);

训练结果:

这里写图片描述

原创粉丝点击