1. 为什么支持向量机被称为"寻找最宽的街道"?
我第一次接触支持向量机(SVM)时,对这个"最宽街道"的比喻感到非常困惑。直到真正用它解决了一个分类问题后,才明白这个形象的描述背后蕴含的深刻数学原理。
想象你在城市中规划一条街道,需要将两种不同类型的建筑物(比如住宅和商铺)分隔开来。这条街道越宽,未来新建筑物分类时就越不容易出错。SVM的核心思想正是如此——它试图在特征空间中找到那个能将不同类别数据点分开的"最宽街道"(专业术语称为"最大间隔超平面")。
关键理解:这里的"街道宽度"实际上是决策边界到最近数据点的距离,SVM通过最大化这个距离来提高模型的泛化能力。
1.1 从几何视角理解SVM
传统分类器(如逻辑回归)只关心如何画一条线把数据分开,而SVM追求的是找到那条能让两个类别都"最舒服"的分界线。具体来说:
- 支持向量:距离决策边界最近的那些数据点,它们就像"街道边缘的建筑物",决定了街道的宽度
- 间隔边界:平行于决策边界的两条边界线,它们与决策边界的距离就是街道宽度的一半
- 硬间隔与软间隔:
- 硬间隔:严格要求所有数据点都必须正确分类且位于间隔边界之外
- 软间隔:允许一些数据点违反间隔规则(使用松弛变量),提高模型对噪声的鲁棒性
python复制# 一个简单的二维可视化示例
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
# 创建40个可线性分隔的点
np.random.seed(0)
X = np.r_[np.random.randn(20, 2) - [2, 2], np.random.randn(20, 2) + [2, 2]]
y = [0] * 20 + [1] * 20
# 训练SVM分类器
clf = svm.SVC(kernel='linear')
clf.fit(X, y)
# 绘制决策边界和支持向量
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired)
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
# 创建网格来评估模型
xx = np.linspace(xlim[0], xlim[1], 30)
yy = np.linspace(ylim[0], ylim[1], 30)
YY, XX = np.meshgrid(yy, xx)
xy = np.vstack([XX.ravel(), YY.ravel()]).T
Z = clf.decision_function(xy).reshape(XX.shape)
# 绘制决策边界和间隔
ax.contour(XX, YY, Z, colors='k', levels=[-1, 0, 1],
alpha=0.5, linestyles=['--', '-', '--'])
ax.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1],
s=100, linewidth=1, facecolors='none', edgecolors='k')
plt.show()
这段代码生成的图像会清晰展示:
- 实线:决策边界(街道中心线)
- 虚线:间隔边界(街道边
