学习支持向量机SVM及其代码

转载 2013年01月13日 11:02:22
[转载]学习支持向量机SVM及其代码

    先简要说一下支持向量机(support vector machine, SVM)吧。感知机(perceptron)是二分类的线性模型,但是由于不同初值或选取不同的样本顺序,解是不同的,也就是不唯一的。在此基础上svm引入间隔最大化(margin maximization)不仅是样本更容易分开,而且解是唯一的。之后,为了容忍奇异点(outlier)引入松弛变量(slack variable)(注:引入松弛变量之后w依然是唯一的,但是b不是唯一的)。但是并不是所有问题都是线性的,所以用kernel track变成非线性模型。
     在求解SVM的时候一般都用其对偶形式,主要有两个优点,其一提供了一种方便的方法去解决约束问题,其二对偶问题中的点积能够很好地处理kernel function。而这个对偶函数又是一个二次规划问题。所以我们可以说求解SVM的本质就是在再生核希尔伯特空间(RKHS)上的二次优化问题。
     如果你想详细了解,我建议看《支持向量机——理论、算法与拓展》邓乃扬 田英杰著。
     这篇博文的主要是目的是把svm的matlab代码贴出来,供大家学习,代码有一部分是在网上找的一部分是我写的,解二次规划是用matlab的自带函数。把下面的代码直接复制就可运行,能够提高你对svm的理解。运行以下程序就能得到上面的图。

%主函数
clear all;
close all;
C = 10;
kertype = 'linear';
%训练样本
n = 50;
randn('state',6);
x1 = randn(2,n);    %2行N列矩阵
y1 = ones(1,n);       %1*N个1
x2 = 5+randn(2,n);   %2*N矩阵
y2 = -ones(1,n);      %1*N个-1
 
figure;
plot(x1(1,:),x1(2,:),'bx',x2(1,:),x2(2,:),'k.'); 
axis([-3 8 -3 8]);
hold on;
 
X = [x1,x2];        %训练样本d*n矩阵,n为样本个数,d为特征向量个数
Y = [y1,y2];        %训练目标1*n矩阵,n为样本个数,值为+1或-1
svm = svmTrain(X,Y,kertype,C);
plot(svm.Xsv(1,:),svm.Xsv(2,:),'ro');

%测试
[x1,x2] = meshgrid(-2:0.05:7,-2:0.05:7);  %x1和x2都是181*181的矩阵
[rows,cols] = size(x1);  
nt = rows*cols;                  
Xt = [reshape(x1,1,nt);reshape(x2,1,nt)];
Yt = ones(1,nt);
result = svmTest(svm, Xt, Yt, kertype);

Yd = reshape(result.Y,rows,cols);
contour(x1,x2,Yd,'m');

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function svm = svmTrain(X,Y,kertype,C)

options = optimset;    % Options是用来控制算法的选项参数的向量
options.LargeScale = 'off';
options.Display = 'off';

n = length(Y);
H = (Y'*Y).*kernel(X,X,kertype);
f = -ones(n,1); %f为1*n个-1,f相当于Quadprog函数中的c
A = [];
b = [];
Aeq = Y; %相当于Quadprog函数中的A1,b1
beq = 0;
lb = zeros(n,1); %相当于Quadprog函数中的LB,UB
ub = C*ones(n,1);
a0 = zeros(n,1);  % a0是解的初始近似值
[a,fval,eXitflag,output,lambda]  = quadprog(H,f,A,b,Aeq,beq,lb,ub,a0,options);

epsilon = 1e-8;                     
sv_label = find(abs(a)>epsilon);  %0<a<a(max)则认为x为支持向量     
svm.a = a(sv_label);
svm.Xsv = X(:,sv_label);
svm.Ysv = Y(sv_label);
svm.svnum = length(sv_label);
%svm.label = sv_label;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function result = svmTest(svm, Xt, Yt, kertype)
temp = (svm.a'.*svm.Ysv)*kernel(svm.Xsv,svm.Xsv,kertype);
total_b = svm.Ysv-temp;
b = mean(total_b);
w = (svm.a'.*svm.Ysv)*kernel(svm.Xsv,Xt,kertype);
result.score = w + b;
Y = sign(w+b);
result.Y = Y;
result.accuracy = size(find(Y==Yt))/size(Yt);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function K = kernel(X,Y,type)
%X 维数*个数
switch type
case 'linear'
    K = X'*Y;
case 'rbf'
    delta = 5;
    delta = delta*delta;
    XX = sum(X'.*X',2);
    YY = sum(Y'.*Y',2);
    XY = X'*Y;
    K = abs(repmat(XX,[1 size(YY,1)]) + repmat(YY',[size(XX,1) 1]) - 2*XY);
    K = exp(-K./delta);
end

二次规划问题和MATLAB函数quadprog的使用

题目:二次规划问题         二次规划(Quadratic Programming,QP)问题的一般形式为: 其中,为纯量,为阶对称矩阵。易知二次规划的Hesse矩阵等于。如果为半正定矩阵...
  • jbb0523
  • jbb0523
  • 2016-01-28 10:05:59
  • 25907

机器学习之支持向量机SVM及代码示例

一、线性可分SVMSVM算法最初是用来处理二分类问题的,是一种有监督学习的分类算法。对于线性可分的二分类问题,我们可以找到无穷多个超平面,将两类样本进行区分。(超平面:一维中是一个点;二维中是一条线;...
  • cxmscb
  • cxmscb
  • 2017-02-22 23:07:14
  • 6512

非线性SVM算法-matlab实现

  • 2011年05月13日 09:34
  • 287KB
  • 下载

《统计学习方法》-支持向量机SVM学习笔记和python源码

支持向量机SVM的学习笔记。对书中关键知识点进行了摘录,并加入一些自己的理解。 -----------------------------------------------------...
  • V_victor
  • V_victor
  • 2016-05-26 17:24:28
  • 2901

Python中的支持向量机SVM的使用(有实例)

转自:http://www.cnblogs.com/luyaoblog/p/6775342.html 除了在Matlab中使用PRTools工具箱中的svm算法,Python中一样可以使用支持向...
  • yaoxy
  • yaoxy
  • 2017-12-23 10:16:32
  • 119

周志华《Machine Learning》学习笔记(7)--支持向量机

上篇主要介绍了神经网络。首先从生物学神经元出发,引出了它的数学抽象模型–MP神经元以及由两层神经元组成的感知机模型,并基于梯度下降的方法描述了感知机模型的权值调整规则。由于简单的感知机不能处理线性不可...
  • u011826404
  • u011826404
  • 2017-01-21 22:05:53
  • 1741

支持向量机在金融领域的应用

  • 2010年01月05日 18:21
  • 1.35MB
  • 下载

支持向量机SVM通俗理解(python代码实现)

这是第三次来“复习”SVM了,第一次是使用SVM包,调用包并尝试调节参数。听闻了“流弊”SVM的算法。第二次学习理论,看了李航的《统计学习方法》以及网上的博客。看完后感觉,满满的公式。。。记不住啊。第...
  • csqazwsxedc
  • csqazwsxedc
  • 2017-05-11 02:42:08
  • 2741

支持向量机SVM(Support Vector Machine)是一个有监督的学习模型

前言     动笔写这个支持向量机(support vector machine)是费了不少劲和困难的,原因很简单,一者这个东西本身就并不好懂,要深入学习和研究下去需花费不少时间和精力,二者这个东西...
  • hzw05103020
  • hzw05103020
  • 2015-11-06 14:08:28
  • 6101

SVM学习总结(一)如何学习SVM

一、前言 前段时间一直在钻研SVM算法,原先一直觉得一个非常简单的算法,没想到在学的时候还挺难,主要还是对凸优化方面的知识不太熟悉,以后得加强,下面主要说说SVM算法的学习思路(对小白初学者)。 ...
  • u010484388
  • u010484388
  • 2017-01-10 21:03:15
  • 1529
收藏助手
不良信息举报
您举报文章:学习支持向量机SVM及其代码
举报原因:
原因补充:

(最多只允许输入30个字)