SVM理论学习记忆

转载自https://blog.csdn.net/chaipp0607/article/details/73662441

SVM算法在在1995年正式发表,在针对中小型数据规模的分类任务上有着卓越的效果,同时有着完整的理论证明,在20世纪末的几年和21世纪初的10年完胜神经网络,吴恩达在其2003年的《Machien learning》公开课上用两节课的时间对其进行讲解,而神经网络讲解了20min左右。就是这个算法把神经网络按在地上摩擦了大概15年的时间,直到深度学习的兴起。但即便这样,现在SVM算法依旧被广泛的使用。 
SVM大概的可以不确切的分为三个程度理解: 
(1)线性可分情况下的线性分类器,这是最原始的SVM,它最核心的思想就是最大的分类间隔(margin maximization); 
(2)线性不可分情况下的线性分类器,引入了软间隔(soft margin)的概念; 
(3)线性不可分情况下的非线性分类器,是SVM与核函数(kernel function)的结合。 

什么是最大分类间隔

SVM最大分类间隔的灵感来自于一个非常符合直觉的观察,如果存在两类数据,数据的特征是二维的,那么我们就可以把数据画在一个二维平面上,此时我想找到一个决策面(决策边界)去将这两类数据分开。如下图所示: 

这里写图片描述
 
理论上这个决策边界有无数种选择,就像图中画出的四条黑色的线,都能实现分类,但是哪一种是最好的分类方式呢?SVM算法认为在上图中靠近决策平边界的点(正负样本)与决策边界的距离最大时,是最好的分类选择: 

这里写图片描述
 
上图中红色的线就是要优化的目标,它表征了数据到决策边界的距离,这个距离就是所谓的最大分类间隔。同时在上面的几个数据,如果靠近两侧的数据少了几个(除了红色框住的数据,其他数据的多少完全不影响),也不会影响决策边界的确定,而被红色框框出来三个数据才决定了最终的决策边界,所以这三个数据被称之为支持向量

线性分类器

支持向量机算法如何实现最大分类间隔的任务呢?我们可以先从线性分类器开始理解它,支持向量在没有引入核函数的时候就是一个线性的分类器,我们假设与决策边界垂直的向量(决策面的法向量)为V:

这里写图片描述

黑色的线是假设的决策边界,X1和X2是决策边界两侧的两个点,Xt1和Xt2是两个点在法向量V上面的投影,那么可以很直观看到,原点到Xt1的距离<原点到Xt2的距离,而且可以推广延伸到只要数据点在决策边界的两侧,那么在决策边界左侧的数据点在法向量上面的投影距离永远比右侧的距离短,这就是支持向量机实现分类预测的依据。那么怎么用公式表征出这个点到直线投影的距离呢? 
这里写图片描述

如上图中的情况所示:要求向量b在向量a上的投影距离d,向量的内积可以表示为:

这里写图片描述 
 
于是角度的余弦为: 

这里写图片描述
 
距离d可以表示为: 

这里写图片描述


而在SVM的特征空间中,a是决策边界的法向量,那么a为单位法向量的时候其模为1,所以就有:

这里写图片描述

最后我们把a和b换成上面设定的值就会有: 

这里写图片描述
 
有了这个东西,我们总能找到一个常数C分开两类数据,也就是说:

这里写图片描述

到了上面的公式后,问题就非常的清晰了,法向量V其实就是决策边界的系数(这是解析几何里面的知识),那么大家肯定见过一种和它非常像的公式,叫做样本空间下的超平面线性方程:

这里写图片描述

线性分类器就是这个样子!!! 
不经过sigmoid函数的Logistic模型也是这个样子!! 
不激活的神经网络中的单个神经元还是这个样子!!


如何实现最大分类间隔

从上面可以看到,此时的支持向量机(没有加核函数)就是个线性的分类器,它的卓越性能就体现在在线性分类器基础上的最大分类间隔。
所以本质上SVM要训练的参数只有w和b,关键就在于SVM如何在优化中体现最大分类间隔的思想!
针对所有的训练数据(traindata),SVM都希望:

这里写图片描述

这里的正负1就体现的最大分类间隔,这里是选择用正负1是为了计算方便,因为无论间隔是多少,都可以依靠伸缩w和b约为1。上述公式就是SVM的最大间隔假设。如下图:

这里写图片描述

在这个图中,决策边界两边的线之间的距离(最大间隔)为:

这里写图片描述

它是这样求出来的,数据中的支持向量在影响着最大间隔,那么假设两个支持向量x1和x2分别为正负,最大间隔就应该是x2-x1在法向量上的投影:

这里写图片描述

所以求取d的过程为:

这里写图片描述

这里写图片描述

这就是SVM的优化目标,它想要找到max(d),然后大家可能发现了,这个目标里面没有b,之和w有关,那么是不是任意的b都可以呢?
显然不是的,这个优化有一个约束条件,因为推导的过程就有假设条件是两个支持向量要求在两侧,所以这个约束条件可以写成:

这里写图片描述

所以最终的目标为:

这里写图片描述

或者为:

这里写图片描述

需要注意的是,约束条件中的i=1…….n,n为样本的个数。

其中约束条件为n个,这是一个关于w和b的最小值问题。

根据拉格朗日乘子法:就是求函数f(x1,x2,…)在g(x1,x2,…)=0的约束条件下的极值的方法。其主要思想是将约束条件函数与原函数联系到一起,使能配成与变量数量相等的等式方程,从而求出得到原函数极值的各个变量的解。即可以求得:
这里写图片描述

其中a就是拉格朗日乘子法进入的一个新的参数,也就是拉格朗日乘子。
那么问题就变成了:

这里写图片描述

所谓的对偶问题就是:

这里写图片描述

做这种转换是为了后面的求解方便,因为最小值问题,求导就可以啦!!
下面对w和b分别求偏导(这里是纯数学计算,直接给结果了):

这里写图片描述

在这里求出了两个结果,带入到L(w,b,a)中:

这里写图片描述

所以问题被转化成为:
这里写图片描述

这里写图片描述

注意这里的约束条件有n+1个,之后只需要根据Data(x),Label(y)求解出满足条件的拉格朗日系数a,并将a带回求得w和b,于是就有了最后的决策边界。(w,b,x,y,a都是向量)

这里写图片描述

注意:在上面b的公式中,i=1,2,…,n。但是j却没有给值,这是因为j是任意一个支持向量都可以。

在这里对w和b的公式的推导做一个简短说明,w是通过拉格朗日求偏导后推出的;在学习SVM(二) 如何理解支持向量机的最大分类间隔中我们知道最大间隔为: 

这里写图片描述
 
那么支持向量到决策边界的距离为:

 这里写图片描述
, 
同时根据点到直线的距离公式有:

 这里写图片描述
 
超平面(w,b)能够将训练样本正确分类,即对于,

这里写图片描述

因此去掉绝对值可以得到关于b的公式。

而非支持向量的数据就在求解参数a,w,b的过程中,前面的参数w求得的结果会为0,这样就满足了之前的说法,只有支持向量在影响着决策边界的确定。


 

 

转载自https://blog.csdn.net/chaipp0607/article/details/73662441

https://blog.csdn.net/chaipp0607/article/details/73716226

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

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

相关文章

Python中jmespath解析提取json数据

在做接口自动化&#xff0c;测试断言时&#xff0c;我们经常需要提取接口的的响应数据字段&#xff0c;以前用过jsonpath&#xff0c;有几篇相关文章&#xff0c;可以参考下&#xff08;Python深层解析json数据之JsonPath、【Jmeter篇】后置处理器之正则提取器、Json提取器 、J…

SVM学习记录

第一个min&#xff1a;先在数据中找离决策边界距离最近的样本点 第二个max&#xff1a;寻找w和b使得刚才找到的点离决策边界最远的平面&#xff08;平面方程&#xff1a;&#xff09; 求解出后即可求出w和b。 例如&#xff1a; 如果等于0.根据上面的公式&#xff0c;得到w就为…

缺陷定位 | 测试发现了Bug,还要分析定位Bug?(一)

hello今天分享的内容&#xff0c;可能会有很多朋友持不同观点&#xff0c;或被很多同行朋友diss&#xff0c;不过没关系&#xff0c;即使被喷被diss&#xff0c;我依然会坚持我的观点&#xff0c;把最真实的干货分享给大家&#xff0c;希望得到支持。测试工程师在互联网行业里&…

opencv glob 内存溢出异常

先贴代码(非常简单的代码&#xff09; #include "opencv2/imgproc.hpp" #include "opencv2/highgui.hpp" #include "opencv2/ml.hpp" #include "opencv2/objdetect.hpp" #include <iostream> #include <time.h> using na…

白盒测试 | 用例设计方法之条件组合覆盖

往期关联文章回顾&#xff1a;白盒测试 | 用例设计方法之条件覆盖白盒测试 | 用例设计方法之判定覆盖白盒测试 | 用例设计方法之语句覆盖条件组合覆盖&#xff1a;列出所有判定条件中可能的取值组合&#xff0c;使得每个判定条件结果的所有可能组合至少出现一次程序流程图&…

npm安装教程

一、使用之前&#xff0c;我们先来掌握3个东西是用来干什么的。 npm: Nodejs下的包管理器。 webpack: 它主要的用途是通过CommonJS的语法把所有浏览器端需要发布的静态资源做相应的准备&#xff0c;比如资源的合并和打包。 vue-cli: 用户生成Vue工程模板。&#xff08;帮你快…

测试管理 | 测试经理定义和实施测试度量

往期关联文章回顾&#xff1a;瀑布、V、W、快速原型模型、增量、螺旋模型测试管理 | 4种优先级排序方法一定要掌握测试管理 | 基于风险的测试管理上有这样一句名言&#xff0c;进行度量的工作才会得到有效的执行。反之&#xff0c;因为很容易忽略那些不进行度量的工作&#xff…

Python核心场景自动化测试项目实战(二)

往期关联文章回顾&#xff1a;PytestAllureJenkins接口自动化项目实战&#xff08;一&#xff09;【Python篇】核心场景接口自动化方案&#xff08;一&#xff09;以前我们用pythonunittestHTMLTestRunnerjenkins结合实际项目写过一个核心场景自动化测试&#xff0c;也在实际工…

opencv图像切割1-KMeans方法

kMeans随机数据分类&#xff1a; #include<opencv2\opencv.hpp> #include<iostream> using namespace cv; using namespace std; int main1() {Mat img(500, 500, CV_8UC3);RNG rng(12345);Scalar colorTab[] {Scalar(0,0,255),Scalar(0,255,0),Scalar(255,0,0),…

mitmproxy抓包 | Python疑难测试场景mock

往期经典文章回顾&#xff1a;抓包工具mitmproxy环境配置使用&#xff08;一&#xff09;抓包工具mitmproxy | mitmweb基本用法&#xff08;二&#xff09;mitmproxy抓包 | Python实时生成接口自动化用例mitmproxy抓包 | Python实时生成接口自动化用例&#xff08;三&#xff0…

opencv图像分割2-GMM

GMM随机数分类&#xff1a; #include<opencv2\opencv.hpp> #include<iostream> using namespace cv; using namespace std; using namespace cv::ml; int main() {Mat imgMat::zeros(500, 500, CV_8UC3);RNG rng(12345);Scalar colorTab[] {Scalar(0,0,255),Scal…

mitmproxy抓包 | Python疑难测试场景mock实战(四)

往期经典文章回顾&#xff1a;抓包工具mitmproxy环境配置使用&#xff08;一&#xff09;抓包工具mitmproxy | mitmweb基本用法&#xff08;二&#xff09;mitmproxy抓包 | Python实时生成接口自动化用例mitmproxy抓包 | Python实时生成接口自动化用例&#xff08;三&#xff0…

mitmproxy抓包 | Python篡改请求参数实战(五)

抓包工具mitmproxy环境配置使用&#xff08;一&#xff09;抓包工具mitmproxy | mitmweb基本用法&#xff08;二&#xff09;mitmproxy抓包 | Python实时生成接口自动化用例&#xff08;三&#xff09;mitmproxy抓包 | Python实时生成接口自动化用例mitmproxy抓包 | Python疑难…

数据结构-链表1-顺序存储

DynamicArray.h #ifndef DYNAMIC_ARRAY_H #define DYNAMIC_ARRAY_H #define _CRT_SECURE_NO_WARNINGS #include<stdlib.h> #include<stdio.h> #include<string.h>//动态数组结构体 typedef struct DYNAMICARRAY {int* pAddr; //具体存放数据的地址int size…

全网都在用的超全【面试刷题小程序】,最新版激活教程

前几天&#xff0c;我的一个粉丝留言给我说&#xff0c;他在面试美团的自动化测试岗的时候&#xff0c;不幸挂掉了。越想越觉得可惜&#xff0c;回想面试经过&#xff0c;好好总结了几个点&#xff0c;发现面试没过的主要原因是在几个关键的问题没有给到面试官想要的答案。从而…

数据结构-链表2-链式存储

LinkList.h #ifndef LINKLIST_H #define LINKLIST_H #define _CRT_SECURE_NO_WARNINGS #include<stdlib.h> #include<stdio.h> #include<string.h>//链表结点 typedef struct LINKNODE {void* data; //无类型指针&#xff0c;指向任何类型的数据struct LIN…

字节内部自动化测试培训资料,明年涨薪用得上

今天是12月27日&#xff0c;2021年还剩下最后4天。昨晚我收到一位粉丝朋友的涨薪喜讯&#xff0c;他踩着2021的尾巴&#xff0c;成功跳进广州海珠的互联网巨头&#xff0c;涨薪幅度达284%。其实每年的年末&#xff0c;圈子里的朋友都特别忙&#xff0c;大家都在为来年跳槽做准备…

数据结构-链表3-循环链表

LinkList.h #ifndef LINKLIST_H #define LINKLIST_H #define _CRT_SECURE_NO_WARNINGS #include<stdlib.h> #include<stdio.h> #include<string.h>//链表小结点 typedef struct CIRCLELINKNODE {struct LinkNode *next; }CircleLinkNode;//链表结构体 type…

探索篇 | 接口字段容错测试(三)

往期关联文章&#xff1a;探索测试 | 新奇深层测试策略之案例剖析&#xff08;一&#xff09;探索篇 | 新奇测试策略剖析&#xff0c;大家都觉得多此一举(二)探索篇|越权测试策略之案例剖析&#xff08;一&#xff09;重磅福利 | 全网唯一,多年踩坑经验&#xff0c;探索测试策略…

数据结构-链表4-企业链表

LinkList.h #ifndef LINKLIST_H #define LINKLIST_H#include<stdio.h> #include<stdlib.h> //链表结点 typedef struct LINKNODE {struct LINKNODE *next; }LinkNode;//链表 typedef struct LINKLIST{LinkNode head; //放在第一个&#xff0c;防止有偏移量.//不…