【知识点】SVM支持向量机,松弛变量,核技巧
编辑
2025-05-27
深度学习
00

目录

🧠 SVM 是什么?一句话说清楚:
🎯 核心目标
📐 数学公式讲解
1. 超平面方程(就是那条分界线)
2. 分类规则(判断是哪一类)
3. 约束条件(要保证每个点都正确分类)(硬间隔)
4. 优化目标(最大化间隔)
5. 软间隔
优化目标
约束条件
6. 核技巧(Kernel Trick)
核技巧的数学本质:
公式解释:
🔍 常见核函数及其公式:
7. 对偶问题(Dual Problem)与拉格朗日乘子
🧪 Python 示例代码(使用 sklearn)
✅ 总结一下:

🧠 SVM 是什么?一句话说清楚:

SVM 就是一个分类器,它想在两个类别之间画一条“最宽的分界线”,让两边的数据离这条线越远越好。

你可以把它想象成:
在猫和狗之间划出一条“安全距离线”,谁靠得近谁就容易被误判。SVM 想让这条线尽可能远离两边的样本。


🎯 核心目标

找到一个最优的超平面(可以是直线、平面),把两类数据分开,并且让这个分界线离两边的数据点尽可能远。


📐 数学公式讲解

1. 超平面方程(就是那条分界线)

wx+b=0w \cdot x + b = 0
  • ww:法向量,决定方向;
  • xx:输入样本点;
  • bb:偏置项,决定位置;
  • 这个式子其实就是一条“线”的表达方式。

2. 分类规则(判断是哪一类)

预测结果=sign(wx+b)\text{预测结果} = \text{sign}(w \cdot x + b)
  • 如果结果大于 0 → 属于正类;
  • 如果小于 0 → 属于负类;
  • sign 表示取符号函数。

3. 约束条件(要保证每个点都正确分类)(硬间隔)

yi(wxi+b)1y_i (w \cdot x_i + b) \geq 1
  • yiy_i 是标签(+1 或 -1)
  • 这个意思是:每个点都要在边界外边,不能太靠近中间!

4. 优化目标(最大化间隔)

minw,b12w2\min_{w, b} \frac{1}{2} \|w\|^2
  • 最小化 w2\|w\|^2 的意思就是最大化分类间隔;
  • 因为我们知道:间隔宽度 = 2w\frac{2}{\|w\|}

所以,SVM 的本质就是一个有约束的最优化问题

5. 软间隔

硬间隔要求所有样本点都严格满足 yi(wxi+b)1y_i (w \cdot x_i + b) \geq 1,即所有样本必须被正确分类且位于间隔外侧。

硬间隔存在的问题:当数据中存在噪声、异常值或非线性可分时,硬间隔可能导致:

  • 无法找到可行解;
  • 模型过拟合(间隔过窄,对噪声敏感)。

软间隔的改进
引入松弛变量(Slack Variables) ξi0\xi_i \geq 0,允许某些样本点:

  • 落入间隔区域(0<ξi<10 < \xi_i < 1);
  • 被错误分类(ξi1\xi_i \geq 1)。

软间隔的优化目标和约束条件如下:

优化目标

minw,b,ξ(12w2+Ci=1nξi)\min_{w, b, \xi} \left( \frac{1}{2} \|w\|^2 + C \sum_{i=1}^n \xi_i \right)
  • 第一项12w2\frac{1}{2} \|w\|^2 → 最大化间隔宽度(间隔=2w\text{间隔} = \frac{2}{\|w\|});
  • 第二项CξiC \sum \xi_i → 最小化分类错误(松弛变量的惩罚项);
  • 超参数 CC:控制间隔宽度与分类错误的权衡:
    • CC \to \infty:逼近硬间隔(不允许错误);
    • C0C \to 0:允许大量错误,间隔极大化。

约束条件

yi(wxi+b)1ξi,ξi0,iy_i (w \cdot x_i + b) \geq 1 - \xi_i, \quad \xi_i \geq 0, \quad \forall i
  • 每个样本允许违反原始约束(yi(wxi+b)1y_i (w \cdot x_i + b) \geq 1)的程度由 ξi\xi_i 决定。

松弛变量 ξi\xi_i 的直观解释

  • ξi=0\xi_i = 0:样本位于间隔外侧且正确分类;
  • 0<ξi<10 < \xi_i < 1:样本位于间隔内,但仍正确分类;
  • ξi1\xi_i \geq 1:样本被错误分类。

6. 核技巧(Kernel Trick)

核技巧的数学本质:

核技巧的核心是:不显式地把数据映射到高维空间,而是通过一个核函数 K(xi,xj)K(x_i, x_j) 直接计算高维空间中两个向量的内积。


公式解释:

假设我们有一个映射函数 ϕ(x)\phi(x),它能把原始数据 xx 映射到高维空间(比如从二维变成三维或更高维)。

那么,在高维空间中两个向量的内积就是:

ϕ(xi)ϕ(xj)\phi(x_i) \cdot \phi(x_j)

但直接计算这个内积可能非常麻烦!核技巧告诉我们:

存在一个核函数 K(xi,xj)K(x_i, x_j),使得:

K(xi,xj)=ϕ(xi)ϕ(xj)K(x_i, x_j) = \phi(x_i) \cdot \phi(x_j)

这样就不需要显式计算 ϕ(x)\phi(x),直接用核函数就能得到结果!


🔍 常见核函数及其公式:

核函数类型公式适用场景
线性核K(xi,xj)=xiTxjK(x_i, x_j) = x_i^T x_j线性可分数据
多项式核K(xi,xj)=(xiTxj+c)dK(x_i, x_j) = (x_i^T x_j + c)^d非线性但规则的数据(如多项式关系)
高斯核(RBF)K(xi,xj)=exp(xixj22σ2)K(x_i, x_j) = \exp\left(-\frac{\|x_i - x_j\|^2}{2\sigma^2}\right)最通用,适合大多数非线性问题
Sigmoid核K(xi,xj)=tanh(κxiTxj+c)K(x_i, x_j) = \tanh(\kappa x_i^T x_j + c)类似神经网络激活函数

7. 对偶问题(Dual Problem)与拉格朗日乘子

拉格朗日乘子法 把 SVM 的带约束优化问题转化为对偶形式,让问题更容易求解,同时揭示了支持向量的核心作用,并为核技巧提供了数学基础。

SVM 的核心目标是: 在分类正确(约束条件)的前提下,最大化分类间隔(优化目标)。

但这是一个 带约束的优化问题(必须满足 yi(wxi+b)1y_i(w \cdot x_i + b) \geq 1),直接求解很难。
拉格朗日乘子法 的作用就是:

把“带约束”的问题转化为“无约束”的问题,方便求解。

原始问题:通过拉格朗日乘子法将带约束的优化问题转化为无约束的拉格朗日函数:

SVM 的原始目标是:

  • 最小化 12w2\frac{1}{2}\|w\|^2(最大化间隔);
  • 满足约束 yi(wxi+b)1y_i(w \cdot x_i + b) \geq 1(分类正确)。

拉格朗日函数 就是把目标和约束“绑在一起”的数学工具:

L(w,b,ξ,α,μ)=12w2+Cξi原始目标αi[yi(wxi+b)1+ξi]μiξi约束条件\mathcal{L}(w, b, \xi, \alpha, \mu) = \underbrace{\frac{1}{2}\|w\|^2 + C\sum\xi_i}_{\text{原始目标}} \underbrace{- \sum\alpha_i[y_i(w \cdot x_i + b) - 1 + \xi_i] - \sum\mu_i\xi_i}_{\text{约束条件}}
  • αi,μi\alpha_i, \mu_i 是拉格朗日乘子(类似权重);
  • 负号 是为了将约束转化为惩罚项;
  • 松弛变量 ξi\xi_i 允许部分样本违反约束(软间隔)。

对偶问题:通过求解拉格朗日乘子 αi\alpha_i 的对偶形式:

maxαi=1nαi12i,jαiαjyiyj(xixj)\max_{\alpha} \sum_{i=1}^n \alpha_i - \frac{1}{2} \sum_{i,j} \alpha_i \alpha_j y_i y_j (x_i \cdot x_j)
  • 关键性质:只有支持向量的 αi>0\alpha_i > 0,其余样本的 αi=0\alpha_i = 0
  • 核技巧的自然融入:对偶问题中直接替换内积为核函数 K(xi,xj)K(x_i, x_j)

🧪 Python 示例代码(使用 sklearn)

下面是一个简单的 SVM 分类例子,用的是鸢尾花数据集的一部分:

python
展开代码
# 导入需要的库 from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.svm import SVC from sklearn.metrics import accuracy_score # 加载数据(只取前两类,做二分类) iris = datasets.load_iris() X = iris.data[iris.target != 2][:, :2] # 只取前两个特征方便可视化 y = iris.target[iris.target != 2] # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 创建 SVM 分类器(默认使用 RBF 核) model = SVC(kernel='linear') # linear 表示使用线性核 # 训练模型 model.fit(X_train, y_train) # 预测 y_pred = model.predict(X_test) # 评估准确率 print("准确率:", accuracy_score(y_test, y_pred)) # 可视化一下 import matplotlib.pyplot as plt def plot_decision_boundary(model, X, y): x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.01), np.arange(y_min, y_max, 0.01)) Z = model.predict(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape) plt.contourf(xx, yy, Z, alpha=0.4) plt.scatter(X[:, 0], X[:, 1], c=y, s=20, edgecolor='k') plt.title("SVM 分类边界") plt.show() plot_decision_boundary(model, X, y)

✅ 总结一下:

SVM 就是在两个类之间找一条“最宽的线”,让两边的点尽量离得远一点。这样分类效果更好,不容易出错。

它的核心是优化一个目标函数,找到最优的分界线,还可以通过核技巧处理非线性问题(比如曲线分界)。

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!