支持向量机SVM算法
支持向量机SVM
目录
- 支持向量机SVM
- 1.支持向量机原理
- 2.如何找出边际最大的决策边界
- 3.拉格朗日乘数
- 4.非线性SVM与核函数
- 5.示例
支持向量机(SVM,也称支持向量网络),是机器学习中获得更关注最多的算法没有之一
从实际应用看
- SVM在各种实际问题中都表现非常优秀,他在手写识别数字和人脸识别中应用广泛,在文本和超文本的分类中举足轻重。同时,SVM也被用来执行图像的分类,并用于图像分割系统…
从学术角度看
- SVM是最接近深度学习的机器学习算法
1.支持向量机原理
支持向量机分类原理
- 支持向量机,就是通过找出边际最大的决策边界,来对数据进行分类的分类器,因此,支持向量机分类器又叫做最大边际分类器。
支持向量机的分类方法,是在一组分布中找出一个超平面作为决策边界,使模型在数据上的分类误差尽量接近于0,尤其是在未知数据集上的分类误差尽量小
超平面
在几何中,超平面是一个空间的子空间,它是维度比所在空间小一维的空间。如果数据空间本身是三维的,则其超几何是二维平面
决策边界:在二分类问题中,如果一个超平面能够将数据划分为两个集合,其中每个集合中包含单独的一个类别,我们就说这个超平面是数据的"决策边界"
决策边界的边际
如图:我们有B1和B2两条可能的决策边界。可以八决策边界B1向两边平移,直到碰到离这条决策边界最近的方块和圆圈后停下,形成两个新的超平面,分别为b11和b12,并且我们将原始的决策边界移动到b11和b12中间,确保B1到b11和b12的距离相等。在b11和b12中间的距离,叫做B1这条决策边界的边际(margin),通常记作d
为了简便,我们称b11和b12为"虚拟超平面"
决策边界的边际对分类效果的影响
如图表现出,拥有更大边际的决策边界在分类中的泛化误差更小,如果边际很小,则任何轻微扰动都会对决策边界的分类产生很大的影响,边际很小,是一种模型在训练集上表现很好,却在测试集表现糟糕的情况,所以会"过拟合"
即,在寻找决策边界时,边际越大越好
2.如何找出边际最大的决策边界
- 假设现在数据集中有N个训练样本,每个训练样本
i
可以表示为(xi,yi)
(i=1,2,3...N
),其中xi是(x1i,x2i,x3i...xni
)的特征向量。也就是说训练样本中的特征数据只有两种不同形式的特征。二分类的标签yi的取值为(1,-1)这两类结果。接下来可视化我们的N个样本数据的特征数据:(紫色为一类,红色为另一类)
- 让所有紫色点的标签为1,红色点的标签为-1。我们要在这个数据集上寻找一个决策边界,在二维平面上,决 策边界(超平面)就是一条直线。二维平面上的任意一条线可以被表示为:
其中[a,-1]是参数向量,X是特征向量,b是截距
在一组数据下,给定固定的w和b,就可以固定一条直线,在w和b不确定的情况下,这个表达式可以是任意一条直线。如果在w和b固定时,给定一个唯一的x取值,这个表达式就可以表示一个固定点,固定下来的直线就可以作为SVM的决策边界
在SVM中,就是用这个表达式来表示决策边界,目标是求解能够让边际最大化的决策边界,所以要求解参数向量w和b
如果在决策边界上任意取两个点
xa,xb
,则有:
一个向量的转置乘以另一个向量,可以获得向量的点积(
dot product
)。两个向量的点积为0表示两个向量的方向是互相垂直的。xa
与xb
是一条直线上的两个点,相减后得到的向量方向是由xa
指向xb
,所以xa-xb
的方向是平行于他们所在的直线【决策边界】。而w与xa-xb
相互垂直,所以参数向量w的方向必然是垂直于我们的决策边界此时有了决策边界,图中任意一个紫色的点
xp
可以表示为w*xp+b=p
- 紫色点所表示的标签y为1,规定p>0
任意一个红色的点
xr
可以表示为w*xr+b=r
- 红色点所表示的标签y是-1,规定r<0
如果有新的测试数据
xt
,根据以下公式判定
- 决策边界的两边要有两个超平面,这两个超平面在二维空间中是两条平行线(就是虚拟超平面),他们的距离就是边际d,而决策边界位于这两条线中间,所以两条平行线是对称的,另这两条平行线被表示为:
支持向量:
- 让这两条线分别过两类数据中距离我们虚线决策边界最近的点,这些点被称为"支持向量"。另辞色类的点为
xp
,红色类的点为xr
(xp和xr
作为支持向量),得到:
- 让这两条线分别过两类数据中距离我们虚线决策边界最近的点,这些点被称为"支持向量"。另辞色类的点为
两式相减为了求出两条虚线之间的距离
如图:
xp-xr
可以表示两点之间的连线(距离),而边际d平行于w,即,相当于得到了三角形的斜边,并知道一条直线边的方向数学性质得知:向量a乘以向量b方向上的单位向量,可以得到向量a在向量b方向上的投影的长度
xp-xr
作为向量a,w作为向量b,既可以求出边际的长度向量b除以自身的模长
||b||
可以得到向量b方向上的单位向量
- 我们将上述式子两边除以
||w||
,可以得到:
- 求最大化d,就是求w的最小值,把求解 的最小值转化为,求解以下函数的最小值:
只所以要在模长上加上平方,是因为模长的本质是一个距离(距离公式中是带根号的),所以它是一个带根号的存在,我们对它取平方,是为了消除根号,不带平方也可以。
两条虚线表示的超平面,表示的是样本数据边缘所在的点,所以对于任意样本
i
,可以把决策函数写作
如果
wxi+b>=1
,yi=1
,则yi(wxi+b)>=1
,如果wxi+b<=-1
,yi=-1
,则yi(wxi+b)>=1
最终得到支持向量机的损失函数
subject to
:标识并且的意思
3.拉格朗日乘数
- 对损失函数求解,目标是求解让损失函数最小化的w,如果
||w||=0
,f(w)
必然很小,但是||w||=0
是一个无效值【因为我们的决策边界wx+b=0
,如果w为0,则这个向量包含的所有元素都为0,就有b=0这个唯一值,如果b和w都为0,决策边界不可能是一条直线,条件yi(wxi+b)>=1
就不可能实现,所以w不可以是一个0向量】 - 即,我们希望找出一种方式,能够让我们的条件
yi(wxi+b)>=1
在计算中也被纳入考虑,就是使用拉格朗日乘数法
4.非线性SVM与核函数
不是所有的数据都是线性可分的,不是所有的数据都能一眼看出有一条直线,或一个平面,甚至一个超平面可以将数据完全分开。如下图,对于这样的数据,需要对它进行升维变化,让数据从原始的空间x投射到新空间
q(x)
中,升维之后,明显可以找出一个平面,能够将数据切分开来q(x)
是一个映射函数,他代表了某种能够将数据升维的非线性的变换,对数据进行这样的变换,确保数据在自己的空间中一定能够线性可分
核函数
- 我们很难去找出一个函数
q(x)
来满足我们的需求,并且在我们并不知道数据究竟被映射到了一个多少维度的空间当中,有可能数据被映射到了无限空间中,我们的计算和预测就会很难。 - 核函数
K(xi,test)
能够用原始的数据空间中的向量计算来表示升维后的空间中的点积q(x)*q(xtest)
,以帮助我们寻找合适的q(x)
,适合不同的核函数,就可以解决不同数据分布下寻找超平面问题 - 这个功能由参数"
kernel(ˈkərnl)
"和一系列与核函数相关的参数来进行控制
- 我们很难去找出一个函数
观察结果
- 线性核函数和多项式核函数在非线性数据上表现会浮动,如果数据相对线性可分,则表现不错,如果是像环形数据那样彻底不可分,则表现很糟糕,在线性数据集上,线性核函数和多项式核函数即便有扰动项也可以表现不错,即多项式核函数【多项式函数妒多被用于图像处理之中】虽然可以处理非线性情况,但是更偏向于线性的功能
Sigmoid
核函数,在非线性数据上强于两个线性核函数,但效果明显不如rbf
,他在线性数据上完全比不上线性的核函数,对扰动项抵抗也比较弱,所以它的功能比较弱小,很少用到rbf
:高斯径向基核函数基本在任何数据基上都表现不错,属于比较万能的核函数。【rbf
不擅长处理数据分布不均衡的数据】
使用核函数优先使用高斯径向基核函数,它适用于核转换到很高的空间的情况,在各种情况下效果都不错,如果
rbf
效果不好,再试其它的核函数;
5.示例
from sklearn.datasets import load_breast_cancer
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScalerdata=load_breast_cancer()
feature=data.data
target=data.target
feature.shape #(569, 30)
np.unique(target)#array([0, 1])pca=PCA(n_components=2)
pca_feature=pca.fit_transform(feature)
pca_feature.shape #(569, 2)
# 处理:初步任意选取两种特征,将其映射在散点图中查看是否线性可分。
plt.scatter(feature[:,0],feature[:,1],c=target)x_train,x_test,y_train,y_test=train_test_split(feature,target,test_size=0.3,random_state=420)
Kernel=['linear','rbf']
for kernel in Kernel:#cache_size:在计算机中为SVM提供多大的内存空间用于计算,单位为Mbclf=SVC(kernel=kernel,cache_size=1000)clf.fit(x_train,y_train)print('the accuracy under kernel %s is %f' %(kernel,clf.score(x_test,y_test)))
# the accuracy under kernel linear is 0.929825
# the accuracy under kernel rbf is 0.918129
# rbf在线性数据上也可以表现得非常好,那在这里,为什么跑出来的结果如此糟糕呢#通过观察特征数据的标准差,最大,最小值发现特征中的数据分布很不均衡,则试着对其进行归一化处理
x=StandardScaler().fit_transform(feature)
x_train,x_test,y_train,y_test=train_test_split(x,target,test_size=0.3,random_state=420)
Kernel=['linear','rbf']
for kernel in Kernel:clf=SVC(kernel=kernel,cache_size=1000)clf.fit(x_train,y_train)print("The accuracy under kernel %s is %f" % (kernel,clf.score(x_test,y_test)))
# The accuracy under kernel linear is 0.976608
# The accuracy under kernel rbf is 0.970760
#发现rbf的分数提高了
#结论:rbf不擅长处理数据分布不均衡的数据。
支持向量机SVM算法相关推荐
- 支持向量机SVM算法原理及应用(R)
支持向量机SVM算法原理及应用(R) 2016年08月17日 16:37:25 阅读数:22292更多 个人分类: 数据挖掘实战应用 版权声明:本文为博主原创文章,转载请注明来源. https://b ...
- 机器学习算法 08 —— 支持向量机SVM算法(核函数、手写数字识别案例)
文章目录 系列文章 支持向量机SVM算法 1 SVM算法简介 1.1 引入 1.2 算法定义 2 SVM算法原理 2.1 线性可分支持向量机 2.2 SVM计算过程与算法步骤(有点难,我也没理解透,建 ...
- 机器学习-支持向量机SVM算法
文章目录 简介 原理 硬间隔 支持向量 对偶问题 软间隔 核函数 SMO算法 小结 多分类问题 回归问题 应用示例 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点 ...
- 支持向量机——SVM算法及例子(代码)
终于拖到最后一天交机器学习作业,选择了SVM算法,之前一直听说过,现在终于有了初步的了解,顺便post到这里分享一下,不足地方请大家指出 本文内容有来自<统计学习算法>(李航 著)第7章- ...
- 支持向量机SVM算法原理笔记2
上篇博客介绍了当样本集是线性可分情况下的SVM算法原理.接下来介绍不存在一个划分超平面可以正确分类的问题,比如说"异或问题". 对于此类问题,可以将样本空间映射到更高维度空间,这样 ...
- 支持向量机 SVM 算法推导优缺点 代码实现 in Python
1.基本思想 前面讲到的Logistic Regression在拟合过程,实际上关注所有样本点的贡献,即寻找这么一个超平面,使得正例的特征远大于0,负例的特征远小于0,强调在全部训练数据上达到这一目标 ...
- 优雅的读懂支持向量机 SVM 算法
转自:JerryLead http://www.cnblogs.com/jerrylead/archive/2011/03/13/1982639.html 简介 支持向量机基本上是最好的有监督学习算法 ...
- 打造属于自己的量化投资系统9——支持向量机SVM算法在股票预测涨跌中应用
1.支持向量机即SVM原理 支持向量机即SVM(Support Vector Machine) ,是一种监督学习算法,属于分类的范畴.它的原理就是求出"保证距离最近的点,距离它们最远的线&q ...
- 支持向量机SVM算法原理
SVM 的英文叫 Support Vector Machine,中文名为支持向量机.它是常见的一种分类方法,在机器学习中,SVM 是有监督的学习模型. 什么是有监督的学习模型呢?它指的是我们需要事先对 ...
最新文章
- 买不到口罩怎么办?Python爬虫帮你时刻盯着自动下单!| 原力计划
- 联想笔记本Win10 F1-F12失效的解决方法
- Xcode出现( linker command failed with exit code 1)错误总结
- YBTOJ:魔法数字(数位dp)
- phpcmsV9子栏目调用其父栏目名称、URL、catid等信息 - 方法总结
- 开放式关系抽取_有效的开放式合作伙伴关系的3课
- 对一个可进行带括号 加减乘除运算类的分析
- JAVA Swing GUI设计 WindowBuilder Pro Container使用大全2——JPanel使用
- 怎么用c语言输入一串字符个数字,请问这个用c怎么做:输入一串字符,分别统计其中数字和字母的个数...
- 程序员的思维修炼:开发认知潜能的九堂课
- chrome浏览器使用
- java delight 咖啡是什么意思_各种咖啡的含义是什么?
- 手机构建Linux环境,Linux手机DIY.构建统一安装包
- 植物神经紊乱、焦虑症和抑郁症之间有哪些区别呢?
- 【华为OD机试真题】促销活动(货币兑换)100%通过率
- JavaWeb-10-JavaScript高级学习笔记
- [HL7_V2.4]HL7消息生成和反射
- Mixly 触摸开关的使用
- 三国著名人物籍贯一览列表
- com.itextpdf.io.IOException Type of font null is not recognized
热门文章
- LeetCode 2331. 计算布尔二叉树的值(树的遍历)
- Qt之实现3D纹理渲染自由旋转空间立方体
- 计算机软考初级含金量高吗?
- MATLAB图像分割——使用纹理滤波器分割图像
- Proxmox VE安装使用心得记录
- 小学计算机课玩的游戏,小学电脑课上偷偷玩儿过的5款游戏,又一个会引来围观...
- C语言初级:Hello world、数据类型、变量常量、字符串、转义字符、注释、选择语句、循环语句
- 星起航:电商行业竞争日益激烈,如何做好电商运营
- 不知道怎么用小图标?简单的iconfont矢量图标教学,装饰你的网页
- 【C++详解】——多态