自学教程 学编程从这里开始

支持向量机

支持向量机(SVM,Support Vector Machine)是一种监督学习算法,主要用于分类任务,也可扩展到回归(SVR)。它的核心目标是寻找最优分隔超平面,让不同类别样本之间的间隔最大。

1. 基本原理

在样本空间中,分隔两类样本的决策边界称为超平面。
超平面公式:

wTx+b=0w^Tx + b = 0

  • ww:权重向量,决定超平面方向
  • bb:偏置,决定超平面位置

间隔:样本点到超平面的距离。SVM 追求最大间隔,离超平面最近的样本点叫做支持向量,整个模型只由这些点决定。

线性可分 SVM

样本可以被一条直线(二维)/平面(高维)完全分开,目标:最大化间隔。

软间隔 SVM

现实数据大多不是完全线性可分,允许少量样本错分,引入惩罚系数 CC:

  • CC 越大:越不能容忍错分,容易过拟合
  • CC 越小:允许更多错分,追求更大间隔,泛化更好

核函数 Kernel

当数据线性不可分,SVM 通过核函数把低维数据映射到高维空间,在高维空间里寻找可分超平面,不需要显式计算高维特征。
常用核函数:

  • 线性核:linear
  • 多项式核:poly
  • 高斯核(RBF径向基核):rbf,最常用

2. SVM 回归(SVR)

和分类SVM思路相反:设置一个ε间隔带,落在间隔带内的样本都认为预测正确,目标让样本尽量落在间隔带里面。

3. 优缺点

✅ 优点

  • 小样本数据集上表现优秀
  • 核技巧可以处理非线性问题
  • 优化目标是全局最优,不容易陷入局部最优
  • 泛化能力强,适合高维数据

❌ 缺点

  • 样本量大时训练速度很慢
  • 对参数、核函数选择敏感
  • 原生是二分类,做多分类需要组合策略
  • 可解释性弱,相比决策树很难理解规则

4. Python 代码示例

import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import SVC
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 字体配置,解决 DejaVu Sans 中文缺失警告
plt.rcParams['font.sans-serif'] = ['SimHei', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False

# 生成二分类数据集
np.random.seed(42)
X, y = make_classification(n_samples=100, n_features=2, n_informative=2, n_redundant=0, random_state=42)

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

# 构建SVM模型,RBF高斯核
model = SVC(kernel='rbf', C=1.0, gamma='scale')
model.fit(X_train, y_train)

# 预测评估
y_pred = model.predict(X_test)
acc = accuracy_score(y_test, y_pred)
print(f"测试集准确率:{acc:.2f}")

# 绘制决策边界
def plot_decision_boundary(clf, 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.linspace(x_min, x_max, 100), np.linspace(y_min, y_max, 100))
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    plt.contourf(xx, yy, Z, alpha=0.3, cmap='coolwarm')
    plt.scatter(X[:,0], X[:,1], c=y, cmap='coolwarm')
    plt.xlabel("x1")
    plt.ylabel("x2")

plot_decision_boundary(model, X_train, y_train)
plt.title("SVM 决策边界")
plt.show()

结果:

5. 适用场景

  • 中小规模、高维特征数据(文本分类、图像小样本识别)
  • 非线性分类任务
  • 对泛化能力要求较高、样本不多的场景

6. 常见误区

  1. SVM 天然适合大数据:样本上万之后训练速度会显著下降
  2. RBF核一定比线性核好:特征维度很高时,线性核往往足够
  3. CC 越大越好:C过高会强行拟合噪声,造成过拟合

思考题

  1. 什么是支持向量?去掉其他样本,只保留支持向量训练,结果会变吗?
  2. 核函数的作用是什么?为什么核技巧可以避免直接构造高维特征?

0 条笔记