支持向量机(SVM):机器学习中的经典算法

引言

在机器学习的众多算法中,支持向量机(Support Vector Machine, SVM) 是一种经典的监督学习方法,特别适用于二分类问题,并且在高维空间中表现尤为优越。SVM 以其坚实的数学理论、良好的泛化能力以及在小样本学习中的优异表现,成为了广泛应用于文本分类、生物信息学、图像识别等领域的重要工具。

本文将深入探讨支持向量机的原理,介绍其数学基础、训练过程、评估方法,并结合实际案例分析其优缺点和应用场景。希望读者能在阅读后对 SVM 形成全面的认识,并掌握其实际应用的关键技巧。


什么是支持向量机?

基本概念

支持向量机是一种用于分类和回归的监督学习算法,其核心思想是找到一个最优超平面,以最大化数据分类的间隔(Margin)。通俗来说,SVM 在特征空间中寻找一个能够最好地区分不同类别的边界,使得新数据点可以基于其位置被正确分类。

假设我们有一个二分类问题,目标是寻找一个超平面将两类数据分隔开,如下图所示:
在这里插入图片描述

超平面的数学表达式通常是:
w⋅x+b=0 w \cdot x + b = 0 wx+b=0
其中:

  • www 是法向量,决定超平面的方向;
  • bbb 是偏置,决定超平面的位置;
  • xxx 是输入特征向量。

理想情况下,我们希望找到这样一个超平面,使得两类数据点到超平面的间隔最大,这正是 SVM 的核心目标。


支持向量机的数学原理

SVM 的数学原理可以分为线性可分线性不可分两种情况,分别介绍如下。

1. 线性可分情况

在理想情况下,我们可以找到一个超平面,使得所有样本点都能被正确分类。设训练样本为:
{(x1,y1),(x2,y2),...,(xn,yn)} \{(x_1, y_1), (x_2, y_2), ..., (x_n, y_n)\} {(x1,y1),(x2,y2),...,(xn,yn)}
其中:

  • xix_ixi 为特征向量;
  • yi∈{+1,−1}y_i \in \{+1, -1\}yi{+1,1} 为类别标签。

目标是找到超平面参数 w,bw, bw,b 使得所有数据点满足:
yi(w⋅xi+b)≥1,∀i y_i (w \cdot x_i + b) \geq 1, \quad \forall i yi(wxi+b)1,i
从几何上看,支持向量机的目标是最大化分类间隔(Margin),即最大化最小间隔 2∣∣w∣∣\frac{2}{||w||}∣∣w∣∣2,可以通过优化以下凸优化问题求解:
min⁡w,b12∣∣w∣∣2 \min_{w, b} \quad \frac{1}{2} ||w||^2 w,bmin21∣∣w2

s.t.yi(w⋅xi+b)≥1,∀i s.t. \quad y_i (w \cdot x_i + b) \geq 1, \quad \forall i s.t.yi(wxi+b)1,i

该问题可以通过拉格朗日对偶方法进行求解,最终转化为求解以下对偶优化问题:
max⁡α∑i=1nαi−12∑i=1n∑j=1nαiαjyiyjxi⋅xj \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 \cdot x_j αmaxi=1nαi21i=1nj=1nαiαjyiyjxixj

s.t.∑i=1nαiyi=0,αi≥0,∀i s.t. \quad \sum_{i=1}^{n} \alpha_i y_i = 0, \quad \alpha_i \geq 0, \forall i s.t.i=1nαiyi=0,αi0,i

其中,αi\alpha_iαi 为拉格朗日乘子,最终超平面参数由支持向量决定:
w=∑i=1nαiyixi w = \sum_{i=1}^{n} \alpha_i y_i x_i w=i=1nαiyixi

2. 线性不可分情况

在现实问题中,数据往往是线性不可分的
在这里插入图片描述

这时我们引入松弛变量 ξi\xi_iξi 允许一定的分类错误:
yi(w⋅xi+b)≥1−ξi,ξi≥0,∀i y_i (w \cdot x_i + b) \geq 1 - \xi_i, \quad \xi_i \geq 0, \quad \forall i yi(wxi+b)1ξi,ξi0,i
目标函数变为:
minw,b,ξ12∣∣w∣∣2+C∑i=1nξi min_{w, b, \xi} \quad \frac{1}{2} ||w||^2 + C \sum_{i=1}^{n} \xi_i minw,b,ξ21∣∣w2+Ci=1nξi
其中,C 是正则化参数,用于控制误分类点的惩罚程度。

3. 核函数与非线性可分 SVM

对于复杂数据,SVM 采用核方法(Kernel Trick) 将低维数据映射到高维空间,使其在高维空间线性可分。
在这里插入图片描述
常见核函数包括:

  • 线性核K(xi,xj)=xi⋅xjK(x_i, x_j) = x_i \cdot x_jK(xi,xj)=xixj
  • 多项式核K(xi,xj)=(xi⋅xj+c)dK(x_i, x_j) = (x_i \cdot x_j + c)^dK(xi,xj)=(xixj+c)d
  • 高斯核(RBF 核)K(xi,xj)=exp⁡(−γ∣∣xi−xj∣∣2)K(x_i, x_j) = \exp(-\gamma ||x_i - x_j||^2)K(xi,xj)=exp(γ∣∣xixj2)

通过核函数,SVM 在高维特征空间找到最优超平面,实现非线性分类。


如何训练支持向量机模型

训练 SVM 主要包括以下步骤:

  1. 数据预处理:归一化、去除异常值等。
  2. 选择核函数:根据数据特性选择适合的核函数。
  3. 调整超参数:通过交叉验证优化 CC 和核函数参数。
  4. 求解最优化问题:使用 SMO(Sequential Minimal Optimization)算法或梯度下降求解。

代码块

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_curve, auc

# 1. 生成模拟数据集
X, y = make_classification(n_samples=1000, n_features=10, random_state=42)

# 2. 数据集划分(80% 训练集,20% 测试集)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 3. 数据标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 4. 训练 SVM 模型
svm_model = SVC(kernel='rbf', C=1.0, probability=True, random_state=42)  # RBF核
svm_model.fit(X_train, y_train)

# 5. 预测
y_pred = svm_model.predict(X_test)
y_prob = svm_model.predict_proba(X_test)[:, 1]  # 获取正类的概率值

# 6. 计算评估指标
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)

# 7. 绘制 ROC 曲线
fpr, tpr, _ = roc_curve(y_test, y_prob)
roc_auc = auc(fpr, tpr)

plt.figure(figsize=(6, 5))
plt.plot(fpr, tpr, label=f'ROC Curve (AUC = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], 'r--')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('SVM ROC Curve')
plt.legend()
plt.show()

# 8. 输出评估指标
print(f'准确率 (Accuracy): {accuracy:.4f}')
print(f'精确率 (Precision): {precision:.4f}')
print(f'召回率 (Recall): {recall:.4f}')
print(f'F1 分数 (F1-score): {f1:.4f}')
print(f'AUC 值: {roc_auc:.4f}')


支持向量机的评估指标

SVM 主要使用分类指标进行评估,包括:

  • 准确率(Accuracy):衡量模型正确分类的样本占总样本的比例,计算公式为 TP+TNTP+TN+FP+FN\frac{TP + TN}{TP + TN + FP + FN}TP+TN+FP+FNTP+TN
  • 精确率(Precision):衡量模型预测为正类的样本中实际为正类的比例,计算公式为 TPTP+FP\frac{TP}{TP + FP}TP+FPTP
  • 召回率(Recall):衡量实际为正类的样本中被模型正确识别的比例,计算公式为 TPTP+FN\frac{TP}{TP + FN}TP+FNTP
  • F1 分数(F1-score):精确率和召回率的调和平均值,兼顾两者的平衡,计算公式为 2×Precision×RecallPrecision+Recall2 \times \frac{Precision \times Recall}{Precision + Recall}2×Precision+RecallPrecision×Recall
  • ROC 曲线(Receiver Operating Characteristic Curve):反映模型在不同阈值下的分类能力,横轴为假阳率(FPR),纵轴为真正率(TPR)。
  • AUC 值(Area Under Curve):ROC 曲线下的面积,表示模型区分正负类的能力,值越接近 1 代表分类能力越强。

支持向量机的应用场景

SVM 由于其强大的分类能力,被广泛应用于:

  • 文本分类(如垃圾邮件检测)
  • 图像分类(如人脸识别)
  • 生物信息学(如基因分类)
  • 金融预测(如信用评分)

支持向量机的优缺点

优点

✅ 适用于小样本、高维数据
✅ 能够有效处理非线性分类(借助核方法)
✅ 泛化能力强,不易过拟合

缺点

❌ 计算复杂度高,训练速度较慢
❌ 需要选择合适的核函数
❌ 对噪声敏感,尤其是在大规模数据集上


支持向量机的优缺点

优点

✅ 适用于小样本、高维数据
✅ 能够有效处理非线性分类(借助核方法)
✅ 泛化能力强,不易过拟合

缺点

❌ 计算复杂度高,训练速度较慢
❌ 需要选择合适的核函数
❌ 对噪声敏感,尤其是在大规模数据集上


Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐