参数设置
重置
数据集由固定 seed=42 的 LCG 生成(确定性)。类 +1 中心 (2,2),类 -1 中心 (-2,-2),各 20 点,σ=1.0。
2D分类与最大间隔超平面
蓝点=类+1 / 红叉=类-1 / 绿实线=分离直线 w·x+b=0 / 绿虚线=间隔边界 w·x+b=±1 / 黑圈=支持向量
理论与主要公式
软间隔线性SVM通过最小化合页损失与L2正则化之和,学习最大间隔分离超平面。
决策函数。w 为权重向量,b 为偏置:
$$f(\mathbf{x}) = \mathbf{w}\cdot\mathbf{x} + b$$
目标函数。第1项最大化间隔,第2项为合页损失,C 为正则化参数:
$$J(\mathbf{w},b) = \tfrac{1}{2}\|\mathbf{w}\|^2 + C\sum_{i=1}^{N}\max\bigl(0,\,1 - y_i\,f(\mathbf{x}_i)\bigr)$$
次梯度(仅违反间隔的点 $1 - y_i f(\mathbf{x}_i) > 0$ 有贡献):
$$\frac{\partial J}{\partial \mathbf{w}} = \mathbf{w} - C\sum_{i\in\mathcal{V}} y_i\,\mathbf{x}_i,\quad \frac{\partial J}{\partial b} = -C\sum_{i\in\mathcal{V}} y_i$$
间隔宽度为 $2/\|\mathbf{w}\|$。支持向量是 $|y_i f(\mathbf{x}_i) - 1|$ 较小的点(位于间隔边界上或内侧)。
什么是线性SVM模拟器
🎓
简单说,它是一种「尽可能留出余地」地分开两类数据的算法,画一条直线(高维就是超平面)。在上方模拟器里,它正在学习分隔蓝点与红叉的绿色直线。要点不是只把它们分开,而是选出两侧最近点之间距离(间隔)最大的那条线。这就是「最大间隔分类器」的由来。
🎓
那是间隔边界,方程为 $w\cdot x + b = \pm 1$,这条带的宽度 $2/\|w\|$ 就是间隔宽度。SVM 一边尽量加宽这条带,一边正确分类训练点。把「正则化参数 C」从 1 调到 100 试试。C 越大,对误分类的惩罚越重,间隔带就会变窄,更激进地拟合每个点。
🙋
「支持向量」卡片显示了一个数字。是被黑圈圈住的点吗?
🎓
没错。位于间隔边界上或内侧的点就是支持向量。SVM 有趣的地方在于,最终决策边界完全由这些支持向量决定。间隔外侧的「容易点」无论再加多少都不会改变边界。这就是「支持向量=决策的支柱」这一命名的由来。
🙋
移动「数据噪声」滑块时,蓝点和红叉开始混在一起,间隔反而变宽了,感觉和直觉相反。
🎓
观察得很好。当数据重叠变大,间隔边界内会进入很多点。软间隔 SVM 通过合页损失「容忍」这种情况,并用 C 决定惩罚的轻重。C 小则「保留较宽的间隔,容许一些违反」,C 大则「尽量不容许违反,宁可缩小间隔也要正确分类」。实务中通常通过交叉验证来选 C。
常见问题
把学习率 η 调大会发生什么?
次梯度下降每一步前进的距离会变大。太小则收敛慢,太大则 w 与 b 会振荡甚至发散。本工具中 0.01 左右是稳定值。把 η 提高到 0.5,特别是 C 也很大时,目标函数会明显振荡,训练准确率可能会暂时下降。这是体会优化数值稳定性的好练习。
为什么有时准确率不到 100%?
主要有三个原因。第一,噪声过大导致数据线性不可分。第二,C 过小,对误分类的惩罚太轻,模型故意「容忍」一些误分类。第三,迭代次数过少,尚未收敛。在噪声 0、C=1、η=0.01、迭代 500 时,本工具的初始数据可达到 100%。
如何处理线性不可分的数据?
有三个选项。第一,增加特征以使数据在更丰富的空间中线性可分(例如添加 x1²、x1·x2 等多项式特征)。第二,使用核 SVM(RBF、多项式、Sigmoid 等)。第三,使用软间隔,接受一定的误分类,优先考虑鲁棒性。实际数据中通常组合第二和第三种方法。
SVM 和逻辑回归有什么区别?
两者都是线性分类器,但损失函数不同。SVM 使用合页损失,对位于间隔外的正确分类点损失为零。逻辑回归使用交叉熵损失,对所有点都有非零梯度。结果上,SVM 给出仅由支持向量决定的「稀疏解」,逻辑回归给出带概率输出的平滑解。需要概率时选逻辑回归,看重间隔时选 SVM。
实际应用
文本分类与垃圾邮件过滤: SVM 是 2000 年代标准的文本分类器。把文档表示为词频向量(TF-IDF),用线性 SVM 进行垃圾邮件判定或主题分类。SVM 在高维稀疏向量上的优势非常适合文本数据,词表往往达到数万维。如今它仍是简单文本分类的强大基线。
图像分类与生物信息学: HOG 特征 + 线性 SVM 的人体检测(Dalal & Triggs, 2005)是深度学习之前图像识别的事实标准方法。在生物信息学中,核 SVM 被广泛用于基因表达数据和蛋白质结构的分类。SVM 擅长「样本数小、特征数大」的场景。
异常检测(One-Class SVM): One-Class SVM 仅从正常数据学习「正常区域」的边界,把偏离的点判定为异常。被用于生产线缺陷检测、传感器异常检测、网络入侵检测等。对极端类别不平衡很鲁棒,且不需要带标签的异常样本,这是其实际优势。
机器学习的教学与基础理论: SVM 把间隔最大化、对偶化、核方法、凸优化、结构风险最小化等现代机器学习的主要概念都集成在一起。即便在深度学习已成为主流的今天,作为系统学习机器学习的重要「框架」,它在大学和实务培训中仍多被列为必修。
常见误解与注意事项
最常见的误解是认为「C 越大性能越好」 。C 是合页损失的权重,调大可使训练数据拟合更紧,但过拟合风险也会上升。反之 C 越小间隔越宽,泛化性能上升但训练准确率下降。在模拟器里把 C 从 0.01 调到 100,可以看到间隔宽度连续变化。实务中铁则是通过交叉验证对 C 做网格搜索。最佳 C 因数据集而完全不同。
其次常见的错误是把「次梯度下降误以为是 SVM 的标准解法」 。本工具出于教学目的优先实现简单性,但实务的 SVM 标准是用 SMO(Sequential Minimal Optimization)求解对偶问题(如 LIBSVM、scikit-learn、Vowpal Wabbit 等)。次梯度法用于大规模在线学习(Pegasos),但在收敛速度和数值稳定性上不如对偶法。本工具只是体验「合页损失与最大间隔的关系」的装置。
最后请注意误以为「SVM 对尺度不敏感」 。其实线性 SVM 对特征尺度非常敏感。如果直接喂入 x1 在 [0,1]、x2 在 [0,10000] 的数据,x2 的大尺度会让 w2 极小,x1 的贡献几乎被忽略。本工具用同尺度的 2D 数据所以问题没有显现,但对实际数据,标准化(StandardScaler)或归一化是铁则。忘了这一步,调 C 也往往毫无意义。