# 支持向量机(SVM)算法

# 直观理解

想象你是一个画家,需要在一张画布上画一条线,将红色和蓝色的点完美地分开。这就是SVM要解决的问题!

你会怎么画这条线呢?

  1. 首先,你希望这条线能正确分开所有点
  2. 其次,你希望线和最近的点之间的距离尽可能大
  3. 如果点不能用一条直线分开,你可能需要用曲线

这就是SVM的核心思想:找到最优的分隔线(超平面),使得不同类别的数据点之间的间隔最大。

# 算法原理

# 基本概念(以画线分类为例)

  • 分隔线(超平面):就像画布上的一条线,将不同颜色的点分开
  • 支持向量:离分隔线最近的点,它们就像是撑起这条线的支柱
  • 间隔:分隔线到最近点的距离,就像是安全区域
  • 核技巧:当无法用直线分开时,就像把平面图画变成立体图

# 算法流程

# 数学原理

# 线性可分SVM

对于线性可分问题,最优超平面的数学表达式:

wTx+b=0w^T x + b = 0

原始优化问题:

minw,b12w2\min_{w,b} \frac{1}{2}||w||^2

约束条件:

yi(wTxi+b)1,i=1,,ny_i(w^T x_i + b) \geq 1, i=1,\ldots,n

# 对偶问题推导

引入拉格朗日乘子 αi0\alpha_i \geq 0,构造拉格朗日函数:

L(w,b,α)=12w2i=1nαi[yi(wTxi+b)1]L(w,b,\alpha) = \frac{1}{2}||w||^2 - \sum_{i=1}^n \alpha_i[y_i(w^T x_i + b) - 1]

对偶问题:

maxαi=1nαi12i=1nj=1nαiαjyiyjxiTxj\max_{\alpha} \sum_{i=1}^n \alpha_i - \frac{1}{2}\sum_{i=1}^n\sum_{j=1}^n \alpha_i\alpha_j y_i y_j x_i^T x_j

约束条件:

αi0,i=1nαiyi=0\alpha_i \geq 0, \sum_{i=1}^n \alpha_i y_i = 0

# 软间隔SVM

引入松弛变量 ξi0\xi_i \geq 0 处理非线性可分问题:

minw,b,ξ12w2+Ci=1nξi\min_{w,b,\xi} \frac{1}{2}||w||^2 + C\sum_{i=1}^n \xi_i

约束条件:

yi(wTxi+b)1ξi,ξi0,i=1,,ny_i(w^T x_i + b) \geq 1 - \xi_i, \xi_i \geq 0, i=1,\ldots,n

其中C为惩罚参数,控制模型对误分类的容忍程度。

# 核函数

通过核函数将数据映射到高维空间:

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

常用核函数:

  • 线性核:K(xi,xj)=xiTxjK(x_i, x_j) = x_i^T x_j
  • 多项式核:K(xi,xj)=(γxiTxj+r)dK(x_i, x_j) = (\gamma x_i^T x_j + r)^d
  • RBF核:K(xi,xj)=exp(γxixj2)K(x_i, x_j) = \exp(-\gamma ||x_i - x_j||^2)

# 算法步骤

  1. 数据预处理:特征缩放和标准化
  2. 核函数选择:根据数据特点选择合适的核函数
  3. 参数优化:使用交叉验证选择最优参数
  4. 模型训练:求解对偶问题获得支持向量
  5. 预测:使用训练好的模型进行分类

# 优缺点

# 优点

  • 在高维空间中表现良好
  • 适用于非线性分类问题
  • 泛化能力强
  • 理论基础扎实

# 缺点

  • 对大规模数据训练时间长
  • 对参数选择敏感
  • 对噪声数据敏感
  • 不直接支持多分类

# 应用场景

  1. 文本分类

    • 垃圾邮件检测
    • 新闻分类
    • 情感分析
  2. 图像识别

    • 人脸识别
    • 手写字符识别
    • 目标检测
  3. 生物信息学

    • 蛋白质分类
    • 基因表达分析
    • 疾病诊断

# 代码示例

from sklearn.svm import SVC
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# 生成示例数据
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15,
                          n_redundant=5, random_state=42)

# 数据预处理
scaler = StandardScaler()
X = scaler.fit_transform(X)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# 创建SVM分类器
svm = SVC(kernel='rbf', C=1.0, gamma='scale')

# 训练模型
svm.fit(X_train, y_train)

# 预测
y_pred = svm.predict(X_test)

# 计算准确率
accuracy = svm.score(X_test, y_test)
print(f"模型准确率: {accuracy:.2f}")

# 调优技巧

  1. 核函数选择

    • 线性核:数据线性可分
    • RBF核:数据非线性
    • 多项式核:特征间存在组合关系
  2. 参数优化

    • C:控制惩罚项强度
    • gamma:控制RBF核的复杂度
    • degree:多项式核的次数
  3. 数据预处理

    • 特征缩放
    • 缺失值处理
    • 异常值检测

# 常见问题与解决方案

  1. 训练效率问题

    • 使用线性核加速
    • 减少样本数量
    • 特征选择
  2. 参数选择问题

    • 网格搜索
    • 随机搜索
    • 贝叶斯优化
  3. 多分类问题

    • 一对多策略
    • 一对一策略
    • 决策树结合