1. 支持向量机与线性超平面基础概念
支持向量机(Support Vector Machine, SVM)作为机器学习领域的经典算法,其核心思想是通过寻找最优分类超平面来实现数据分割。对于线性可分情况,这个超平面就是一个n维空间中的线性决策边界。我首次接触SVM时,最困惑的就是为什么最大化间隔能带来更好的泛化性能——直到亲手推导了数学过程才真正理解。
假设我们有一个二维特征空间中的二分类问题,正类样本标记为+1,负类样本标记为-1。超平面可以表示为wᵀx + b = 0,其中w是法向量,b是偏置项。所有正类样本满足wᵀx + b ≥ +1,负类样本满足wᵀx + b ≤ -1,这两个平行超平面之间的区域就是"间隔"。
关键理解:支持向量是那些位于wᵀx + b = ±1超平面上的样本点,它们就像"撑起"间隔的支柱,这也是算法名称的由来。
2. 间隔最大化问题的数学表述
要让间隔最大化,需要先计算间隔的几何宽度。对于任意一点x在正类超平面上,其到分类超平面的距离为|wᵀx + b|/||w|| = 1/||w||。因为两个边界超平面对称,总间隔宽度就是2/||w||。
因此,最大化间隔等价于最小化||w||(或者说1/2||w||²,便于后续求导)。加上分类约束条件,得到原始优化问题:
最小化:1/2||w||²
约束条件:y_i(wᵀx_i + b) ≥ 1, ∀i
这个凸二次规划问题可以用拉格朗日乘子法求解。构造拉格朗日函数:
L(w,b,α) = 1/2||w||² - Σα_i[y_i(wᵀx_i + b) - 1]
其中α_i ≥ 0是拉格朗日乘子。根据KKT条件,在最优解处:
∂L/∂w = w - Σα_i y_i x_i = 0
∂L/∂b = -Σα_i y_i = 0
这引出了两个重要性质:
- 最优w是训练样本的线性组合:w = Σα_i y_i x_i
- 只有支持向量对应的α_i > 0,其他样本的α_i=0
3. 对偶问题的推导与求解
将上述结果代回拉格朗日函数,得到对偶问题:
最大化:Σα_i - 1/2 ΣΣ α_i α_j y_i y_j x_iᵀx_j
约束条件:Σα_i y_i = 0, α_i ≥ 0
这个形式展现出SVM的一个重要特性——最终决策函数只依赖于样本间的内积:
f(x) = sign(Σα_i y_i x_iᵀx + b)
计算技巧:b可以通过任意支持向量计算得到,b = y_i - wᵀx_i(对任意α_i > 0的样本)
4. 具体例题分步演示
假设训练集: 正类:x1=(1,2), x2=(2,3)
负类:x3=(0,0), x4=(1,0)
标记y1=y2=+1, y3=y4=-1
步骤1:计算核矩阵由于是线性核,Kij = x_iᵀx_j:
| x1 | x2 | x3 | x4 | |
|---|---|---|---|---|
| x1 | 5 | 8 | 0 | 1 |
| x2 | 8 | 13 | 0 | 2 |
| x3 | 0 | 0 | 0 | 0 |
| x4 | 1 | 2 | 0 | 1 |
步骤2:构建对偶问题最大化: α1 + α2 + α3 + α4 - 1/2(5α1² + 13α2² + α4² + 16α1α2 + 2α1α4 + 4α2α4)
约束: α1 + α2 - α3 - α4 = 0
α_i ≥ 0
步骤3:求解优化通过分析KKT条件,可以确定x1和x3是支持向量。解得: α1=1, α3=1, α2=α4=0
步骤4:计算参数w = Σα_i y_i x_i = 1*(1,2) + 1*(0,0) = (1,2)
b = y1 - wᵀx1 = 1 - (11 + 22) = -4
最终决策函数: f(x) = sign(x₁ + 2x₂ - 4)
5. 关键细节与常见误区
支持向量的识别:在实际计算中,建议先画出样本点,直观判断哪些点可能成为支持向量。在上例中,x2和x4明显在间隔区域内部。
偏置项b的计算:务必使用支持向量计算b值。我曾犯过的错误是用非支持向量计算,导致分类面偏移。
线性不可分情况:当数据不能完美分离时,需要引入松弛变量ξ_i,此时优化目标变为: 最小化:1/2||w||² + CΣξ_i 其中C是惩罚参数,控制分类错误与间隔宽度的权衡。
数值稳定性问题:当特征量纲差异大时,建议先标准化数据。否则可能因数值问题导致优化困难。
6. 实际应用中的扩展思考
虽然我们演示的是最简单的线性可分案例,但SVM的强大之处在于:
核技巧:通过将内积x_iᵀx_j替换为核函数K(x_i,x_j),可以隐式映射到高维空间处理非线性问题。常用核函数包括:
- 多项式核:(γx_iᵀx_j + r)^d
- RBF核:exp(-γ||x_i - x_j||²)
多类分类:通过一对一或一对多策略扩展二分类SVM
参数选择:对于非线性SVM,核参数(如RBF的γ)和惩罚系数C需要通过交叉验证确定。我的经验是先用网格搜索粗调,再在最优区域细调。
调试心得:在实践中,建议先用小规模数据验证SVM行为,特别是检查支持向量是否符合预期。我曾遇到因数据预处理不当导致所有样本都成为支持向量的情况,这通常意味着参数选择或数据本身存在问题。