WARNING
🧪 Beta公测版本提示:教程主体已完成,正在优化细节,欢迎大家提Issue反馈问题或建议。
ml04 支持向量机 (SVM) — exercise.py 练习指南
练习目标
通过补全 Hinge Loss 子梯度、SGD 更新步和 RBF 核矩阵三个模块,从代码层面掌握 SVM 的核心优化。
预备知识
- Hinge Loss:
,子梯度 若 - L2 正则化梯度:
与 的关系: - RBF 核:
任务清单
任务1:实现 Hinge Loss 及其子梯度
- 步骤:
- 计算 margin =
- Hinge Loss =
max(0, 1 - margin) - L2 正则化损失 =
- L2 梯度:
dw = 2 * lambda * w - 若 margin < 1:
dw -= y_i * x_i,db = -y_i - 否则:
db = 0
- 计算 margin =
任务2:实现 SGD 单步更新
- 步骤:
- 打乱数据索引(
np.random.permutation) - 遍历每个样本,调用
hinge_loss_and_gradient获取梯度和损失 - 更新
w -= lr * dw,b -= lr * db - 返回平均损失
- 打乱数据索引(
任务3(Bonus):RBF 核矩阵
- 步骤:
- 计算
sq_X = sum(X^2, axis=1, keepdims=True)得到(m, 1) - 计算
sq_Y = sum(Y^2, axis=1)得到(n,) sq_dists = sq_X + sq_Y - 2*X @ Y.T- 返回
exp(-gamma * max(sq_dists, 0))
- 计算
验证标准
test_hinge_loss():已知参数下的 Hinge Loss 和梯度应精确匹配理论值test_sgd_step():执行一轮 SGD 后损失应下降test_rbf_kernel():相同向量的 RBF 核值为 1,远距离向量核值接近 0
源码位置
clone 后打开(相对仓库根目录):
docs/ml/classic/svm/code/exercise.py