🧠 SVM 是什么?一句话说清楚:
SVM 就是一个分类器,它想在两个类别之间画一条“最宽的分界线”,让两边的数据离这条线越远越好。
你可以把它想象成:
在猫和狗之间划出一条“安全距离线”,谁靠得近谁就容易被误判。SVM 想让这条线尽可能远离两边的样本。
🎯 核心目标
找到一个最优的超平面(可以是直线、平面),把两类数据分开,并且让这个分界线离两边的数据点尽可能远。
📐 数学公式讲解
1. 超平面方程(就是那条分界线)
w⋅x+b=0
- w:法向量,决定方向;
- x:输入样本点;
- b:偏置项,决定位置;
- 这个式子其实就是一条“线”的表达方式。
2. 分类规则(判断是哪一类)
预测结果=sign(w⋅x+b)
- 如果结果大于 0 → 属于正类;
- 如果小于 0 → 属于负类;
- sign 表示取符号函数。
3. 约束条件(要保证每个点都正确分类)(硬间隔)
yi(w⋅xi+b)≥1
- yi 是标签(+1 或 -1)
- 这个意思是:每个点都要在边界外边,不能太靠近中间!
4. 优化目标(最大化间隔)
w,bmin21∥w∥2
- 最小化 ∥w∥2 的意思就是最大化分类间隔;
- 因为我们知道:间隔宽度 = ∥w∥2
所以,SVM 的本质就是一个有约束的最优化问题。
5. 软间隔
硬间隔要求所有样本点都严格满足 yi(w⋅xi+b)≥1,即所有样本必须被正确分类且位于间隔外侧。
硬间隔存在的问题:当数据中存在噪声、异常值或非线性可分时,硬间隔可能导致:
- 无法找到可行解;
- 模型过拟合(间隔过窄,对噪声敏感)。
软间隔的改进:
引入松弛变量(Slack Variables) ξi≥0,允许某些样本点:
- 落入间隔区域(0<ξi<1);
- 被错误分类(ξi≥1)。
软间隔的优化目标和约束条件如下:
优化目标
w,b,ξmin(21∥w∥2+Ci=1∑nξi)
- 第一项:21∥w∥2 → 最大化间隔宽度(间隔=∥w∥2);
- 第二项:C∑ξi → 最小化分类错误(松弛变量的惩罚项);
- 超参数 C:控制间隔宽度与分类错误的权衡:
- C→∞:逼近硬间隔(不允许错误);
- C→0:允许大量错误,间隔极大化。
约束条件
yi(w⋅xi+b)≥1−ξi,ξi≥0,∀i
- 每个样本允许违反原始约束(yi(w⋅xi+b)≥1)的程度由 ξi 决定。
松弛变量 ξi 的直观解释
- ξi=0:样本位于间隔外侧且正确分类;
- 0<ξi<1:样本位于间隔内,但仍正确分类;
- ξi≥1:样本被错误分类。
6. 核技巧(Kernel Trick)
核技巧的数学本质:
核技巧的核心是:不显式地把数据映射到高维空间,而是通过一个核函数 K(xi,xj) 直接计算高维空间中两个向量的内积。
公式解释:
假设我们有一个映射函数 ϕ(x),它能把原始数据 x 映射到高维空间(比如从二维变成三维或更高维)。
那么,在高维空间中两个向量的内积就是:
ϕ(xi)⋅ϕ(xj)
但直接计算这个内积可能非常麻烦!核技巧告诉我们:
存在一个核函数 K(xi,xj),使得:
K(xi,xj)=ϕ(xi)⋅ϕ(xj)
这样就不需要显式计算 ϕ(x),直接用核函数就能得到结果!
🔍 常见核函数及其公式:
核函数类型 | 公式 | 适用场景 |
---|
线性核 | K(xi,xj)=xiTxj | 线性可分数据 |
多项式核 | K(xi,xj)=(xiTxj+c)d | 非线性但规则的数据(如多项式关系) |
高斯核(RBF) | K(xi,xj)=exp(−2σ2∥xi−xj∥2) | 最通用,适合大多数非线性问题 |
Sigmoid核 | K(xi,xj)=tanh(κxiTxj+c) | 类似神经网络激活函数 |
7. 对偶问题(Dual Problem)与拉格朗日乘子
拉格朗日乘子法 把 SVM 的带约束优化问题转化为对偶形式,让问题更容易求解,同时揭示了支持向量的核心作用,并为核技巧提供了数学基础。
SVM 的核心目标是: 在分类正确(约束条件)的前提下,最大化分类间隔(优化目标)。
但这是一个 带约束的优化问题(必须满足 yi(w⋅xi+b)≥1),直接求解很难。
拉格朗日乘子法 的作用就是:
把“带约束”的问题转化为“无约束”的问题,方便求解。
原始问题:通过拉格朗日乘子法将带约束的优化问题转化为无约束的拉格朗日函数:
SVM 的原始目标是:
- 最小化 21∥w∥2(最大化间隔);
- 满足约束 yi(w⋅xi+b)≥1(分类正确)。
拉格朗日函数 就是把目标和约束“绑在一起”的数学工具:
L(w,b,ξ,α,μ)=原始目标21∥w∥2+C∑ξi约束条件−∑αi[yi(w⋅xi+b)−1+ξi]−∑μiξi
- αi,μi 是拉格朗日乘子(类似权重);
- 负号 是为了将约束转化为惩罚项;
- 松弛变量 ξi 允许部分样本违反约束(软间隔)。
对偶问题:通过求解拉格朗日乘子 αi 的对偶形式:
αmaxi=1∑nαi−21i,j∑αiαjyiyj(xi⋅xj)
- 关键性质:只有支持向量的 αi>0,其余样本的 αi=0。
- 核技巧的自然融入:对偶问题中直接替换内积为核函数 K(xi,xj)。
🧪 Python 示例代码(使用 sklearn)
下面是一个简单的 SVM 分类例子,用的是鸢尾花数据集的一部分:
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)
model = SVC(kernel='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 就是在两个类之间找一条“最宽的线”,让两边的点尽量离得远一点。这样分类效果更好,不容易出错。
它的核心是优化一个目标函数,找到最优的分界线,还可以通过核技巧处理非线性问题(比如曲线分界)。