机器学习第七课之支持向量机SVM

目录

简介:

一、什么是支持向量机

二、如何选取最佳的超平面

1.超平面方程 (优化目标)

2.如何寻找最优的超平面

3.举例分析

4.软间隔​编辑

三、核函数

1举例

2常用核函数

3.多项式核函数

4.高斯核函数:

四、svm的优缺点

五、支持向量机的API

六、案例分析


简介:

欢迎来到机器学习系列课程的第七课!在这一课中,我们将聚焦于支持向量机(SVM) 这一经典且极具影响力的算法。作为监督学习领域的重要工具,SVM 凭借其出色的泛化能力和在小样本、高维空间中的优异表现,至今仍被广泛应用于图像识别、文本分类、生物信息学等多个领域。本节将从 SVM 的基本原理讲起,带大家理解它如何通过寻找最优超平面 来实现数据分类 ------ 这一超平面不仅能将不同类别的样本清晰分隔,还能使两类样本到超平面的最小距离(间隔)最大化 ,从而提升模型的稳定性。我们会深入剖析 "支持向量" 的核心概念,揭示这些关键样本点如何决定超平面的位置,以及它们在模型训练中的特殊作用。此外,面对线性不可分的数据,SVM 的核函数技巧堪称 "点睛之笔"。我们将详细解读线性核、多项式核、径向基核(RBF)等常用核函数的原理,展示它们如何将低维空间中线性不可分的数据映射到高维空间,进而实现线性可分。同时,还会探讨正则化参数(C)对模型复杂度和泛化能力的影响,帮助大家掌握 SVM 的调优思路。

一、什么是支持向量机

很久以前的情人节,公主被魔鬼绑架了,王子要去救公主,魔鬼和他玩了一个游戏。魔鬼在桌子上似乎有规律放了两种颜色的球,说:"你用一根棍分开它们?要求:尽量在放更多球之后,仍然适用。"

  • 第一次,王子这么放:
  • 魔鬼又摆了更多的球,有一个球站错了阵营:

SVM 试图把棍子放在最佳位置,使棍两边有尽可能大的间隙 。

魔鬼放更多球后,棍仍能作为好的分界线 ,体现 SVM 对数据分类的有效性与泛化能力 。

魔鬼使花招重新摆放球,王子拍桌让球飞起,拿纸插在两种颜色球中间 ,用于形象阐释 SVM 处理线性不可分等情况时的核函数等思想(将低维线性不可分数据映射到高维实现线性可分,类似把球 "升维" 后用平面分隔 )。

解释 SVM(支持向量机)相关概念

  • 球 -> [data -> 数据]
  • 棍子 -> [classifier -> 分类器]
  • 最大间隙 trick -> [optimization -> 最优化]
  • 拍桌子 -> [kernelling -> 核函数]
  • 那张纸 -> [hyperplane -> 超平面]

二、如何选取最佳的超平面

对于这个图片我们去寻找

1.超平面方程 (优化目标)

样本点假设

假设有一堆样本点

不同维度平面方程

  1. 二维平面
    • 常规直线方程:
    • 转化后的形式:,备注 "一条线"
  2. 三维平面
    • 方程: ,备注 "平面"
  3. 更高维平面(超平面)
    • 方程:,备注 "超平面"

综合超平面函数

,右侧备注 "看作x"

标签问题

在 SVM 中我们不用 0 和 1 来区分,使用 + 1 和 - 1 来区分,这样会更严格。 假设超平面可以将训练的样本正确分类,那么对于任意样本: 如果 ,则称为正例,,则称为负例。

决策函数:

符号函数

整合

决策函数

样本点分类正确的情况

当样本点分类正确的时候,有:

  • ,则 (正例 )
  • ,则 (负例 )

整合结果

距离问题:

(1)点到直线的距离

(2)点到平面的距离

(3)点到超平面的距离

简写为:,其中的范数,是样本的映射 。这是 SVM 中关于点到超平面距离的数学表达,用于后续优化间隔等操作 。

改进:

对公式加上正确性:

分类正确条件

分类正确时:

两个衡量指标

  • (1) 确信度:点到超平面距离
  • (2) 正确性:分类正确

2.如何寻找最优的超平面

步骤(1):找到离超平面最近的点

步骤(2):最大化这个距离

使得离超平面最近的点到超平面的距离越远越好。

最终构成损失函数求解

步骤(1):设定最小值

,右侧原因说明:因分类正确时 ,经放缩变换可使 ,让条件更严格 。

步骤(2):转化优化目标

则优化目标变为 ,即要在满足 的约束下,最大化 ,等价于最小化 ,这是 SVM 损失函数求解及优化目标转换的关键步骤 。

拉格朗日乘子法:

求解有约束条件的极值问题

  • 函数:
  • 约束条件:

对应 SVM 的目标与约束

修改目标函数与约束条件相关内容

原目标函数:

转化后:

(极值点不变 )

经过一系列的操作得到

3.举例分析

对于svm的推导公式实在晦涩难懂,我们直接讲述一个案例就好理解了。已知如图所示训练数据集,求最大间隔分离超平面。

  • 正例点:
  • 负例点:

1.数据点代入公式

2.添加约束

  • 等式约束: ,推出
  • 不等式约束:

3.代入化简

化简后的式子: ,通过求最小值(求偏导方式)进一步处理 。

求偏导等于 0

  • 计算得(满足
  • (不满足

4.条件判断

不满足条件,对应超平面方程不可取(强调先决条件必须满足 )

5.思考

解不在偏导为 0 的位置,应在边界上(等于 0 )

等于 0

  • : 代入原式得 ,求偏导后得,再代入原式求最小值为

  • : 代入原式得,求偏导后得,再代入原式求最小值为

最小值在处取得 ,这是 SVM 对偶问题求解中处理约束条件、寻找最优解的关键推导流程 。

6.求解每个

,由,得

7.求解参数

8. 求解参数b

公式:

  • <1> 带入正例\(y = 1\),
  • <2> 带入负例\(y = -1\),

9.总方程

最后我们就求出svm的核函数为上图中的那条红线。

4.软间隔

软间隔:数据中存在一些噪音点,如果考虑这些噪音点的话,超平面可能表现的效果不好。

我们允许个别样本点出现在间隔带里面。

量化指标:引入松弛因子。

原始: [每个样本点必须满足]

放松:[个别样本点不用满足]

新的目标函数:

C:惩罚因子

(1) 当 C 值比较大时,说明分类比较严格,不容有误。

(2)当 C 值比较小时,说明分类比较宽松,可以有误。

三、核函数

谈一下核函数:

线性不可分情况:

在二维空间无法用一条直线分开,映射到三维 (或者更高维) 空间即可解决。

目标:

找到一个,对原始数据做一个变换。

1举例

假设有两个数据,,如果数据在三维空间无法线性可分,我们通过核函数将其从三维空间映射到更高的九维空间,那么此时:

如果计算内积的话,x1与x2计算即,此时计算复杂度= 81,原始数据复杂度为\(3*3 = 9\),那么对于映射到n维空间,复杂度为:

对于数据点:x1 = (1,2,3),x2 = (4,5,6),则f(x1) = (1,2,3,2,4,6,3,6,9),f(x2) = (16,20,24,20,25,30,24,30,36),此时计算<f(x1)·f(x2)>= 16 + 240 + 72 + 40 + 100 + 180 + 72 + 180 + 324 = 1024

一个巧合

即:[先内积再平方与先映射再内积结果一致]

特性

在低维空间完成高维空间的运算,结果一致,大大降低了高维空间计算的复杂度。

本质

在找到一个 (核) 函数,将原始数据变换到高维空间,但是高维数据可以在低维运算。

2常用核函数

  • 线性核函数:

  • 多项式核函数:

  • 高斯核函数:

3.多项式核函数

假设有两个数据,,如果数据在二维空间无法线性可分,我们通过核函数将其从二维空间映射到更高的三维空间,那么此时:

更具体的例子:

(1) 转换到三维再内积 (高维运算)

(2) 先内积,再平方 (低维运算)

4.高斯核函数:

rbf: 又称径向基函数

对于数据点 1, 转换到二维空间:

(1) 找两个地标,或者说两个数据点,将他们作为一个正态分布的均值。-> 比如 - 2 和 1

(2) 计算数据到地标的距离:

(3) 指定为 0.3.[必须大于 0]

(4) 计算新的坐标:

谈一下值:

(1) 当值越小的时候,正态分布越胖, 辐射的数据范围越大,过拟合风险越低。

(2) 当值越大的时候,正态分布越瘦, 辐射的数据范围越小,过拟合风险越高。

四、svm的优缺点

优点:

  1. 有严格的数学理论支持,可解释性强,不同于传统的统计方法能简化我们遇到的问题。
  2. 能找出对任务有关键影响的样本,即支持向量。
  3. 软间隔可以有效松弛目标函数。
  4. 核函数可以有效解决非线性问题。
  5. 最终决策函数只由少数的支持向量所确定,计算的复杂性取决于支持向量的数目,而不是样本空间的维数,这在某种意义上避免了 "维数灾难"。
  6. SVM 在小样本训练集上能够得到比其它算法好很多的结果。

缺点:

  1. 对大规模训练样本难以实施。

    SVM 的空间消耗主要是存储训练样本和核矩阵,当样本数目很大时该矩阵的存储和计算将耗费大量的机器内存和运算时间。超过十万及以上不建议使用 SVM。

  2. 对参数和核函数选择敏感。

    支持向量机性能的优劣主要取决于核函数的选取,所以对于一个实际问题而言,如何根据实际的数据模型选择合适的核函数从而构造 SVM 算法。目前没有好的解决方法解决核函数的选择问题。

  3. 模型预测时,预测时间与支持向量的个数成正比。当支持向量的数量较大时,预测计算复杂度较高。

五、支持向量机的API

python 复制代码
class sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3, gamma='auto_deprecated',
                      coef0=0.0, shrinking=True, probability=False, tol=0.001,
                      cache_size=200, class_weight=None, verbose=False,
                      max_iter=-1, decision_function_shape='ovr', 
                      random_state=None)[source]

参数解释(按顺序)

  1. C

    • 含义:正则化参数(软间隔惩罚系数 ),控制 "对分类错误的容忍度" 与 "模型复杂度" 的权衡。
    • 作用:C 越大,对错误分类惩罚越重(倾向严格分类,易过拟合);C 越小,允许更多错误(倾向简化模型,易欠拟合 )。
  2. kernel

    • 含义:核函数类型,决定如何处理非线性关系。
    • 可选值:'linear'(线性核)、'poly'(多项式核 )、'rbf'(高斯核,默认)、'sigmoid'(Sigmoid 核 )等。
  3. degree

    • 含义:仅对 kernel='poly'(多项式核)有效,指定多项式的次数 n。
    • 作用:次数越高,模型拟合能力越强(但也易过拟合 )。
  4. gamma

    • 含义:核函数的系数(对 rbf/poly/sigmoid 核生效 ),控制核函数的 "影响范围"。
    • 作用:gamma 越大,核函数 "聚焦局部"(样本影响范围小,易过拟合 );gamma 越小,核函数 "全局化"(影响范围大,易欠拟合 )。
    • 备注:'auto_deprecated' 是旧版兼容写法,新版常用 'scale'(按特征方差缩放 )或 'auto'(按特征数倒数缩放 )。
  5. coef0

    • 含义:仅对 kernel='poly'/'sigmoid' 有效,核函数的独立项(多项式核的偏移量、Sigmoid 核的截距 )。
    • 作用:调整核函数的形状,对非线性拟合有微调作用。
  6. shrinking

    • 含义:是否启用 "支持向量收缩" 优化。
    • 作用:加速训练,默认 True(建议开启,尤其是大数据 )。
  7. probability

    • 含义:是否启用概率估计(基于 Platt 缩放 )。
    • 作用:True 则输出分类概率(会增加训练 / 预测时间 ),默认 False
  8. tol

    • 含义:迭代停止的精度阈值(对偶问题求解的收敛条件 )。
    • 作用:tol 越小,训练越精细(但耗时 );默认 0.001
  9. cache_size

    • 含义:核缓存大小(单位:MB ),用于存储核矩阵以加速计算。
    • 作用:内存充足时调大(如 500)可加速训练,默认 200
  10. class_weight

    • 含义:类别权重,解决不平衡数据集问题。
    • 可选值:None(等权重 )、'balanced'(按类别样本数自动分配权重 ),或字典手动指定(如 {0:1, 1:5} 给类别 1 更高权重 )。
  11. verbose

    • 含义:是否输出训练过程的详细日志。
    • 作用:True 则打印迭代信息(调试用 ),默认 False
  12. max_iter

    • 含义:最大迭代次数(对偶问题求解的迭代上限 )。
    • 作用:-1 表示无限制(由 tol 决定停止 ),可手动设小值强制提前停止。
  13. decision_function_shape

    • 含义:多分类策略,'ovr'(一对其余,默认 )或 'ovo'(一对一 )。
    • 作用:'ovr' 更高效,'ovo' 对某些数据集精度更高(但计算量大 )。
  14. random_state

    • 含义:随机种子(用于初始化、采样的随机性控制 )。
    • 作用:设固定值(如 42 )可复现结果,默认 None(随机 )

六、案例分析

使用支持向量机对鸢尾花进行训练、现有数据集:

数据读取与准备

python 复制代码
import pandas as pd
# 读取CSV数据,假设无表头(header=None)
data = pd.read_csv('iris.csv', header=None)
  • 读取鸢尾花数据集,这是一个经典的多类别分类数据集,包含 3 种鸢尾花的特征数据

数据可视化(原始数据)

python 复制代码
import matplotlib.pyplot as plt
# 提取两类数据(假设前50行为类别0,50-100行为类别1)
data1 = data.iloc[:50, :]  # 第一类鸢尾花
data2 = data.iloc[50:100, :]  # 第二类鸢尾花

# 选择第2个和第4个特征进行可视化(因为四维数据无法直接展示)
plt.scatter(data1[1], data1[3], marker='+')  # 第一类用"+"标记
plt.scatter(data2[1], data2[3], marker='o')  # 第二类用"o"标记
  • 鸢尾花数据集原本有 4 个特征,这里选择第 2 列和第 4 列特征进行可视化
  • 用不同标记区分两类鸢尾花数据点

SVM 模型训练

python 复制代码
from sklearn.svm import SVC
# 构建特征矩阵X(选择第2和第4个特征)和标签y(最后一列是类别)
X = data.iloc[:, [1, 3]]
y = data.iloc[:, -1]

# 创建线性核SVM模型,C设为无穷大模拟硬间隔SVM
svm = SVC(kernel='linear', C=float('inf'), random_state=0)
svm.fit(X, y)  # 训练模型

# 获取SVM的权重系数和偏置项
w = svm.coef_[0]  # 权重向量
b = svm.intercept_[0]  # 偏置项
  • 使用sklearnSVC类构建支持向量机模型
  • kernel='linear'表示使用线性核函数
  • C=float('inf')表示使用硬间隔(不允许任何样本被错误分类)
  • 训练后获取模型参数:权重系数w和偏置b,用于构建决策边界

绘制决策边界和间隔

python 复制代码
import numpy as np
# 生成x轴数据(特征1的取值范围)
x1 = np.linspace(0, 7, 300)

# 计算决策边界和间隔线(基于SVM的决策函数w·x + b = 0)
x2 = -(w[0] * x1 + b) / w[1]  # 决策边界:w·x + b = 0
x3 = (1 - w[0] * x1 - b) / w[1]  # 上间隔:w·x + b = 1
x4 = (-1 - w[0] * x1 - b) / w[1]  # 下间隔:w·x + b = -1

# 绘制决策边界和间隔线
plt.plot(x1, x2, linewidth=2, color='r')  # 决策边界(实线)
plt.plot(x1, x3, linewidth=1, color='r', linestyle='--')  # 上间隔(虚线)
plt.plot(x1, x4, linewidth=1, color='r', linestyle='--')  # 下间隔(虚线)
  • 决策边界是 SVM 找到的最优分类线,满足w·x + b = 0
  • 间隔线表示分类的安全区域,上间隔为w·x + b = 1,下间隔为w·x + b = -1

调整显示范围和绘制支持向量

python 复制代码
# 设置坐标轴范围
plt.xlim(4, 7)
plt.ylim(0, 5)

# 获取并绘制支持向量(对决策边界有决定性影响的样本点)
vets = svm.support_vectors_
plt.scatter(vets[:, 0], vets[:, 1], c='b', marker='x')  # 支持向量用蓝色"x"标记

plt.show()  # 显示图像

最终结果

  • 支持向量是距离决策边界最近的样本点,决定了 SVM 的决策边界位置
  • 最终图像展示了两类数据点、决策边界、间隔区域和支持向量

我们还可以使用交叉验证去寻找最好的模型参数,这里讲述了如何用交叉验证去寻找最好的参数。

机器学习第三课之逻辑回归(二)LogisticRegression