svm支持向量机中的支持向量,svm python 代码实现

  svm支持向量机中的支持向量,svm python 代码实现

  支持向量机(SVM)是一种非常常见的分类器,已经流行了十多年。其分类能力强于NN,整体实力与LR、RF相当。核心思想是通过构造一个分割平面来分离数据。本文主要阐述SVM的基本工作原理和简单应用。

  1.线性可分SVM

  线性可分SVM的原理是实现硬边际最大化。线性可分是指当我们要用一个划分平面来划分两个数据时,至少有一个划分平面,这样两个数据就可以完全分开。那么我们认为这个SVM是线性可分的。

  2.线性SVM

  线性SVM是指虽然划分面不能完全划分所有的数据,但线性划分方法可以正确地对大部分数据进行分类。那么这样的SVM也可以称为线性SVM。线性SVM旨在实现软利润最大化。这里的软对应于线性可分SVM的硬。硬边界指的是支持向量和分割平面之间的距离,因为支持向量最接近分割平面,并且该距离是过渡区宽度的(一半)。并且软余量意味着当SVM不是线性可分的时,支持向量不一定是离分裂平面最近的向量。因此,SVM此时不能盲目地最大化保证金,而是要使过渡区足够宽。这时候的利润最大化并不是真正意义上的,严格意义上的利润最大化。所以用软来区分。

  3.非线性SVM

  对于前两个支持向量机,增加一个核函数可以构造一个非线性SVM。

  4.选择支持向量并构建分割平面。

  对于直线来说:其实就是直线的法线方向。如果我们在方程左边代入(,),当方程大于0时,x在法线的正方向,小于0时,在法线的负方向,等于0时,在法线上。如果把这个性质应用到更高维,如果x是一个n维向量,那么直线就变成了超平面。

  如何选择支持向量?以线性可分SVM为例,我们把W看成几个样本的线性组合,第一个样本为,第I个样本为。对于每个x,给出它的系数。此时:存在,选择一些零件,使其值不为0,其他所有值都设置为0。真正对w起作用的是这些值不为0的x向量。这些支持法线向量的向量因此是支持向量。这个表达式只是粗略地描述了支持向量的选择机制,它将在第5节中得到严格的证明。

  如果直线L有参数W和B,通过计算每个样本到直线L的距离,就可以衡量出哪条直线是最合适的分割线。d可以表示为:如果数据集中每个样本的形式是T={(,)(,)…(,)},每个样本的Y值就是这个样本的标号。正例为1,反例为-1。这里的正值和负值实际上反映了样本在分割线处的方向。定位在法线的正方向为正。将Y值一起乘以等式的右侧:其中Y值是样本的实际正值和负值。如果估计值与实际值符号相同,即分类正确,则结果为正。如果分类错误,结果是否定的。

  在所有样本中,应该选择最接近直线的样本作为支持向量。支持向量和直线之间的距离是过渡区。因为SVM期望过渡区尽可能大,所以最终参数W和B的选择可以表示为:

  ,

  因此,给定线性可分训练数据集,最大化区间得到的分割超平面为:对应的分类决策函数为:

  5.目标函数

  对于线性可分SVM,目标函数实际上是分割平面的选择,所以目标函数实际上是:

  ,

  对于上面的公式,在不改变分裂平面位置的情况下,总有一个w的值,使得最近向量到直线的距离为1。因此,在上面的公式中,最小值总是可以取1。此时w的值其实就是目标函数本身。虽然存在约束:因此,拉格朗日乘数可用于寻找目标函数的极值:

  可进行表面处理:

  对目标函数使用拉格朗日乘数:

  这里的w和b是原始参数,但是引入的参数且大于或等于0。为了便于排序和简化,计算L的偏导数,偏导数为0:

  根据上面的公式,当它等于0时,可以知道它对W和b没有影响,因此,真正的支持向量是那些不为0的向量。

  下面是凸优化得到的最终解的公式:

  之后,我们可以通过回代得到W和B:

  6.松弛因子

  对于线性SVM,由于不要求所有样本都成对,其约束条件不同于线性可分SVM。给一个大于等于0的松弛因子,使函数区间加上松弛因子大于等于1。这时,有目标函数和约束条件:

  上式中,c是控制松弛因子权重的参数。当C足够大时,只能趋近于0,变回线性可分SVM。因此,上述公式也可以看作是线性可分SVM的推广。松弛项可以理解为线性回归中的正则项。c值越小,过渡带越宽,c值越大,过渡带越窄。这也使得线性SVM具有更强的泛化能力。

  类似地,在线性SVM的目标函数及其约束条件中使用拉格朗日乘子后,偏导数可以如下获得:

  这里直接给出最终解的形式:

  7.损失函数

  SVM损失通常被定义为从过渡带的边界到过渡带外未被正确分类的向量的距离。对于位于过渡区的样品,损耗为1-D。D是样品到分离平面的距离。注意,如果是在“局部”过渡区,D为正。如果分割平面已被穿过,则d的值变为负值。这种损耗也称为铰链损耗。因此,损失函数可以写成:

  换句话说,松弛因子本身可以被视为损失的度量。因为松弛因子本身也是包含分割平面的分割误差。事实上,损失本身是线性SVM允许过渡区矢量存在的结果,甚至与一些错误分类的矢量相妥协。因此,最初的目标函数:

  某种意义上可以认为是铰链损耗加一。

  8.核心

  核可以说是SVM的精髓,其目的是通过将原始输入空间映射到更高维的特征空间,使得原始的线性可分样本在新的核空间中变得线性可分。常见内核有:

  从多项式核函数开始,最基本的就是当C=0,D=2时,kernel将原来的两个变量成对相乘。这相当于维数的平方。在尺度上,特征的数量变成了平方,但计算复杂度没有明显增加。

  径向基函数是固定的,对于变化,它以指数形式衰减。于是我以为是中心,做了一个贵族蜗牛分布。因此被称为高贵的蜗牛内核函数。对于每个样本的标签,正例由内核拉起,负例向下延伸。从而分离数据。

  分离后,数据可以由多个分割表面分离。我们要选择的,其实是让最接近分割面的样本尽可能远离分割面的分割方法。因此,最终的超平面选择是基于线性SVM的。RBF的维数映射可以理解为无限维,因为数学上,RBF的指数可以用亮哑铃来展开。公式中的每一项都可以理解为这个维度上的样本分离。由于其强大的高维映射能力,RBF往往是首选核。

  9.虹膜数据分类代码

  数据选择虹膜数据,数据格式为:

  5.1,3.5,1.4,0.2,鸢尾属

  前面的数据分别是花的花瓣和sapel的长度和宽度值,最后一个是label,是花的类型。数据总量为150条,三种花各50条。代码如下:

  从sk学习进口熊猫作为PD从sk学习进口SVM。模型_选择从sk学习导入训练_测试_分割。度量导入accuracy _ score if _ _ name _ _= _ _ main _ _ :path= iris。数据数据=PD。read _ CSV(path,header=None) data[4]=pd .分类(数据[4])。代码x,y=np.split(data.values,(4,)axis=1)# print(x)# print(y)x _ train,x_test,y_train,y_test=train_test_split(x,y,random_state=1,train_size=0.8) svm_model=svm .SVC(C=0.5,内核=线性,决策_功能_形状= ovr )# SVM _模型=SVM .SVC(C=0.8,内核=rbf ,伽马=20,决策_函数_形状= ovr )SVM _模型。适合(x _ train,y _ train。ravel())print(Accuracy _ score(y _ train,SVM _ model。predict(x _ train)))print( Accuracy:,accuracy_score(y_test,SVM _ model)。预测(x _ test)))#打印(y _ test)。ravel())# print(SVM _模型。预测(x _ test))

  最终结果:精度=1.0

  支撑向量机可以说是泛化能力很强的优质分类器,准确率也很高。相比于实验室反应堆和无线电频率(radio frequency)难点在于调参100 .无线电频率(radio frequency)更多的注重效率,在模型训练以及特征选择上省下了大把时间100 LR .学习速率也快于SVM,比较通用,精确度和效率都不错。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: