支持向量机

算法思想

支持向量机(Support Vector Machine, SVM)是一种监督学习算法,用于线性/非线性数据的分类和回归任务

  1. 最大间隔超平面
  1. SVM的基本思想是在特征空间中找到一个最优的超平面(在二维空间中为一条直线,三维空间中为一个平面,以此类推至高维空间),以将不同类别的样本分开这个超平面被称为最大间隔超平面
  1. 支持向量
  1. 支持向量是离超平面最近的样本点,它们决定了超平面的位置和方向。在求解最大间隔//超平面的过程中,只有支持向量对最终的分类结果起作用,其他样本点并不影响。
  1. 线性可分与线性不可分
  1. 对于线性可分的数据集,SVM可以直接通过求解凸二次规划问题找到最大间隔超平面。
  2. 对于线性不可分的数据集,SVM通过引入核函数将样本从原始的特征空间映射到一个高维的特征空间,使得原本线性不可分的问题变为线性可分的问题。同时,还引入了松弛变量和惩罚项,允许一些样本点被错误分类或位于超平面附近。


基础理论

  1. 线性可分
  1. 对于线性可分的数据集,存在一个超平面H可以将不同类别的样本完全分开。这个超平面可以用线性方程wTx+b=0表示,其中w是权重向量,b是偏置项。
  2. SVM的目标是找到使得分类间隔最大的超平面,即求解以下优化问题:

其中,yi是样本xi的标签,n是样本数量。

(该优化问题推导过程,可能需要从空间几何的角度理解):

支持向量机——算法思想、基础理论、基础分类实验_支持向量


支持向量机——算法思想、基础理论、基础分类实验_SVM_02


支持向量机——算法思想、基础理论、基础分类实验_SVM_03

  1. 对偶问题
  1. 为了求解上述优化问题,SVM引入了拉格朗日乘子,将原问题转化为对偶问题。对偶问题的求解通常比原问题更容易,且可以利用核技巧将线性不可分问题转化为线性可分问题。
  2. 这里仅仅希望了解SVM算法的一些核心思想,对于较难的对偶问题的部分不展开深入认识。
  1. 核函数
  1. 核函数是SVM算法中的一个重要组件,用于将输入空间中的样本点映射到高维空间。通过核函数,原本样本在原维度的空间(输入空间)中线性不可分,在映射后的高维空间中变得线性可分,此时SVM可以在此高维空间中寻找最优的分类超平面或回归曲线。常用的核函数包括线性核、多项式核、径向基函数(RBF)核等。
  2. “升维”可以是解决数据从原来的线性不可分到线性可分的有效途径,看两个简单的例子:
  3. 核函数形式化表示的简单举例:

支持向量机——算法思想、基础理论、基础分类实验_支持向量_04

  1. 软间隔
  1. 实际中,数据集的复杂性往往导致无法找到一个完全将不同类别样本分开的超平面。若通过引入松弛变量和惩罚项,允许SVM将一些样本点错误分类或位于超平面附近,使得模型在保持最大间隔的同时,尽量减少错误分类的数量。此时的最大间隔称为最大软间隔。


基础分类实验

在不同数据集上应用sklearn提供的SVC模型,观察其在指定的不同的核函数上的分类预测效果。

常用的核函数:

支持向量机——算法思想、基础理论、基础分类实验_SVM_05

sklearn.svm.SVC的构造函数的核心参数:(scikit-learn==1.5.1)

  • C :
  • float, default=1.0,正则化参数
  • kernel:
  • {'linear', 'poly', 'rbf', 'sigmoid', 'precomputed'}orcallable, default='rbf',核函数选择;分别为线性核、多项式核、高斯核、sigmoid核函数和提前计算好核函数矩阵('precomputed'),或者选择自定义的核函数。
  • degree:
  • int, default=3,多项式核函数的参数d
  • gamma :
  • {'scale', 'auto'} or float, default='scale',高斯核函数的参数
  • Kernel coefficient for 'rbf', 'poly' and 'sigmoid'.
  • if ``gamma='scale'`` (default) is passed then it uses
  • 1 / (n_features * X.var()) as value of gamma,
  • if 'auto', uses 1 / n_features
  • if float, must be non-negative.|
  • Independent term in kernel function.
  • It is only significant in 'poly' and 'sigmoid'.
  • coef0:
  • float, default=0.0

实验代码:

from sklearn.datasets import load_iris, load_wine
from sklearn.model_selection import train_test_split


def loadDatas(datasSubject='iris', test_size=0.2):
    datasDict = dict()
    if datasSubject == 'iris':
        datasDict = load_iris()
    elif datasSubject == 'wine':
        datasDict = load_wine()
    else:    # 更多数据集加载
        pass
    X = datasDict.data
    Y = datasDict.target
    X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=test_size)
    return X_train, X_test, y_train, y_test

from sklearn.svm import SVC
# from loadDatas import loadDatas
import numpy as np
np.random.seed(0)

datasNames = ('iris', 'wine')
kernalFuns = ('linear', 'poly', 'rbf', 'sigmoid')

for datasSubject in datasNames:
    print("SVM experiment on dataset {}".format(datasSubject))
    X_train, X_test, y_train, y_test = loadDatas(datasSubject=datasSubject)
    for kernalFun in kernalFuns:
        print(f"\tkernal function: {kernalFun}")
        model = SVC(kernel=kernalFun)
        model.fit(X_train, y_train)

        trainScore = model.score(X_train, y_train)
        testScore = model.score(X_test, y_test)
        print(f'\t\ttrainScore:{trainScore}\n\t\ttestScore:{testScore}')

运行结果:

支持向量机——算法思想、基础理论、基础分类实验_线性可分_06


运行结果表格整理:

数据集

数据集大小

样本特征向量的维度

类别数

核函数

训练集准确率

测试集(总样本的20%)准确率


鸢尾花iris


150


4


3

Linear

0.975

1.0

Poly

0.983

1.0

Rbf

0.958

1.0

Sigmoid

0.367

0.2


葡萄酒wine


178


13


3

Linear

0.993

0.972

Poly

0.662

0.806

Rbf

0.718

0.722

Sigmoid

0.169

0.111


小结

优点:

  • 基于结构风险最小化,避免局部最优解
  • 泛化能力强SVM最终决策只依赖于支持向量,这些支持向量是训练样本中离分类边界最近的点
  • 适合小样本学习
  • 核函数灵活:SVM可以通过选择不同的核函数来适应不同的数据分布


缺点

对于非线性的复杂数据,可能很难找到一个合适的核函数将其映射到高维空间中,使其在变换后的高维空间中线性可分;而且,不是所有类型的数据都可以通过核函数映射变得在更高维空间中线性可分(VC维理论的限制)。

  • 计算复杂度较高:当训练样本数量非常大时,SVM的训练时间会显著增加,因为需要计算所有样本之间的核函数值。
  • 对参数和核函数选择敏感:(如正则化参数C、核函数参数等)的设定。
  • 不适用于多分类问题直接解决:虽然可以通过一些策略(如一对一、一对多等)将SVM扩展到多分类问题,但这些方法通常比直接为多分类设计的算法(如随机森林、神经网络)更复杂且效率较低。
  • 解释性不强:虽然SVM在分类问题上表现出色,但其模型的可解释性相对较弱。特别是当使用非线性核函数时,很难直观地解释SVM是如何做出预测的。


注:关注微信公众号——分享之心,后台回复“机器学习基础实验”获取完整代码和相关文档资料的地址(不断更新)。

支持向量机——算法思想、基础理论、基础分类实验_支持向量_07

上一篇:朴素贝叶斯分类实现垃圾短信识别——python自行实现和sklearn接口调用