机器学习:支持向量机(SVM)

一、简要介绍支持向量机
        
支持向量机(Support Vector Machine,SVM)是一种常见的监督学习算法,常用于分类和回归问题。其主要思想是找到一个最优的超平面来将不同类别的样本分开。在这个过程中,SVM依赖于一组被称为支持向量的样本点。支持向量机的概念可以简单地理解为,根据已知的训练样本,通过构建一个合适的超平面,将不同类别的样本分隔开来。SVM的作用是进行分类和回归。对于分类问题,SVM旨在找到一个能够最大化两个不同类别之间的间隔(边界)的超平面。这个超平面可以将数据点分为两个不同的类别。通过这个超平面,我们可以对新的未标记的数据进行分类。对于回归问题,SVM可以用于拟合一个非线性关系。它通过构建一个超平面,使得样本点尽可能地靠近超平面,同时尽量少地违背预设的边界。需要注意的是,SVM的性能和效果受到参数选择、核函数的选取以及数据集的质量等因素的影响。因此,在实际应用中,需要进行合适的参数调优和模型评估,以获得更好的结果。

二、相关概念
        2.1、超平面
        
在二维空间中,超平面可以理解为一条直线,用于将两个不同类别的数据点进行区分。在高维空间中,超平面可以理解为一个超曲面,用于将不同类别的数据样本进行分割。

        SVM利用超平面来进行分类或回归。对于分类问题,我们需要找到一个超平面,使得它能够将不同类别的数据样本分开,并且希望这个超平面距离最近的数据点的距离最大化。这就是所谓的“最大间隔”分类器。在二维空间中,这个超平面可以看作是一条直线,通过训练数据集中的支持向量点来确定其位置和方向。

        对于回归问题,我们需要找到一个超平面,能够尽可能地拟合数据样本,并且希望这个超平面距离最近的数据点的距离最大化。这就是所谓的支持向量回归(SVR)。在二维空间中,这个超平面可以看作是一条直线,通过训练数据集中的支持向量点来确定其位置和方向。

总之,超平面是SVM算法的关键概念之一,用于将不同类别的数据样本进行分割。在分类和回归问题中,我们需要找到一个超平面,能够最大化不同类别之间的间隔,并且能够尽可能地拟合数据样本,从而实现对未标记数据的准确分类或预测。

        2.2、支持向量

        支持向量是指在SVM算法中离最优超平面最近的那些数据样本点(距超平面(c)距离最近的点)。它们在支持向量机中具有重要的作用。

        在SVM中,支持向量是决定最优超平面位置和方向的关键因素。这些数据样本点位于不同类别之间的边界上或者穿越边界的附近。由于它们紧邻着最优超平面,所以它们对于定义超平面的位

        总之,支持向量是离最优超平面最近的数据样本点,在SVM中起到决定最优超平面位置和方向的关键作用。它们对于分类决策、鲁棒性和泛化能力具有重要影响,并且代表了训练数据中的关键信息。


三、最大间隔与分类
        
        3.1、线性可分

        对于一个数据集合可以画一条直线将两组数据点分开,这样的数据成为线性可分(linearly separable),如下图所示:

 

间隔:点到分割超平面的距离,称为点相对于分割超平面的间隔。数据集所有点到分隔超平面的最小间隔的2倍,称为分类器或数据集的间隔。SVM分类器就是要找最大的数据集间隔。
        
        3.2、寻找最大间隔
        SVM所做的工作就是找这样个超平面,能够将两个不同类别的样本划分开来,但是这种平面是不唯一的,即可能存在无数个超平面都可以将两种样本分开,那么我们如何才能确定一个分类效果最好的超平面呢?

        超平面方程:
二维空间一条直线的方程为,y=ax+b,推广到n维空间,就变成了超平面方程,即

w是权重,b是截距,训练数据就是训练得到权重和截距。要计算A到分隔超平面的距离,就必须给出点到分隔面的法线或垂线的长度该值为||这里的常数b类似与logistic回归中的截距Wo。 

最大化间隔的目标就是找出分类器定义中的w和b。为此,我们必须找到具有最小间隔的数据点,而这些数据点也就是前面提到的支持向量。一旦找到具有最小间隔的数据点,我们就需要对该间隔最大化。这就可以写作:

我们通过引入拉格朗日乘子将目标函数写成:

约束条件为:

其中常数C 用于控制 “最大化间隔” 和 “保证大部分点的函数间隔小于1.0” 这两个目标的权重。在优化算法的实现代码中,常数C 是一个参数,因此可以通过调节该参数得到不同的结果。一旦求出了所有的 α,那么分隔超平面就可以通过这些 α 来表达。  

四、对偶问题
        4.1、拉格朗日乘子法


利用拉格朗日优化方法可以把可以2.2中的最大间隔问题转换为比较简单的对偶问题

支持向量机的目标函数与约束函数:



五、核函数
        
映射可以看作是一种拉伸,把低维数据拉伸到了高维。虽然现在我们到了高维空间号称线性可分,但是有几个困难:

        不知道什么样的映射函数是完美的。
        难以在各种映射函数中找到一个合适的。
        高维空间计算量比较大。这样就会产生维灾难,计算内积是不现实的。

幸运的是,在计算中发现,我们需要的只是两个向量在新的映射空间中的内积结果,而映射函数到底是怎么样的其实并不需要知道。于是这样就引入了核函数的概念。

        仍然以二维空间为例,假设对于变量x和y,将其映射到新空间的映射函数为φ,则在新空间中,二者分别对应φ(x)和φ(y),他们的内积则为<φ(x),φ(y)>。

我们令函数Kernel(x,y)=<φ(x),φ(y)>=k(x,y),

可以看出,函数Kernel(x,y)是一个关于x和y的函数!而与φ无关!我们再也不用管φ具体是什么映射关系了,只需要最后计算Kernel(x,y)就可以得到他们在高维空间中的内积。

称Κ(x,y)为核函数,φ(x)为映射函数。

        常见的核函数:


六、案例
 

import numpy as np
from sklearn.datasets import load_iris
from sklearn.svm import LinearSVC
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score
from sklearn.metrics import classification_report
import matplotlib as mpl
from matplotlib.colors import ListedColormap
import matplotlib.pyplot as plt

if __name__ == "__main__":
    iris = load_iris()
    X1 = iris.data
    y = iris.target
    X_train, X_test, y_train, y_test = train_test_split(X1, y, random_state=14)
    sc = StandardScaler()  # 数据预处理和归一化
    X_train = sc.fit_transform(X_train)
    X_test = sc.transform(X_test)

    # 模型训练
    clf = LinearSVC(random_state=0)
    clf = clf.fit(X_train, y_train)
    y_pred = clf.predict(X_test)
    print("支持向量机准确率:", accuracy_score(y_test, y_pred))
    print("其他指标:", classification_report(y_test, y_pred, target_names=['0', '1', '2']))

    # 指定默认字体
    mpl.rcParams['font.sans-serif'] = ['SimHei']
    mpl.rcParams['axes.unicode_minus'] = False

    # 画图
    x = iris.data[:, :2]
    clf.fit(x, y)
    N = 50
    cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF'])
    cmap_bold = ListedColormap(['#FF0000', '#00FF00', '#0000FF'])
    x_min, x_max = x[:, 0].min() - 1, x[:, 0].max() + 1  # 第0列的范围
    y_min, y_max = x[:, 1].min() - 1, x[:, 1].max() + 1  # 第一列的范围
    xx, yy = np.meshgrid(np.linspace(x_min, x_max, N), np.linspace(y_min, y_max, N))  # 生成网格采样点
    z_show = np.stack((xx.flat, yy.flat), axis=1)  # 测试点
    z = clf.predict(z_show)  # 预测分类值
    plt.figure()
    plt.pcolormesh(xx, yy, z.reshape(xx.shape), shading='auto', cmap=cmap_light)
    plt.scatter(x[:, 0], x[:, 1], c=y, cmap=cmap_bold, edgecolors='k', s=20)
    plt.xlim(xx.min(), x.max())
    plt.title("SVMClassifer")
    plt.show()




七、总结
​​​​​​​
        
支持向量机(Support Vector Machine,SVM)是一种广泛应用于分类和回归分析的机器学习算法。SVM通过将输入数据映射到高维空间中,找到一个最优的超平面,将不同类别的数据分隔开来。在分类问题中,SVM通过寻找能够最大化不同类别之间间隔(margin)的超平面来进行分类。

        SVM的核心思想是将低维数据转换成高维空间中的向量,从而使数据在高维空间中更容易被线性或非线性地分离。在高维空间中,SVM算法寻找一个最优的决策边界,使得不同类别的数据点距离该决策边界的距离最大。

SVM的优点包括:

  1. 可以处理高维数据;
  2. 在处理小样本数据时表现较好;
  3. 支持向量的个数较少,模型具有很好的泛化能力;
  4. 适用于线性或非线性分类问题。

SVM的缺点包括:

  1. SVM算法的训练时间较长;
  2. SVM算法对参数的选择较为敏感;
  3. 对于噪声较多的数据,SVM容易出现过拟合的情况;
  4. SVM算法只能用于二分类问题,需要对多分类问题进行改进。
  • 18
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值