美文网首页机器学习实战
【阿旭机器学习实战】【20】支持向量机SVM原理简介及示例演示:

【阿旭机器学习实战】【20】支持向量机SVM原理简介及示例演示:

作者: 阿旭123 | 来源:发表于2022-11-25 09:57 被阅读0次

    【阿旭机器学习实战】系列文章主要介绍机器学习的各种算法模型及其实战案例,欢迎点赞,关注共同学习交流。

    本文介绍了支持向量机SVM的基本原理,并且通过2个示例介绍了SVM二维决策边界的表示方法,以及通过SVM分离非线性坐标点,并绘制轮廓曲线

    目录

    支持向量机SVM简介及示例演示

    【关键词】支持向量,最大几何间隔,拉格朗日乘子法

    1. 支持向量机的原理

    支持向量机(Support Vector Machine),其含义是通过支持向量运算的分类器。其中“机”的意思是机器,可以理解为分类器
    那么什么是支持向量呢?在求解的过程中,会发现只根据部分数据就可以确定分类器,这些数据称为支持向量。
    见下图,在一个二维环境中,其中点R,S,G点和其它靠近中间黑线的点可以看作为支持向量,它们可以决定分类器,也就是黑线的具体参数。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1ukr2e86-1667787571800)(attachment:1.png)]

    2. 解决的问题

    • 线性分类

    在训练数据中,每个数据都有n个的属性和一个二类类别标志,我们可以认为这些数据在一个n维空间里。我们的目标是找到一个n-1维的超平面(hyperplane),这个超平面可以将数据分成两部分,每部分数据都属于同一个类别。
    其实这样的超平面有很多,我们要找到一个最佳的。因此,增加一个约束条件:这个超平面到每边最近数据点的距离是最大的。也成为最大间隔超平面(maximum-margin hyperplane)。这个分类器也成为最大间隔分类器(maximum-margin classifier)。
    支持向量机是一个二类分类器。

    • 非线性分类

    SVM的一个优势是支持非线性分类。它结合使用拉格朗日乘子法和KKT条件,以及核函数可以产生非线性分类器。

    3. SVM解决问题的步骤

    1.SVM的目的是要找到一个线性分类的最佳超平面 f(x)=xw+b=0。求 w 和 b。

    2.首先通过两个分类的最近点,找到f(x)的约束条件。

    3.有了约束条件,就可以通过拉格朗日乘子法和KKT条件来求解,这时,问题变成了求拉格朗日乘子αi 和 b。

    4.对于异常点的情况,加入松弛变量ξ来处理。

    非线性分类的问题:映射到高维度、使用核函数。

    3.1 线性分类及其约束条件

    SVM的解决问题的思路是找到离超平面的最近点,通过其约束条件求出最优解。

    在这里插入图片描述

    3.2 最大几何间隔(geometrical margin)

    在这里插入图片描述 在这里插入图片描述

    3.3 求解问题w,b

    我们使用拉格朗日乘子法
    来求w和b,一个重要原因是使用拉格朗日乘子法后,还可以解决非线性划分问题。
    拉格朗日乘子法可以解决下面这个问题:

    在这里插入图片描述

    消除w之后变为:

    在这里插入图片描述

    可见使用拉格朗日乘子法后,求w,b的问题变成了求拉格朗日乘子αi和b的问题。
    到后面更有趣,变成了不求w了,因为αi可以直接使用到分类器中去,并且可以使用αi支持非线性的情况.

    4. 实战示例

    1、示例1:画出SVM二维决策边界

    import numpy as np
    from sklearn.svm import SVC
    import matplotlib.pyplot as plt
    %matplotlib inline
    

    随机生成一些数据

    a = np.random.randn(20,2) + [2,2]
    b = np.random.randn(20,2) + [-1,-3]
    data = np.concatenate([a,b])
    data.shape
    
    (40, 2)
    
    # 将数据点分为2类,一类20个点
    target = [0]*20 + [1]*20
    
    plt.scatter(data[:,0],data[:,1],c=target)
    
    <matplotlib.collections.PathCollection at 0x1e4a3106668>
    
    在这里插入图片描述
    # 创建支持向量机分类器
    svc = SVC(kernel="linear")
    
    svc.fit(data,target)
    
    SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
      decision_function_shape='ovr', degree=3, gamma='auto', kernel='linear',
      max_iter=-1, probability=False, random_state=None, shrinking=True,
      tol=0.001, verbose=False)
    
    # 找到支持向量
    sv = svc.support_vectors_
    sv
    
    array([[ 0.47403487,  1.35490312],
           [ 2.76462572, -0.35759099],
           [ 0.70116275, -2.38879174]])
    
    # 提取斜率:svc.coef_
    # mx + ny + b = 0 ==> ny = -mx - b ==> y = -(m/n)x - b/n
    w = -svc.coef_[0,0]/svc.coef_[0,1]
    w
    
    -0.747621114673942
    
    # 提取截距:svc.intercept_
    b = -svc.intercept_[0]/svc.coef_[0,1]
    b
    
    -0.07777143534587211
    
    x = np.linspace(-3,6,100)
    # 直线方程
    y = w*x + b
    
    plt.scatter(data[:,0],data[:,1],c=target)
    plt.scatter(sv[:,0],sv[:,1],c="r",s=300,alpha=0.5)
    plt.plot(x,y)
    
    [<matplotlib.lines.Line2D at 0x1e4a0fd2d30>]
    
    在这里插入图片描述

    上图中,红色的点表示支持向量直线表示SVM的决策边界

    2、示例2:SVM分离非线性坐标点

    2.1 产生非线性随机点

    # 随机产生180个点
    data = np.random.randn(180,2)
    plt.scatter(data[:,0],data[:,1])
    
    <matplotlib.collections.PathCollection at 0x1e4a4b0fbe0>
    
    在这里插入图片描述
    a = np.array([[1,2],[-1,2],[-1,-1],[1,-4]])
    target = np.logical_xor(a[:,0]>0,a[:,1]>0)
    target
    
    array([False,  True, False,  True])
    
    # 通过异或方式,产生非线性分类目标点
    target = np.logical_xor(data[:,0]>0,data[:,1]>0)
    target
    
    array([False,  True,  True,  True, False,  True, False, False, False,
            True,  True,  True, False,  True, False,  True,  True, False,
            True,  True, False,  True, False,  True, False,  True, False,
           False, False, False, False, False,  True,  True,  True,  True,
           False, False,  True, False,  True,  True,  True, False,  True,
            True,  True, False,  True, False, False,  True, False,  True,
            True,  True, False,  True, False, False, False, False,  True,
            True, False,  True,  True, False, False, False,  True, False,
           False,  True, False,  True, False,  True,  True, False, False,
            True,  True, False,  True, False, False, False,  True, False,
           False, False, False,  True,  True, False, False,  True,  True,
           False,  True, False, False,  True, False,  True, False, False,
           False, False,  True,  True,  True,  True, False,  True,  True,
            True, False,  True,  True,  True, False,  True,  True, False,
           False,  True, False,  True,  True,  True,  True, False,  True,
            True,  True,  True, False,  True,  True,  True, False, False,
           False,  True,  True,  True, False, False, False,  True, False,
            True,  True, False,  True, False, False,  True,  True,  True,
            True,  True,  True, False,  True, False,  True, False,  True,
           False,  True,  True,  True, False,  True, False,  True, False])
    

    np.logical_xor的作用示例
    a = np.array([[1,2],[-1,2],[-1,-1],[1,-4]])
    target = np.logical_xor(a[:,0]>0,a[:,1]>0)
    target结果为:array([False, True, False, True])

    plt.scatter(data[:,0],data[:,1],c=target)
    
    在这里插入图片描述

    2.2 构建SVM模型并训练

    svc = SVC() # SVC的核函数默认为rbf,基于半径的核函数
    svc
    
    SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
      decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf',
      max_iter=-1, probability=False, random_state=None, shrinking=True,
      tol=0.001, verbose=False)
    
    svc.fit(data,target)
    
    SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
      decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf',
      max_iter=-1, probability=False, random_state=None, shrinking=True,
      tol=0.001, verbose=False)
    

    2.3 绘制轮廓曲线

    # 确定轮廓曲线的范围
    xx,yy = np.meshgrid(np.linspace(-3,3,500),np.linspace(-3,3,500))
    
    xy = np.c_[xx.ravel(),yy.ravel()]
    
    xy.shape
    
    (250000, 2)
    
    # 求测试点到分割超平面之间的距离
    distances = svc.decision_function(xy)
    distances.shape
    
    (250000,)
    
    plt.contour(xx,yy,distances.reshape(xx.shape),cmap="PuOr_r")
    plt.scatter(data[:,0],data[:,1],c=target)
    
    <matplotlib.collections.PathCollection at 0x1e4a46c2518>
    
    在这里插入图片描述
    如果内容对你有帮助,感谢记得点赞+关注哦!

    更多干货内容持续更新中…

    相关文章

      网友评论

        本文标题:【阿旭机器学习实战】【20】支持向量机SVM原理简介及示例演示:

        本文链接:https://www.haomeiwen.com/subject/tfeffdtx.html