目录
芜湖~~~支持向量机(SVM)
1. 引言
支持向量机(Support Vector Machine,简称 SVM)是一种基于统计学习理论的监督学习模型,最早由 Vladimir Vapnik 等人提出,广泛应用于分类(Classification)与回归(Regression)任务中。由于其优越的泛化能力和坚实的理论基础,SVM 成为现代机器学习领域的重要算法之一,特别适合于高维、小样本以及非线性问题。
2. 基本思想
SVM 的核心思想是:
在特征空间中寻找一个最优分离超平面(Optimal Hyperplane),使得该超平面能够最大限度地将不同类别的样本分隔开,并具有 最大化间隔(Margin Maximization) 的特性。
如下图所示,对于线性可分问题,SVM 会选取离两个类别最近样本点(即支持向量)距离最大的分割平面作为最终分类器。
3. 数学模型
3.1 超平面定义
在 n 维空间中,一个超平面的定义如下:
其中:
-
w:法向量,决定超平面方向;
-
b :偏置项,决定超平面距离原点的位置;
-
x :输入样本。
3.2 分类间隔与目标函数
对于样本 ,其分类间隔定义为:
SVM 的目标是最大化所有样本的最小分类间隔,即:
为简化计算,通常转化为以下凸优化问题(硬间隔 SVM):
3.3 软间隔与松弛变量
当数据线性不可分时,引入松弛变量 和惩罚系数 C,得到软间隔 SVM:
其中:
-
C :控制对误分类的惩罚程度;
-
:表示样本违反间隔的程度。
4. 核函数方法(Kernel Trick)
许多实际问题是非线性可分的。SVM 借助核函数技术将数据映射到高维特征空间,在高维空间中实现线性可分。
4.1 核函数定义
核函数 实际上是一个隐式内积:
其中 是非线性映射函数,无需显式计算。
4.2 常用核函数
核函数 | 表达式 | 说明 |
---|---|---|
线性核(Linear) | 适用于线性问题 | |
多项式核(Polynomial) | 控制多项式的复杂度 | |
RBF核(高斯核) | 广泛使用,处理非线性问题 | |
Sigmoid核 | 类似神经网络激活函数 |
5. SVM 的几种类型
类型 | 描述 |
---|---|
C-SVC | 最常用的分类 SVM,带惩罚系数 C |
NU-SVC | 用参数 |
EPS-SVR | 支持向量回归(SVR)类型,用于回归问题 |
NU-SVR | 用 |
6. SVM 的训练与预测流程
6.1 模型训练
-
输入:训练样本(特征向量 + 标签)
-
设置 SVM 参数(核函数、C、γ等)
-
求解优化问题(使用 SMO、梯度下降等方法)
-
得到模型(支持向量、权重、偏置)
6.2 模型预测
预测函数定义为:
其中, 是拉格朗日乘子,仅对支持向量不为零。
7. 优点与局限
7.1 优点
-
理论基础坚实(VC维理论)
-
对高维、小样本数据表现良好
-
可处理非线性问题(通过核方法)
-
具有稀疏解(依赖于少数支持向量)
7.2 局限
-
对大规模数据训练速度慢,内存消耗大
-
核函数和参数选择依赖经验
-
不易处理多分类问题(需借助一对一/一对多策略)
8. SVM 与多分类问题
SVM 原生为二分类模型,但可通过以下策略扩展为多分类:
-
一对一(One-vs-One, OvO):为每两个类别训练一个分类器,投票决定最终分类;
-
一对多(One-vs-Rest, OvR):为每一个类别与其余类别训练一个分类器,选择概率最大者;
-
结构 SVM:直接扩展的多类模型(不常见于 OpenCV 实现中)。
9.代码示例
基于 Python 的 scikit-learn
和 matplotlib
实现。这个代码会:
-
创建两类可分数据;
-
用 SVM 训练分类器;
-
可视化:
-
支持向量(用圈标出)
-
决策边界(黑线)
-
间隔边界(虚线)
-
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets import make_blobs
# 生成两个类别的样本数据
X, y = make_blobs(n_samples=40, centers=2, random_state=6)
# 拟合一个线性支持向量分类器
clf = svm.SVC(kernel='linear', C=1.0)
clf.fit(X, y)
# 获取模型的参数
w = clf.coef_[0]
a = -w[0] / w[1]
xx = np.linspace(min(X[:, 0]) - 1, max(X[:, 0]) + 1)
yy = a * xx - (clf.intercept_[0]) / w[1]
# 计算边界线(间隔)
margin = 1 / np.linalg.norm(w)
yy_down = yy - np.sqrt(1 + a ** 2) * margin
yy_up = yy + np.sqrt(1 + a ** 2) * margin
# 绘图
plt.figure(figsize=(8, 6))
# 分类点
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.coolwarm, s=30)
# 决策边界
plt.plot(xx, yy, 'k-')
# 间隔边界
plt.plot(xx, yy_down, 'k--')
plt.plot(xx, yy_up, 'k--')
# 支持向量
plt.scatter(clf.support_vectors_[:, 0],
clf.support_vectors_[:, 1],
s=150, facecolors='none', edgecolors='k', linewidths=1.5, label='Support Vectors')
plt.legend()
plt.title("SVM Decision Boundary with Margin and Support Vectors")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.grid(True)
plt.show()
9. 应用场景
SVM 被广泛应用于以下任务:
-
图像分类、人脸识别、字符识别(如 OCR)
-
基因数据分析与医学诊断
-
文字情感分类与垃圾邮件检测
-
股票趋势预测与回归任务
10. 小结
支持向量机是一种功能强大的分类与回归工具,其“最大间隔 + 核技巧”的方法为机器学习提供了坚实的模型选择方式。在合适的参数和核函数配置下,SVM 能够提供强鲁棒性与良好的泛化能力。对于中小规模问题,SVM 是值得优先尝试的模型之一。
用一句最简单的话讲明白SVM支持向量机
SVM支持向量机是一种机器学习算法,它通过找到一个最优的超平面来分类数据点,使得不同类别的数据点尽可能分开。