如何用法向量求点到平面距离_支持向量机(SVM)

最近完成的一个项目用到了SVM,之前也一直有听说支持向量机,知道它是机器学习中一种非常厉害的算法。利用将近一个星期的时间学习了一下支持向量机,把原理推了一遍,感觉支持向量机确实挺厉害的,尤其是核函数变换可以把一个低维不可分问题转化为高维可分的问题。

需要解决的问题

支持向量机是一种监督学习的方法,主要用来进行分类和回归分析,当我们对一些数据进行分类的时候,可能会考虑以下问题:

  • 怎么选择决策边界?什么样的决策边界最好?
  • 目标函数如何求解?
  • 对于线性不可分的问题该用何种方法来解决。

解决问题流程

  1. 选取决策边界(选取出最好的决策边界)
  2. 列目标函数
  3. 优化目标函数
  4. 求解优化目标(利用拉格朗日乘子法)
  5. 软间隔问题的解决(解决离群点)
  6. 核函数变换

决策边界的选择

Step1

当我们拿到一些简单的线性可分的数据的时候,如下图,将两类数据分类的决策边界有n条直线(图中显示了三条),那么哪一个决策边界才是最好的呢。

7684c90fb390221ada23cc1916842ea8.png

直觉告诉我:中间的那一条边界是最好的,而实际也的确如此:
举个简单的栗子:

17eb67d568a7744042a5aeaf1a7380e7.png


两侧的数据就好比是两边是河,我们肯定希望可以走的地方越宽越好,这样掉入河里的几率就降低了。
所以我们选择的决策边界是:选出来离河岸最远的(河岸就是边界上的点,要Large Margin),第二个肯定比第一个效果好。

好了,知道要选择什么样的边界之后,接下来就是要求解边界了。
我们希望找到离决策边界最近的点,这样就找到了决策边界。
所以,假设决策边界是一个阴影平面,求点到平面的距离转换成点到点的距离,然后再垂直方向上的投影。大概的模型如下图:

a682f09f2e8ebd8057649dbb65f3b6b6.png


x为一个点,面的方程可以用线性方程来描述:

f3783a4c4b6f9b833b281d0c15c42264.gif


其中w为法向量,决定了超平面的方向,b为位移量,决定了超平面与原点的距离。(学过高数几何那一部分的应该都看的懂)
接下来就是算一下x到平面的距离。假设平面上有两点x’,x’’,那么则有:
W^Tx'+b=0WTx′+b=0
W^Tx''+b=0WTx′′+b=0
即W^T(x''-x')+b=0WT(x′′−x′)+b=0
直接求垂线的距离比较难,但是我们可以通过求xx’两点的长度,再求其在垂直方向的投影来得到垂线的距离。
通过计算可以得到以下式子:

8a1afe308f48824724e974e072a3bcb7.gif

Step 2

接下来我们引入数据来将上面的式子完整化具体化
假设现在有数据集(x1,y1),(x2,y2)……(xn,yn)(x为数据,y为标签)。
在这里我们认为当X为正例时Y=1,负例是Y=-1。

这里的±1仅仅是一个标号,代表正负样本,并不是具体的数值,主要是因为这里是二分类,而且方便下面的简化。和Logistics Regression(Logistics Regression中用0和1来区分正负例)一样,而且这是可以由Logistics Regression推出来的(具体过程不在这里写了)

假设现在的决策边界为:

99a8d8301eb07429387f2c9f0210e40f.gif

如果感觉ϕ(x)这种表述方式不太习惯,可以考虑所有的ϕ(x)=x,式主要是为了强调,在实际问题中,输入空间x一般不会作为模型的输入,而是要将输入空间通过一定的特征转换算法ϕ(x),转换到特征空间,最后在特征空间中做算法学习。而且,在实际问题中,各种算法基本上都是死的,但是,特征变换的这个过程ϕ(x)却是活的,很多时候,决定一个实际问题能不能很好的解决,ϕ(x)起着决定性的作用。举个简单的例子,比如Logistics Regression,数据最好要做归一化,如果数据不归一化,那么那些方差特别大的特征就会成为主特征,影响模型的计算,ϕ(x)就可以做这个事情。

给上面这个函数做一个定义:当预测的结果大于0的时候Y=1(对应着正例),小于0的时候为负例。即:
y(x)大于0时,y_iyi​=1,y(x)小于0时,y_iyi​=-1,那么下面我们可以将这个式子合着写成y_iyi​y(x)>0。

Step 3

对于第一步推出来的点到距离的公式,我们注意到有绝对值的存在,在计算机中这是不容易表示的,于是我们可以引入第二步的yi,因为y_iyi​y(x)>0。所以我们可以将距离公式表达成:

174abb253d88405f81144937f68354dd.png


这样一来就去掉了绝对值。

优化目标

优化目标:找到一条线,使得距离线最近的点能够最远(找到一条线,使得距离河岸最近的线能够最远)
即:

e9b5f6d825335e39cab3550139005d97.png


首先min中求了所有点中离线最近的点,max是使得该点与边界最远。

这个目标看起来是不是特别繁琐~那接下来我们再来简化一下。
通过一个放缩变换:决策方程中的(w,b)可以通过放缩使其结果值|Y|≥1(之前认为是大于0,现在严格了一些)。

这个放缩的过程就是通过等比例扩大或缩小y,w,b的系数,总能得到|Y|≥1。而且表达式中重要的不是w 和 b 的取值,重要的是 w 和 b 的比值, w 和 b 的比值决定了一个决策面的点集,也就决定了一个决策面。

|Y|≥1,即:

f60978798795254fa4560709e88f8b5e.gif


所以上面优化目标中

22f9585a5f472e27afdf84c68b9a7335.gif


所以我们现在只剩下:

dcd07803552833de109b1c21336a18ed.gif


只需要将1/||W||最大化就OK了。所以这就是我们的目标函数。

目标函数求解

由上面的推导我们可以知道,目标函数为:

6cd440a79e7bb1fd7e7b1b3a1b9874be.png


求解这个式子就是求解一个极大值,机器中一般都是将求极大值的问题转化为求极小值的问题。求1/W的极大值不就是求W的极小值嘛。所以我们可以转化成:

aa8d5ad6e5dc3faece7529ce498f7b04.gif


这个式子也不好求啊~那么该如何求解呢?
这里就要用到拉格朗日乘子法
我们需要解决的问题是带约束的拉格朗日乘子法问题:

02f2f705278bfc48992f7a19c271091f.png


是不是有点复杂……总之吧,我们要求得式子可以转化为:

91ce262ec86391a65b4de81fbb7e89d9.gif


还有约束:

b479902afa2ec626b85ad8c7b0a8fe29.gif


咦,这个α是什么东东,现在我们先理解为每个xi前面加了个系数,下面会继续说,我们可以把求w转为求α。

SVM求解推导

Step 1

接下来的推导我感觉挺复杂的……推完想吐。
引入数学KKT公式(这里不详细证明)

e36d52caf1d3732e049be3b8b57c358a.png


大概意思就是先求里面的最大值在求外面的最小值和先求里面的最小值在求外面的最大值是一样的。
求极小值肯定先想到的就是求偏导,分别对w和b求偏导,让偏导等于0:

8bad3ec8d2bab05438cdcab40deb2339.png


再将得到的结果带到我们所要求解的原式中:

86e42e8998e2cd7fcb7870c8afef875a.png


通过上面的推导我们就把求w转化为了求α,即需要对α求极大值:

8e53017333ab0a737b927a1358d3c4b6.gif


条件:

6fc8a30aacc3b56b0574a5f97706cd8b.gif

5efd14fafe8d35ddba2f26ac4341a915.gif


按照常规套路:将求极大值问题转化为求极小值问题:求一个数的最大值也即求该数相反数的最小值,即:

6926b777d76ed0ddc6a1ef487a47608f.gif


条件不变。

Step 2

α怎么解呢,举个简单的例子:

7d099dfbd5725aeaf142e02ed4546985.png


因为x1,x2是正例,所以对应的Y=1,x3是负例,所以对应的Y=-1

b713def8b2fca384c049694710d88bfc.png

分别对α1和α2求偏导,偏导等于0可得α1=1.5,α2=-1。

但是α2<0,和我们的条件αi≥0不相符,所以解应该在边界点上。
所以分别令α1和α2等于0来计算。

α1=0,α2=-2/13,带入原式得到-0.153,α2依然小于0,不满足约束
α1=0.25,α2=0,带入原式得到-0.25,符合约束。根据α1和α2计算得到α3,α3=α1+α2=0.25。所以最小值在(0.25,0,0.25)处取得。

2a8283228c335ba261eb55085e5241ee.png


终于解完了……有点想吐的感觉。
————————————————————————————————————
通过上面的这个例子是不是有一点别的发现呢?
通过上面的例子可以知道只有边界点对应的不为0,即非边界点对应的均为0,也就是说最终影响w值的只是边界点(距离决策边界最近的那些点)这也与我们的求解目标是一致的。此时,我们可以说决策变量是由边界上的点支持决定的,我们可以叫这些边界点为支持向量,只有这些支持向量会对结果有影响。据说这也是支持向量机名字的由来。

软间隔问题

先来观察一下这个图:

2685a121de77d518eeb07dba3972687a.png


在图中我们发现一个离群点造成了超平面的移动,间隔缩小了,可以看到模型对噪声非常敏感。如果这个离群点在另外一个类中时,那我们的模型就线性不可分了。
之前的方法要求把两类点完全分得开,这个要求有点过于严格了,来放松一下!这时候我们给原来的模型加一些条件,即允许这些个别离群点违背限制条件,引入松弛因子:

34e047a1d4d065cf5b77bf134f54a1a6.gif


那么新的目标函数为:

b598a97f02695e4c9961d63769b92db9.gif


限制条件为:

301a0872000afde5e7de5f25ce0baf8a.gif

9425df3c5c0d5894c0370886c2cdfbb3.gif

该模型称为软间隔,引入的非负参数ξi(松弛变量),引入了这个参数后,可以发现允许一些样本点的函数间隔小于1,即在最大间隔区间内,或者函数间隔为负,即样本点在另一个类的区域内。 平白无故的放宽了条件,总是要讨回一点债的。因此我们将目标函数进行了调整,用来对离群点进行惩罚,目标函数后面加上的C∑ξi,表示离群点越多,目标函数值越大,而我们要求的是尽可能小的目标函数值,也就是说我在选择超平面时,要选择最合适的超平面使离群点的数目最小,这样目标函数的值就会相对离群点多的时候更小。C是离群点的权重,C越大表明离群点对目标函数影响越大,所以我们不希望超平面分离出更多的离群点。

这里的C是我们需要制定的一个参数。
解法和上面的流程大致相同(这里不多说了):

22aba0926a1fb9c8d01129bea9d9d1bd.png

核变换

接下来主要是谈论一下ϕ(x)。看了上面的介绍,是不是有一种这样的感觉:并没有觉得SVM厉害在哪里,只是进行了一个线性二分。要是真这样感觉那就大错特错了,不信接着往下看,SVM最厉害的地方出现了。
左边的图这些数据分布比较复杂,明显是线性不可分的。那么有没有一种方法来分开呢。当然有,那就是把低微不可分问题转为高维可分的(如右图)。

12c94d166c89d3e03750f3668d471138.png


再如下图:

fe288684bebbe791345ddfc30beb5f04.png

08e469295a4f9f367acfb29ce0d99366.png


那么接下来给出核函数的定义:
核函数(kernel function)就是指K(x, y) = <f(x), f(y)>,其中x和y是n维的输入值,f(·) 是从n维到m维的映射(通常,m>>n)。<x, y>是x和y的内积。
再来举个小小的栗子。
假如现在又两个数据: x = (x1, x2, x3); y = (y1, y2, y3);
按照SVM和函数理论来说,在3D空间内已经不能进行线性可分了,我们得通过一个函数把它映射到更高维的空间。
令 f(x) = (x1x1, x1x2, x1x3, x2x1, x2x2, x2x3, x3x1, x3x2, x3x3); f(y)亦然;(实际上就是把特征组合,相当于升维)。由于需要计算内积,所以需要计算在9维下的数据,一想就知道很复杂……
具体到数字:令x=(1,2,3);y=(4,5,6)。那么f(x)=(1,2,3,2,4,6,3,6,9),f(y)=(16,20,24,20,25,36,24,30,36)。此时<f(x),f(y)>=16+40+72…+324=1024。
这些数字比较小,看起来还能应付,但是如果数再大点呢,是不是就很复杂了,甚至没办法计算了。
但是发现:K(x, y)=(<x,y>)^2(<x,y>)2
K(x, y)=(4+10+18)^2=1024(4+10+18)2=1024
这种计算方法要比刚才的计算方法简单很多吧
这也是一个非常重要的特性。在支持向量机中,虽然说是映射到高维空间中去求内积,但是实际中计算的时候并没有在高维度下计算。只是假设映射到了高维空间,但实际上要的是计算的结果,这个结果在低维空间中计算就可以,然后把这个值映射到高维空间。所以核函数把高维空间的计算转换为低维空间中计算,实际并没有映射到高维空间中去

从低维到高维需要的这个映射就是核函数,那么核函数怎么来指定呢?
常用的核函数是高斯核函数(也称径向基 (RBF) 函数,是常用的一种核函数。它可以将有限维数据映射到高维空间)。
在机器中的效果如下:
线性核函数:

dc8f2c4605e72e8bc6753da6a28b546a.png


高斯核函数:

329ee044d16d17698c2c735669d9f086.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/538089.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TortoiseSVN 1.9.5安装 与 Eclipse4.4.2中安装SVN插件 图解详解

原文链接&#xff1a;http://blog.csdn.net/chenchunlin526/article/details/54631458 Eclipse svn 插件官网&#xff1a;http://subclipse.tigris.org/ Eclipse svn 插件更新网站&#xff1a;https://github.com/subclipse/subclipse/wiki -------------------------------…

虚拟服务器关机返回用户信息,在Linux服务器关机前向用户显示一条自定义消息...

在先前的文┞仿中&#xff0c;我们说清楚明了 Linux 中 shutdown、poweroff、halt、reboot 敕令的不合之处&#xff0c;并揭示了在用不合的选项履行这些敕令时它们实际做了什么。# shutdown 13:25本篇将会向你展示如安在体系关机时向所有的体系用户发送一条自定义的消息。建议浏…

eclipse svn不能忽略文件及文件夹,ignore设置无效 ?

SVN这块做得不好&#xff0c;如果之前提交过此文件&#xff0c;就不能设置忽略该文件了。所以第一次提交的时候要搞清楚再提交。 【 亲测&#xff0c;的确如此&#xff0c;用 Windows -> Preferences -> Team -> Ignored Resources 方法不行。 项目右键--team--设置…

Sonatype Nexus 库被删除的恢复方法

原文连接&#xff1a;https://my.oschina.net/u/178116/blog/519840 --------------------有道云笔记保存---------------------------------------------- 今天在整理公司Maven私服的时候&#xff0c;不小心把Release库删掉了。瞬间冒出冷汗来了&#xff01;公司所有的积累都…

maven私有库配置

不同的项目&#xff0c;不同的私有库1、添加仓库Release 发布&#xff1b; 发行仓库snapshot 快照&#xff0c;开发&#xff0c;调试仓库配置完成2、配置权限默认开通的权限&#xff0c;查看权限给刚才建的两个私有库添加权限配置好后3、创建角色&#xff0c;分配权限添加rolei…

asc desc排序_21.数据库排序?左连接 ?右连接?

更多内容来源&#xff1a;http://mp.weixin.qq.com/mp/homepage?__bizMzA5OTQ1ODE1NQ&hid6&sn843337a7d9931839214ec8f861ac2164&scene18#wechat_redirect1、数据库排序语法 select column_name,column_name from table_name order by column_name,column_name as…

京东ajax怎么用,使用Ajax、json实现京东购物车结算界面的数据交互实例

全选商品单价数量小计操作全选删除选中产品总价&#xff1a;&#xffe5;0body,html,ul,li,a{margin:0;padding:0;font-family:"microsoft yahei";list-style:none;text-decoration:none;}.fl{float:left;}.fr{float:right;}.f12{font-size:12px;}.disl{display:inli…

maven私有库搭建

为什么要搭建maven私有库&#xff1f; 有位博主在2008年时这样写道&#xff1a; 如果没有私服&#xff0c;我们所需的所有构件都需要通过maven的中央仓库和第三方的Maven仓库下载到本地&#xff0c;而一个团队中的所有人都重复的从maven仓库下载构件无疑加大了仓库的负载和浪费…

eclipse maven访问maven私有库

1、Windows本地maven下载 https://maven.apache.org/download.cgi 2、maven setting 文件配置 进入maven 目录下 conf。apache-maven-3.2.3\conf 新建.xml 文件&#xff0c;内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?><set…

入门系列之在Ubuntu 16.04使用Buildbot建立持续集成系统

欢迎大家前往腾讯云社区&#xff0c;获取更多腾讯海量技术实践干货哦~ 本文由angel_郁发表于云社区专栏 介绍 Buildbot是一个基于Python的持续集成系统&#xff0c;用于自动化软件构建&#xff0c;测试和发布过程。 在本教程中&#xff0c;我们将演示如何设置持续集成系统以自动…

strapi 开源api 内容管理平台试用

strapi 是一个开源的api && 内容管理平台&#xff0c;功能操作起来还是比较方便简单的。 安装 使用docker && docker-compose 代码clonegit clone https://github.com/strapi/strapi-docker && cd strapi-docker 启动 docker-compose up -d 访问 首次初…

1.android体系结构介绍

一、Android的介绍 android介绍见百度百科&#xff1a;Android的介绍&#xff0c;度娘把Android介绍的这么清楚&#xff0c;如果谷歌是Android的爹&#xff0c;那度娘就是娘了。 二、Android的架构图 android系统主要分四层&#xff1a; 从上致下&#xff1a; 1、应用层 2、…

2.JVM和DVM之间的区别

1、JVM .java----->.class----->.jar 运行在内存的 栈 栈虚拟机 2、DVM .java----->.class------>.dex-----(加上其它资源文件)---->apk 运行在CPU的 寄存器 寄存器虚拟机 ---------------------------------------------------------- 3、DVM与JVM的区…

Node.js模块以及模块加载机制

2019独角兽企业重金招聘Python工程师标准>>> Node.js中的模块 在Node.js中&#xff0c;以模块为单位划分功能&#xff0c;通过一个完整的模块加载机制使得开发人员可以将应用程序划分为多个不同的部分。模块的使用可以提高代码重用率&#xff0c;提高应用程序的开发…

获取数据库名称dbName

2019独角兽企业重金招聘Python工程师标准>>> Autowired DataSource ds; connection ds.getConnection(); tring dbName connection.getCatalog(); connection.close(); 转载于:https://my.oschina.net/u/2351011/blog/1925838

mysql连接idea详细教程_idea配置连接数据库的超详细步骤

学习时&#xff0c;使用IDEA的时候&#xff0c;需要连接Database&#xff0c;连接时遇到了一些小问题&#xff0c;下面记录一下操作流程以及遇到的问题的解决方法。一、 连接操作简介&#xff1a;介绍如何创建连接&#xff0c;具体连接某个数据库的操作流程。1.1 创建连接打开i…

redis单节点安装

1、下载 redis &#xff1a;https://redis.io/ redis 提供的是 源码包&#xff0c;需要编译。 2、Linux下安装gcc 和 tcl tcl介绍 命令&#xff1a;yum install gcc tcl 3、将redis的源码包&#xff0c;放到 /usr/local/src 下 tar -zxvf redis-4.0.6.tar.gz 4、安装redi…

ManicTime软件破解

这款软件用来记录电脑上程序的运行时间。方便天天用电脑的查看&#xff1a;今天我的时间都去哪儿了&#xff1f; 专业版不免费&#xff0c;而且需要 67 美元。 免费版和专业版的区别 破解补丁和官方软件下载&#xff08;截止博文发布&#xff0c;官方最新版本 版本&#xff1…

mysql根据ID的顺序查找_求救:mysql 如何根据给定的 ID顺序查找结果?

各位大神&#xff0c;现在我遇到了一个难题需要你们的帮助。有下面两个表post表&#xff1a;文章表。record表:记录表&#xff0c;用于记录用户阅读顺序。record表 根据用户的阅读文章顺序用一个字段 postid 记录 post 表的主键ID&#xff0c;既 record.postid 的外键为 post.i…

python入坑指南_Rust入坑指南:万物初始

有没有同学记得我们一起挖了多少个坑&#xff1f;嗯…其实我自己也不记得了&#xff0c;今天我们再来挖一个特殊的坑&#xff0c;这个坑可以说是挖到根源了——元编程。元编程是编程领域的一个重要概念&#xff0c;它允许程序将代码作为数据&#xff0c;在运行时对代码进行修改…