目录

手撕算法支持向量机SVM从入门到实战数学推导与核技巧揭秘

【手撕算法】支持向量机(SVM)从入门到实战:数学推导与核技巧揭秘

摘要

支持向量机(SVM)是机器学习中的经典算法!本文将深入解析最大间隔分类原理,手撕对偶问题推导过程,并实战实现非线性分类与图像识别。文中附《统计学习公式手册》及SVM调参指南,助力你掌握这一核心算法!


目录


一、算法核心思想

SVM通过寻找 最大间隔超平面 实现分类,核心数学表达为:

https://latex.csdn.net/eq?%28%20min_%7Bw%2Cb%7D%20%5Cfrac%7B1%7D%7B2%7D%7Cw%7C%5E2%20%29

满足约束:

https://latex.csdn.net/eq?%28%20y_i%28w%5ETx_i%20+%20b%29%20%5Cgeq%201%20%5Cquad%20%5Cforall%20i%20%29

📌 关联阅读


二、数学原理详解

2.1 拉格朗日对偶问题

引入拉格朗日乘子 https://latex.csdn.net/eq?%28%20%5Calpha_i%20%5Cgeq%200%20%29

https://latex.csdn.net/eq?%28%20L%28w%2Cb%2C%5Calpha%29%20%3D%20%5Cfrac%7B1%7D%7B2%7D%7Cw%7C%5E2%20-%20%5Csum_%7Bi%3D1%7D%5En%20%5Calpha_i%5By_i%28w%5ETx_i%20+%20b%29%20-%201%5D%20%29

对 w 和 b  求偏导得:

https://latex.csdn.net/eq?%28%20w%20%3D%20%5Csum_%7Bi%3D1%7D%5En%20%5Calpha_i%20y_i%20x_i%20%29

https://latex.csdn.net/eq?%28%20%5Csum_%7Bi%3D1%7D%5En%20%5Calpha_i%20y_i%20%3D%200%20%29

2.2 核技巧(Kernel Trick)

将内积替换为核函数:

https://latex.csdn.net/eq?%28%20K%28x_i%2C%20x_j%29%20%3D%20%5Cphi%28x_i%29%5ET%20%5Cphi%28x_j%29%20%29

常用核函数:

  • 高斯核: https://latex.csdn.net/eq?%28%20K%28x%2Cy%29%20%3D%20%5Cexp%28-%5Cgamma%7Cx%20-%20y%7C%5E2%29%20%29
  • 多项式核: https://latex.csdn.net/eq?%28%20K%28x%2Cy%29%20%3D%20%28x%5ETy%20+%20c%29%5Ed%20%29

三、Python代码实战

3.1 线性SVM分类(手写实现)

import numpy as np
from cvxopt import matrix, solvers

class SVM:
    def __init__(self, kernel='linear', C=1.0, gamma=0.1):
        self.kernel = kernel
        self.C = C
        self.gamma = gamma
        
    def fit(self, X, y):
        n_samples, n_features = X.shape
        
        # 计算核矩阵
        K = self._compute_kernel(X, X)
        
        # 构建QP问题参数
        P = matrix(np.outer(y, y) * K)
        q = matrix(-np.ones(n_samples))
        A = matrix(y.reshape(1, -1).astype(np.double))
        b = matrix(0.0)
        G = matrix(np.vstack((-np.eye(n_samples), np.eye(n_samples))))
        h = matrix(np.hstack((np.zeros(n_samples), np.ones(n_samples) * self.C)))
        
        # 求解二次规划
        solution = solvers.qp(P, q, G, h, A, b)
        self.alpha = np.ravel(solution['x'])
        
        # 计算支持向量
        sv = self.alpha > 1e-5
        self.sv_alpha = self.alpha[sv]
        self.sv_X = X[sv]
        self.sv_y = y[sv]
        
        # 计算偏置b
        self.b = np.mean(self.sv_y - np.sum(self.sv_alpha * self.sv_y * 
                        self._compute_kernel(self.sv_X, self.sv_X), axis=1))
    
    def predict(self, X):
        return np.sign(np.sum(self.sv_alpha * self.sv_y * 
                            self._compute_kernel(self.sv_X, X), axis=1) + self.b)

3.2 非线性分类可视化

from sklearn.datasets import make_moons
import matplotlib.pyplot as plt

# 生成非线性数据集
X, y = make_moons(n_samples=100, noise=0.15, random_state=42)
y = np.where(y == 0, -1, 1)

# 训练SVM模型
model = SVM(kernel='rbf', gamma=0.5, C=1.0)
model.fit(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.02),
                     np.arange(y_min, y_max, 0.02))

Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, alpha=0.3)
plt.scatter(X[:,0], X[:,1], c=y, edgecolors='k')

四、算法优化技巧

4.1 参数调优指南

参数作用推荐设置方法
C惩罚系数网格搜索(0.1, 1, 10)
gamma核函数带宽根据特征标准差调整
kernel核函数类型数据线性可分时选linear

4.2 多分类扩展

通过一对多(OvR)策略实现多分类:

(text{构建K个二分类器,第i个分类器区分第i类与其他类}


五、常见问题解答

Q1:如何处理类别不平衡?

  • 调整类别权重 https://latex.csdn.net/eq?class_weight%3D%27balanced%27%20%29
  • 使用SMOTE过采样技术

Q2:SVM vs 神经网络?

算法优点适用场景
SVM小样本效果好高维数据分类
神经网络大数据表现优复杂模式识别

六、结语与资源

通过本文您已掌握:

🔹 SVM数学推导 🔹 手写实现核心代码 🔹 非线性分类实战