10- SVM支持向量机 (SVC) (算法)

这篇具有很好参考价值的文章主要介绍了10- SVM支持向量机 (SVC) (算法)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • 支持向量机(support vector machines,SVM)是一种二分类算法,它的目的是寻找一个超平面来对样本进行分割,分割的原则是间隔最大化,如果对应的样本特征少,一个普通的 SVM 就是一条线将样本分隔开,但是要求线到两个类别最近样本点的距离要最大。
  • 支持向量机模型:
from sklearn import svm
clf_linear = svm.SVC(kernel='linear')   # kernel = 'linear'
clf_linear.fit(X_train,y_train)
score_linear = clf_linear.score(X_test,y_test)

clf_poly = svm.SVC(kernel='poly')      # kernel = 'poly'
clf_poly.fit(X_train,y_train)
score_poly = clf_poly.score(X_test,y_test)
  • 网格搜索最佳参数:
svc = SVC()
params = {'C':np.logspace(-3,1,20),'kernel':['rbf','poly','sigmoid','linear']}
gc = GridSearchCV(estimator = svc,param_grid = params)
gc.fit(X_train_pca,y_train)

1.1 原理简介

支持向量机(support vector machines,SVM)是一种二分类算法,它的目的是寻找一个超平面来对样本进行分割,分割的原则是间隔最大化,如果对应的样本特征少,一个普通的 SVM 就是一条线将样本分隔开,但是要求线到两个类别最近样本点的距离要最大。

10- SVM支持向量机 (SVC) (算法)

        就是在寻找一个最优的决策边界(上图中的两条虚线)来确定分类线b,所说的支持向量就是距离决策边界最近的点(上图中p1、p2、p3点,只不过边界穿过了这些点)。如果没有这些支持向量点,b线的位置就要改变,所以SVM就是根据这些支持向量点来最大化margin,来找到了最优的分类线(machine,分类器),这也是SVM分类算法名称的由来。

1.2 构建SVM目标函数

        接着上面的分类问题来分析,假设支持向量机最终要找的线是 ,决策边界两条线是和 ​,那么假设 ​的方程为 10- SVM支持向量机 (SVC) (算法),这里表示 ,x表示 ,我们想要确定 直线,只需要确定w和b即可,此外,由于 和 线是 4的决策分类边界线,一定与 是平行的,平行就意味着斜率不变,b变化即可,所以我们可以假设线的方程为  10- SVM支持向量机 (SVC) (算法) , 线的方程为 10- SVM支持向量机 (SVC) (算法)

10- SVM支持向量机 (SVC) (算法)

 二维空间点 到直线 10- SVM支持向量机 (SVC) (算法) 的距离公式为:

10- SVM支持向量机 (SVC) (算法)

我们希望的是决策边界上的样本点到  ​直线的距离d越大越好。我们可以直接计算 ​ 或 ​上的点到直线 ​的距离,假设将空间点扩展到n维空间后,点 到直线10- SVM支持向量机 (SVC) (算法)(严格意义上来说直线变成了超平面)的距离为:

10- SVM支持向量机 (SVC) (算法)

以上 10- SVM支持向量机 (SVC) (算法),读做“w的模”。

1.3 拉格朗日乘数法、KKT条件、对偶(扩展)

1.3.1 拉格朗日乘数法

拉格朗日乘数法主要是将有等式约束条件优化问题转换为无约束优化问题,拉格朗日乘数法如下:
假设 是一个n维向量, 和  含有x的函数,我们需要找到满足 条件下  最小值,如下:

10- SVM支持向量机 (SVC) (算法)
拉格朗日函数转换成等式过程的证明涉及到导数积分等数学知识,参考文章:拉格朗日乘子法从0到1_代码简史的博客-CSDN博客

1.3.2 KKT条件

假设  是一个n维向量,和 含有x的函数,我们需要找到满足 条件下 最小值,我们可以考虑加入一个“松弛变量” 让条件 来达到等式的效果,即使条件变成 10- SVM支持向量机 (SVC) (算法),这里加上 的原因是保证加的一定是非负数,即: ,但是目前不知道这个 值是多少,一定会找到一个合适的 值使 10- SVM支持向量机 (SVC) (算法)成立。
通过转换:
10- SVM支持向量机 (SVC) (算法)
但是上式中λ值必须满足λ≥0,由于变成了有条件的拉格朗日函数,这里需要求 对应下的x值。

10- SVM支持向量机 (SVC) (算法)

以上便是不等式约束优化问题的KKT(Karush-Kuhn-Tucker)条件,我们回到最开始要处理的问题上,根据③式可知,我们需要找到合适的x,λ,a值使L(x,λ,a)最小,但是合适的x,λ,a必须满足KKT条件

1.3.3 对偶问题

  对偶问题是我们定义的一种问题,对于一个不等式约束的原问题, 我们定义对偶问题为(对上面方程的求解等效求解下面方程),其实就是把min和max对调了一下,当然对应的变量也要变换。

1.4 最小化SVM目标函数

  通过推导我们知道SVM目标函数如下, 根据拉格朗日乘数法、KKT条件、对偶问题我们可以按照如下步骤来计算SVM目标函数最优的一组w值。
10- SVM支持向量机 (SVC) (算法)

1.4.1 构造拉格朗日函数

将SVM目标函数转换为如下:
10- SVM支持向量机 (SVC) (算法)
以上不等式转换成拉格朗日函数必须满足KKT条件:
10- SVM支持向量机 (SVC) (算法)

1.4.2 对偶转换

由于原始目标函数 是个下凸函数,根据1.3.3中对偶问题可知 L(x,λ,a) 一定是强对偶问题,所以可以将a式改写成如下:

10- SVM支持向量机 (SVC) (算法)

1.4.3 SMO算法求解

SMO(Sequential Minimal Optimization),序列最小优化算法,其核心思想非常简单:每次只优化一个参数,其他参数先固定住,仅求当前这个优化参数的极值。

1.4.4 计算分割线w和b的值

  • 我们可以知道获取了一组λ的值,我们可以得到一组w对应的值。假设我们有S个支持向量,以上b的计算可以使用任意一个支持向量代入计算即可,如果数据严格是线性可分的,这些b结果是一致的。
  • 对于数据不是严格线性可分的情况,参照后面的软间隔问题,一般我们可以采用一种更健壮的方式,将所有支持向量对应的b都求出,然后将其平均值作为最后的结果,最终求出b的结果。
  • 确定w和b之后,我们就能构造出最大分割超平面10- SVM支持向量机 (SVC) (算法),新来样本对应的特征代入后得到的结果如果是大于0那么属于一类,小于0属于另一类。

1.5 软间隔及优化

1.5.1 软间隔问题

  • 以上讨论问题都是基于样本点完全的线性可分,我们称为硬间隔。如果存在部分样本点不能完全线性可分,那么我们就需要用到软间隔,相比于硬间隔的苛刻条件,我们允许个别样本点出现在间隔带里面, 即我们允许部分样本点不满足约束条件。
  • 为了度量这个间隔软到何种程度,我们为每个样本引入一个“松弛变量”  ,(中文:克西)加入松弛变量后,我们的约束条件变成 10- SVM支持向量机 (SVC) (算法),这样不等式就不会那么严格。

1.5.2 优化SVM目标函数

加入软间隔后我们的目标函数变成了:
10- SVM支持向量机 (SVC) (算法)
其中C是一个大于0的常数,当C为无穷大,必然无穷小,这样的话SVM就变成一个完全线性可分的SVM。如果C为有对应的值时,对应的会有一个大于0的值,这样的SVM就是允许部分样本不遵守约束条件,接下来我们对新的目标函数h式求解最优化问题。

 1.5.3 SVM代码

from sklearn import svm
import numpy as np
def read_data(path):
   with open(path) as f :
      lines=f.readlines()
   lines=[eval(line.strip()) for line in lines]
   X,y=zip(*lines)
   X=np.array(X)
   y=np.array(y)
   return X,y

if __name__ == '__main__':
   X_train,y_train=read_data("./data/train_data")
   X_test,y_test=read_data("./data/test_data")

   #C对样本错误的容忍,这里就是SVM中加入松弛变量对应的C,
   model= svm.SVC(C=1.0)
   model.fit(X_train,y_train.ravel())
    #打印支持向量
   print(model.support_vectors_)
    #打印支持向量下标
   print(model.support_)

    #使用SVM应用到测试集,返回正确率
   score = model.score(X_test,y_test)
   print(score)

1.5.4 网格搜索

        网格搜索就是手动给定模型中想要改动的所有参数,程序自动使用穷举法来将所有的参数或者参数组合都运行一遍,将对应得到的模型做K折交叉验证,将得分最高的参数或参数组合当做最佳结果,并得到模型。也就是说网格搜索用来获取最合适的一组参数。
        使用网格搜索由于针对每个参数下的模型需要做K折交叉验证最终导致加大了模型训练时间,所以一般我们可以在小的训练集中使用网格搜索找到对应合适的参数值,再将合适的参数使用到大量数据集中训练模型。例如:逻辑回归中使用正则项时,我们可以先用一小部分训练集确定合适的惩罚系数,然后将惩罚系数应用到大量训练集中训练模型。

1.6 SVM Hinge Loss 损失函数

        其实这里我们说SVM的损失主要说的就是上式中的松弛变量 损失,当所有样本总的 为0时那么就是一个完全线性可分的SVM;如果SVM不是线性可分,那么我们希望总体样本的松弛变量越小越好。

1.7 核函数

1.7.1 非线性SVM

        在前面SVM讨论的硬间隔和软间隔都是指的样本完全可分或者大部分样本点线性可分的情况。我们可以使用升维方式来解决这种线性不可分的问题,例如目前只有两个维度 ​ 、​,我们可以基于已有的维度进行升维得到更多维度,例如:​,这样我们可以将以上问题可以转换成高维可分问题。

1.7.2 核函数(Kernel Function)

假设原有特征有如下三个 ,那么基于三个已有特征进行两两组合(二阶交叉)我们可以得到如下更多特征,


        我们在训练模型时将以上组合特征可以参与到模型的训练中,其代价是运算量过大,比如原始特征有m个,那么二阶交叉的维度为 个,这种量级在实际应用中很难实现,那么有没有一种方式可以在升维的同时可以有效的降低运算量,在非线性SVM中,核函数就可以实现在升维的同时可以有效降低运算量。
        以上核函数叫做多项式核函数,常用的核函数有如下几种,不同的核函数的区别是将向量映射到高维空间时采用的升维方法不同,不过高维向量都是不需要计算出来的。
线性核函数:


多项式核函数:

10- SVM支持向量机 (SVC) (算法)         (α,c,d都是参数)
高斯核函数:

10- SVM支持向量机 (SVC) (算法)

1.7.3 核函数在SVM中的应用

        在非线性SVM中,我们可以对原始特征进行升维,原有的超平面 10- SVM支持向量机 (SVC) (算法)变成了 10- SVM支持向量机 (SVC) (算法),然后经过对偶处理目标函数。
        这样我们可以通过核函数将数据映射到高维空间,但是核函数是在低维上进行计算,而将实质上的分类效果表现在了高维空间上,来解决在原始空间中线性不可分的问题。

        在SVM中我们可以使用常用的核函数:线性核函数、多项式核函数、高斯核函数来进行升维解决线性不可分问题,应用最广泛的就是高斯核函数,无论是小样本还是大样本、高维或者低维,高斯核函数均适用,它相比于线性核函数来说,线性核函数只是高斯核函数的一个特例,线性核函数适用于数据本身线性可分,通过线性核函数来达到更理想情况。

        高斯核函数相比于多项式核函数,多项式核函数阶数比较高时,内部计算时会导致一些元素值无穷大或者无穷小,而在高斯核函数会减少数值的计算困难。
        综上,我们在非线性SVM中使用核函数时,先使用线性核函数,如果不行尝试换不同的特征,如果还不行那么可以直接使用高斯核函数。

from sklearn import svm
from sklearn import datasets
from sklearn.model_selection import train_test_split as ts
if __name__ == '__main__':
    #import our data
    iris = datasets.load_iris()
    X = iris.data
    y = iris.target

    #split the data to  7:3
    X_train,X_test,y_train,y_test = ts(X,y,test_size=0.3)
    print(y_test)
    # select different type of kernel function and compare the score

    # kernel = 'rbf'
    clf_rbf = svm.SVC(kernel='rbf')
    clf_rbf.fit(X_train,y_train)
    score_rbf = clf_rbf.score(X_test,y_test)
    print("The score of rbf is : %f"%score_rbf)

    # kernel = 'linear'
    clf_linear = svm.SVC(kernel='linear')
    clf_linear.fit(X_train,y_train)
    score_linear = clf_linear.score(X_test,y_test)
    print("The score of linear is : %f"%score_linear)
    
    # kernel = 'poly'
    clf_poly = svm.SVC(kernel='poly')
    clf_poly.fit(X_train,y_train)
    score_poly = clf_poly.score(X_test,y_test)
    print("The score of poly is : %f"%score_poly)
  • rbf:高斯核函数
  • linear:线性核函数
  • poly:多项式核函数
     

1.8 支持向量机SVM特点

1.8.1 抗干扰能力强

根据一些样本点,我们可以通过拉格朗日乘数法、KKT条件、对偶问题、SMO算法计算出支持向量机SVM的分类线 10- SVM支持向量机 (SVC) (算法)

10- SVM支持向量机 (SVC) (算法)

        我们可以看出SVM在训练过程中找到的是两类点的分割线,计算样本中有少量异常点,在训练模型时依然能很正确的找到中间分割线,因为训练SVM时考虑了全量数据,确定这条线的b时只与支持向量点(边界上的点)有关。同样在测试集中就算有一些样本点是异常点也不会影响其正常分类,SVM具有抗干扰能力强的特点。
        此外,由于训练SVM需要所有样本点参与模型训练,不然不能缺点这条线,所以当数据量大时,SVM训练占用内存非常大。这时SVM模型的缺点。

1.8.2 二分类及多分类

        SVM同样支持多分类,我们可以将一个多分类问题拆分成多个二分类问题,例如有A,B,C三类,我们使用SVM训练时可以训练3个模型,第一个模型针对是A类和不是A类进行训练。第二个模型针对是B类和不是B类进行训练。第三个模型针对是C类和不是C类进行训练。这样可以解决多分类问题。文章来源地址https://www.toymoban.com/news/detail-419388.html

1.9 网格搜索最佳参数

svc = SVC()
params = {'C':np.logspace(-3,1,20),'kernel':['rbf','poly','sigmoid','linear']}
gc = GridSearchCV(estimator = svc,param_grid = params)
gc.fit(X_train_pca,y_train)
print('网格搜索最佳参数:',gc.best_params_)   #  {'C': 3.79269019073,'kernel':'rbf'}
print('模型得分是:',gc.score(X_test_pca,y_test))   # 0.883720930232
y_pred = gc.predict(X_test_pca)

到了这里,关于10- SVM支持向量机 (SVC) (算法)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 支持向量机(Support Vector Machine, SVM)从线性分类到核函数扩展

    支持向量机(Support Vector Machine,简称SVM)是一种强大而广泛应用的监督学习算法,用于分类和回归任务。本文将深入解析SVM的原理,从线性分类到核函数扩展 SVM的核心思想是在特征空间中找到一个最优的超平面,将不同类别的样本分开。对于线性可分的情况,SVM通过最大化

    2024年02月09日
    浏览(29)
  • 支持向量机(sklearn.svm.svc)中的参数

    参数说明: 1.C:  正则化系数,float类型,默认值为1.0。 2.kernel: 核函数,{‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’},默认值为’rbf’。  (1)linear: 线性核函数; 优点: 简单、运算效率高;缺点: 对线性不可分的数据集没有很好的效果 (2) ploy: 多项式核函数

    2024年02月07日
    浏览(49)
  • [学习笔记] [机器学习] 10. 支持向量机 SVM(SVM 算法原理、SVM API介绍、SVM 损失函数、SVM 回归、手写数字识别)

    视频链接 数据集下载地址:无需下载 学习目标: 了解什么是 SVM 算法 掌握 SVM 算法的原理 知道 SVM 算法的损失函数 知道 SVM 算法的核函数 了解 SVM 算法在回归问题中的使用 应用 SVM 算法实现手写数字识别器 学习目标: 了解 SVM 算法的定义 知道软间隔和硬间隔 在很久以前的

    2024年02月09日
    浏览(72)
  • 机器学习算法:支持向量机(SVM)

    Solem《python计算机视觉编程》、李航《统计学习方法》、周志华《机器学习》 要理解好支持向量机需要较好的数学功底,且能不被公式以及文字绕晕,这里我们就理清楚支持向量机的大体过程。具体的数学计算推导其实已经封装好了,那么理解算法的原理也对我们将来的学习

    2024年02月03日
    浏览(29)
  • 一文全解经典机器学习算法之支持向量机SVM(关键词:SVM,对偶、间隔、支持向量、核函数、特征空间、分类)

    之前所介绍的逻辑回归是基于似然度的分类方法,通过对数据概率进行建模来得到软输出。但这种分类方法其实稍加“繁琐”,因为要 估计数据的概率分布作为中间步骤 。这就像当一个人学习英语时,他只要直接报个班或者自己看书就行了,而不需要先学习诘屈聱牙的拉丁

    2024年02月03日
    浏览(36)
  • Python实现支持向量机(SVM)算法及源代码

    Python实现支持向量机(SVM)算法及源代码 支持向量机(SVM)是一种经典的分类算法,它在解决二分类问题的性能优秀。本文将介绍如何使用Python实现SVM算法,并提供完整的源代码。 通过安装必要的Python库,我们可以开始编写SVM代码。首先,导入必要的库: 然后,使用make_blobs函数

    2024年02月10日
    浏览(41)
  • 机器学习:Python中如何使用支持向量机(SVM)算法

    (简单介绍一下支持向量机,详细介绍尤其是算法过程可以查阅其他资) 在机器学习领域,支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,通常用来进行模式识别、分类(异常值检测)以及回归分析。 其具有以下特征: (1)SVM可以表示为凸优化问题,因此可以利用已知的

    2024年02月04日
    浏览(32)
  • 使用SimpleMKL算法实现多核支持向量机(SVM)的Python代码详解

    在本文中,我们将详细介绍如何使用SimpleMKL算法实现多核支持向量机(SVM)的Python代码。我们将首先介绍SimpleMKL算法的基本原理,然后通过实例代码来演示如何在Python中实现该算法。最后,我们将讨论该算法的优缺点以及可能的改进方法。 1. SimpleMKL算法简介 多核学习(Mult

    2024年02月14日
    浏览(103)
  • 粒子群算法优化支持向量机回归分析,PSO-SVM回归分析

    背影 支持向量机SVM的详细原理 SVM的定义 SVM理论 粒子群算法原理 SVM应用实例,粒子群算法优化支持向量机回归分析,PSO-SVM回归分析 代码 结果分析 展望 完整代码:粒子群算法优化支持向量机回归分析,PSO-SVM回归分析(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.

    2024年03月15日
    浏览(36)
  • 机器学习(七):梯度下降解决分类问题——perceptron感知机算法与SVM支持向量机算法进行二维点分类

    实验2 感知机算法与支持向量机算法 一、预备知识 1.感知机算法 二、实验目的 掌握感知机算法的原理及设计; 掌握利用感知机算法解决分类问题。 三、实验内容 设计感知机算法求解, 设计SVM算法求解(可调用函数库),请找出支持向量和决策超平面。 四、操作方法和实验

    2023年04月26日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包