1. x=[0 1 0 1 2 -1];y=[0 0 1 1 2 -1];z=[-1 1 1 -1 1 1];
  2. %其中,(x,y)代表二维的数据点,z 表示相应点的类型属性。
  3.  
  4. data=[1,0;0,1;2,2;-1,-1;0,0;1,1];% (x,y)构成的数据点
  5. groups=[1;1;1;1;-1;-1];%各个数据点的标签
  6. figure;
  7. subplot(2,2,1);
  8. Struct1 = svmtrain(data,groups,'Kernel_Function','quadratic', 'showplot',true);%data数据,标签,核函数,训练
  9. classes1=svmclassify(Struct1,data,'showplot',true);%data数据分类,并显示图形
  10. title('二次核函数');
  11. CorrectRate1=sum(groups==classes1)/6  
  1. subplot(2,2,2);
  2. Struct2 = svmtrain(data,groups,'Kernel_Function','rbf', 'RBF_Sigma',0.41,'showplot',true);
  3. classes2=svmclassify(Struct2,data,'showplot',true);
  4. title('高斯径向基核函数(核宽0.41)');
  5. CorrectRate2=sum(groups==classes2)/6
  6. subplot(2,2,3);
  7. Struct3 = svmtrain(data,groups,'Kernel_Function','polynomial', 'showplot',true);
  8. classes3=svmclassify(Struct3,data,'showplot',true);
  9. title('多项式核函数');
  10. CorrectRate3=sum(groups==classes3)/6
  11. subplot(2,2,4);
  12. Struct4 = svmtrain(data,groups,'Kernel_Function','mlp', 'showplot',true);
  13. classes4=svmclassify(Struct4,data,'showplot',true);
  14. title('多层感知机核函数');
  15. CorrectRate4=sum(groups==classes4)/6

  

  1.  
  1. svmtrain代码分析:
  2. if plotflag %画出训练数据的点
  3. [hAxis,hLines] = svmplotdata(training,groupIndex);
  4. legend(hLines,cellstr(groupString));
  5. end
  6.  
  7. scaleData = [];
  8. if autoScale %训练数据标准化
  9. scaleData.shift = - mean(training);
  10. stdVals = std(training);
  11. scaleData.scaleFactor = 1./stdVals;
  12. % leave zero-variance data unscaled:
  13. scaleData.scaleFactor(~isfinite(scaleData.scaleFactor)) = 1;
  14.  
  15. % shift and scale columns of data matrix:
  16. for c = 1:size(training, 2)
  17. training(:,c) = scaleData.scaleFactor(c) * ...
  18. (training(:,c) + scaleData.shift(c));
  19. end
  20. end

  

  1. if strcmpi(optimMethod, 'SMO')%选择最优化算法
  2. else % QP and LS both need the kernel matrix:
  3. %求解出超平面的参数 (w,b): wX+b

  

  1. if plotflag %画出超平面在二维空间中的投影
  2. hSV = svmplotsvs(hAxis,hLines,groupString,svm_struct);
  3. svm_struct.FigureHandles = {hAxis,hLines,hSV};
  4. end

  

  1. svmplotsvs.m文件
  1. hSV = plot(sv(:,1),sv(:,2),'ko');%从训练数据中选出支持向量,加上圈标记出来
  2.  
  3. lims = axis(hAxis);%获取子图的坐标空间
  4. [X,Y] = meshgrid(linspace(lims(1),lims(2)),linspace(lims(3),lims(4)));%根据xy的范围,切分成网格,默认100
  5. Xorig = X; Yorig = Y;
  6.  
  7. % need to scale the mesh 将这些隔点标准化
  8. if ~isempty(scaleData)
  9. X = scaleData.scaleFactor(1) * (X + scaleData.shift(1));
  10. Y = scaleData.scaleFactor(2) * (Y + scaleData.shift(2));
  11. end
  12.  
  13. [dummy, Z] = svmdecision([X(:),Y(:)],svm_struct); %计算这些隔点[标签,离超平面的距离]
    contour(Xorig,Yorig,reshape(Z,size(X)),[0 0],'k');%画出等高线图,这个距离投影到二维空间的等高线

  

  1. svmdecision.m文件
  2. function [out,f] = svmdecision(Xnew,svm_struct)
  3. %SVMDECISION evaluates the SVM decision function
  4.  
  5. % Copyright 2004-2006 The MathWorks, Inc.
  6. % $Revision: 1.1.12.4 $ $Date: 2006/06/16 20:07:18 $
  7.  
  8. sv = svm_struct.SupportVectors;
  9. alphaHat = svm_struct.Alpha;
  10. bias = svm_struct.Bias;
  11. kfun = svm_struct.KernelFunction;
  12. kfunargs = svm_struct.KernelFunctionArgs;
  13.  
  14. f = (feval(kfun,sv,Xnew,kfunargs{:})'*alphaHat(:)) + bias;%计算出距离
  15. out = sign(f);%距离转化成标签
  16. % points on the boundary are assigned to class 1
  17. out(out==0) = 1;

  

  1. function K = quadratic_kernel(u,v,varargin)%核函数计算
  2. %QUADRATIC_KERNEL quadratic kernel for SVM functions
  3.  
  4. % Copyright 2004-2008 The MathWorks, Inc.
  5.  
  6. dotproduct = (u*v');
  7. K = dotproduct.*(1 + dotproduct);

  

维度分析:假设输入的训练数据为m个,维度为d,记作X(m,d);显然w为w(m,1);    wT*x+b

核函数计算:k(x,y)->上公式改写成  wT*@(x)+b

假设支持的向量跟训练数据保持一致,没有筛选掉一个,则支撑的数据就是归一化后的X,记作:Xst;

测试数据为T(n,d);

则核函数计算后为:(m,d)*(n,d)'=m*n;与权重和偏移中以后为: (1,m)*(m*n)=1*n;如果是训练数据作核函数处理,则m*d变成为m*m

这n个测试点的距离。

将这些隔点和其对应的超平面距离,画成等高线,得到现有图形。

第二批测试数据:

  1. clc;
  2. clear;
  3. close all;
  4. %rng(1); % For reproducibility
  5. r = sqrt(rand(100,1)); % Radius 0~1
  6. t = 2*pi*rand(100,1); % Angle 0~2pi
  7. data1 = [r.*cos(t), r.*sin(t)]; % Points
  8.  
  9. r2 = sqrt(3*rand(100,1)+1); % Radius 1~4
  10. t2 = 2*pi*rand(100,1); % Angle 0~2pi
  11. data2 = [r2.*cos(t2), r2.*sin(t2)]; % points
  12.  
  13. figure;
  14. plot(data1(:,1),data1(:,2),'r.','MarkerSize',15)
  15. hold on
  16. plot(data2(:,1),data2(:,2),'b.','MarkerSize',15)
  17. ezpolar(@(x)1);ezpolar(@(x)2);
  18. axis equal
  19. hold off
  20.  
  21. %Put the data in one matrix, and make a vector of classifications.
  22. data3 = [data1;data2];%标签 +1 -1
  23. theclass = ones(200,1);
  24. theclass(1:100) = -1;

  

  1. % r^2(r的平方) KMatrix = exp(-gamma*r2);
  2. function KMatrix = getKRBF(X, Y, gamma)%rbf核函数
  3. r2 = repmat( sum(X.^2,2), 1, size(Y,1) ) ...
  4. + repmat( sum(Y.^2,2), 1, size(X,1) )'- 2*X*Y'
  5. %K(x,y) m*n
  6. %sum(X.^2,2) m*d -> m*1 -> repmat -> m*n
  7. % n*d -> n*1 -> n*m -> m*n
  8. %m*n
  9.  
  10. % XVec表示X向量。||XVec||表示向量长度。 r表示两点距离。r^2表示r的平方。
  11. % k(XVec,YVec) = exp(-1/(2*sigma^2)*(r^2)) = exp(-gamma*r^2)
  12. % 公式-1 这里, gamma=1/(2*sigma^2)是参数, r=||XVec-YVec|| 实际上,可看作是计算2个点XY的相似性。

  

核函数理论:参考:http://www.cnblogs.com/jerrylead/archive/2011/03/18/1988406.html

考虑我们最初在“线性回归”中提出的问题,特征是房子的面积x,这里的x是实数,结果y是房子的价格。假设我们从样本点的分布中看到x和y符合3次曲线,那么我们希望使用x的三次多项式来逼近这些样本点。那么首先需要将特征x扩展到三维,然后寻找特征和结果之间的模型。我们将这种特征变换称作特征映射(feature mapping)。映射函数称作,在这个例子中

我们希望将得到的特征映射后的特征应用于SVM分类,而不是最初的特征。这样,我们需要将前面公式中的内积从,映射到

至于为什么需要映射后的特征而不是最初的特征来参与计算,上面提到的(为了更好地拟合)是其中一个原因,另外的一个重要原因是样例可能存在线性不可分的情况,而将特征映射到高维空间后,往往就可分了。(在《数据挖掘导论》Pang-Ning Tan等人著的《支持向量机》那一章有个很好的例子说明)

将核函数形式化定义,如果原始特征内积是,映射后为,那么定义核函数(Kernel)为

到这里,我们可以得出结论,如果要实现该节开头的效果,只需先计算,然后计算即可,然而这种计算方式是非常低效的。比如最初的特征是n维的,我们将其映射到维,然后再计算,这样需要的时间。那么我们能不能想办法减少计算时间呢?

先看一个例子,假设x和z都是n维的,

展开后,得

这个时候发现我们可以只计算原始特征x和z内积的平方(时间复杂度是O(n)),就等价与计算映射后特征的内积。也就是说我们不需要花时间了。

现在看一下映射函数(n=3时),根据上面的公式,得到

也就是说核函数只能在选择这样的作为映射函数时才能够等价于映射后特征的内积。

再看一个核函数

对应的映射函数(n=3时)是

轮换对称

更一般地,核函数对应的映射后特征维度为。(求解方法参见http://zhidao.baidu.com/question/16706714.html)。

由于计算的是内积,我们可以想到IR中的余弦相似度,如果x和z向量夹角越小,那么核函数值越大,反之,越小。因此,核函数值是的相似度。

再看另外一个核函数

这时,如果x和z很相近(),那么核函数值为1,如果x和z相差很大(),那么核函数值约等于0。由于这个函数类似于高斯分布,因此称为高斯核函数,也叫做径向基函数(Radial Basis Function 简称RBF)。它能够把原始特征映射到无穷维。

既然高斯核函数能够比较x和z的相似度,并映射到0到1,回想logistic回归,sigmoid函数可以,因此还有sigmoid核函数等等。

下面有张图说明在低维线性不可分时,映射到高维后就可分了,使用高斯核函数。

来自Eric Xing的slides

注意,使用核函数后,怎么分类新来的样本呢?线性的时候我们使用SVM学习出w和b,新来样本x的话,我们使用来判断,如果值大于等于1,那么是正类,小于等于是负类。在两者之间,认为无法确定。如果使用了核函数后,就变成了,是否先要找到,然后再预测?答案肯定不是了,找很麻烦,回想我们之前说过的

只需将替换成,然后值的判断同上。

核函数不仅仅用在SVM上,但凡在一个模型后算法中出现了,我们都可以常使用去替换,这可能能够很好地改善我们的算法。

参考:http://blog.csdn.net/shijing_0214/article/details/51000845

由之前对核函数的定义(见统计学习方法定义7.6): 
设χ是输入空间(欧氏空间或离散集合),Η为特征空间(希尔伯特空间),如果存在一个从χ到Η的映射

φ(x): χ→Η

使得对所有的x,z∈χ,函数Κ(x,z)=φ(x)∙φ(z), 
则称Κ(x,z)为核函数,φ(x)为映射函数,φ(x)∙φ(z)为x,z映射到特征空间上的内积。 
由于映射函数十分复杂难以计算,在实际中,通常都是使用核函数来求解内积,计算复杂度并没有增加,映射函数仅仅作为一种逻辑映射,表征着输入空间到特征空间的映射关系。例如: 
设输入空间χ:,

映射函数φ(x)= < X,X > = 
核函数Κ(x,z)= 
那么,取两个样例x=(1,2,3),z=(4,5,6)分别通过映射函数和核函数计算内积过程如下: 
φ(x)=(1,2,3,2,4,6,3,6,9) 
φ(z)=(16,20,24,20,25,30,24,30,36) 
φ(x)∙φ(z)=16+40+72+40+100+180+72+180+324=1024 
而直接通过Κ(x,z)计算得[(4+10+18)]^2=1024 
两者相比,核函数的计算量显然要比映射函数小太多了。

SVM matlab 代码详解说明的更多相关文章

  1. 混淆矩阵-MATLAB代码详解

    一.混淆矩阵 (一).简介 在人工智能中,混淆矩阵(confusion matrix)是可视化工具,特别用于监督学习,在无监督学习一般叫做匹配矩阵.在图像精度评价中,主要用于比较分类结果和实际测得值, ...

  2. 【转】小波与小波包、小波包分解与信号重构、小波包能量特征提取 暨 小波包分解后实现按频率大小分布重新排列(Matlab 程序详解)

    转:https://blog.csdn.net/cqfdcw/article/details/84995904 小波与小波包.小波包分解与信号重构.小波包能量特征提取   (Matlab 程序详解) ...

  3. BM算法  Boyer-Moore高质量实现代码详解与算法详解

    Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...

  4. ASP.NET MVC 5 学习教程:生成的代码详解

    原文 ASP.NET MVC 5 学习教程:生成的代码详解 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符串 ...

  5. Github-karpathy/char-rnn代码详解

    Github-karpathy/char-rnn代码详解 zoerywzhou@gmail.com http://www.cnblogs.com/swje/ 作者:Zhouwan  2016-1-10 ...

  6. 代码详解:TensorFlow Core带你探索深度神经网络“黑匣子”

    来源商业新知网,原标题:代码详解:TensorFlow Core带你探索深度神经网络“黑匣子” 想学TensorFlow?先从低阶API开始吧~某种程度而言,它能够帮助我们更好地理解Tensorflo ...

  7. JAVA类与类之间的全部关系简述+代码详解

    本文转自: https://blog.csdn.net/wq6ylg08/article/details/81092056类和类之间关系包括了 is a,has a, use a三种关系(1)is a ...

  8. Java中String的intern方法,javap&cfr.jar反编译,javap反编译后二进制指令代码详解,Java8常量池的位置

    一个例子 public class TestString{ public static void main(String[] args){ String a = "a"; Stri ...

  9. Kaggle网站流量预测任务第一名解决方案:从模型到代码详解时序预测

    Kaggle网站流量预测任务第一名解决方案:从模型到代码详解时序预测 2017年12月13日 17:39:11 机器之心V 阅读数:5931   近日,Artur Suilin 等人发布了 Kaggl ...

随机推荐

  1. C# GridView Edit & Delete, 点击Delete的时候弹出确认框

    1. 使用GridView自带属性ShowEditButton和ShowDeleteButton,均设为True  <Columns> ... <asp:CommandField S ...

  2. Servlet添加

    index .jsp <body> <h1>第一个Servlet</h1> <hr> <a href = "servlet/Hellos ...

  3. 【Xilinx-Petalinux学习】-08-OpenAMP系统实现

    openAMP系统实现. 一个核跑Linux,一个核裸跑.     ----->  已经实现. 一个核跑Linux,一个核跑UCOS   ----->  还未实现. Micrium的uco ...

  4. lower_bound和upper_bound算法实现

    lower_bound算法要求在已经按照非递减顺序排序的数组中找到第一个大于等于给定值key的那个数,其基本实现原理是二分查找,如下所示: int lower_bound(vector<int& ...

  5. web前端好学吗?

    最近这段时间许多学生讨论关于WEB前端工程师这个职位的问题.比如:关于前端难不难?好不好找工作?有没有用?好不好学?待遇好不好?好不好转其他的职位? 针对这个问题,课工场露露老师想跟大家谈谈自己对前端 ...

  6. MyEclipse 修改项目字符集

    项目->右键+properties->Resource->Text file container->others->utf-8

  7. PHP根据设备类型自动跳转相应网址页面,这个现在实用

    现在移动设备上网也很方便,比如Android智能手机,iPhone/iPad等,很多网站都相继推出了针对电脑和这些手机等移动设备访问的网页,如果你的系统是用PHP写的,那面本代码对你会很实用,可根据这 ...

  8. Mac 安装Eclipse

    1.下载 1.1.网址 http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/mar ...

  9. Delphi流的操作

    一.流的概念 流简单说是建立在面向对象基础上的一种抽象的处理数据的工具,它定义了一些处理数据的基本操作,如读取数据,写入数据等,程序员只需掌握对流进行操作,而不用关心流的另一头数据的真正流向.其实,流 ...

  10. Canvas globalCompositeOperation API

    参考: http://www.cnblogs.com/jenry/archive/2012/02/11/2347012.html <!DOCTYPE html> <html lang ...