支持向量机
寻找最大间隔分类边界,软间隔允许错误,核函数表达非线性。
学习前需要掌握
背景与问题
多个边界都能分开训练点时,SVM 偏好离最近点更远的边界。这个间隔偏好与软间隔错误惩罚共同决定模型,而核方法进一步改变距离空间。
概念定义
支持向量机寻找最大间隔边界,软间隔允许一定违例。支持向量是对边界有约束作用的训练点;核函数以相似度隐式表达非线性特征空间。
直观理解
在两类之间放一条尽量宽的路,同时允许少数难点进入路内,而不是为每个噪声点把路弯得很复杂。
核心原理
线性软间隔目标由权重范数和 hinge 违例惩罚组成。标签常写为 ±1,间隔条件是 y×score 不小于 1。C 越大越重视违例,C 越小则更强地偏向较小权重;这不保证训练准确率总呈严格单调。
RBF 核为 exp(-gamma×距离平方)。gamma 大使单点影响更局部,可能形成复杂边界;gamma 小产生更宽相似范围。尺度直接改变距离,所以 StandardScaler 与 C、gamma 搜索应在同一个交叉验证 Pipeline 内。
SVC 的 decision_function 不是默认校准概率,启用概率估计还带来额外计算与验证问题。核 SVM 大样本训练成本可能高,线性 SVM 或其他基线可能更合适,需连同预测成本和支持向量数量一起比较。
一维最大间隔由最近两点决定
- 负类位置为 -2、-1,正类为 1、2
- 使用线性 SVC,C=1000
四条预测分别为 -1、-1、1、1,支持向量为 -1 和 1。
距离边界更远的 -2 和 2 没有收紧当前间隔,因此不必都成为支持向量。若在间隔附近加入噪声点,软间隔惩罚会参与权衡,不能仍机械套用这个边界。
RBF 情况没有同样简单的原空间直线间隔解释。相隔 2 时,gamma=0.25 的相似度为 exp(-1),gamma=4 则为 exp(-16),可见同样数据在不同核尺度下相似程度差很多。
数学表达
核心表达
左侧为线性二分类 hinge 目标,右侧为 RBF 核;核化改变表示空间,不能把两者混成同一个原空间线性函数。
变量含义
变量定义与本页概念定义一致,代码中的同名变量保持相同语义。
计算步骤
- 1先定义可比较的特征尺度和合法划分。
- 2在线性与核候选中交叉验证 C、gamma 等参数。
- 3核查支持向量、验证误差和训练预测成本。
代码对应位置
示例 1一维最大间隔由最近两点决定的最小验证:使用完整构造输入核对一维最大间隔由最近两点决定,输出只表示本例计算。
计算与实现步骤
- 先定义可比较的特征尺度和合法划分。
- 在线性与核候选中交叉验证 C、gamma 等参数。
- 核查支持向量、验证误差和训练预测成本。
代码实现
示例 1
一维最大间隔由最近两点决定的最小验证
example_01.py用途:使用完整构造输入核对一维最大间隔由最近两点决定,输出只表示本例计算。
import math
import numpy as np
from sklearn.svm import SVC
x = np.array([[-2.], [-1.], [1.], [2.]])
y = np.array([-1, -1, 1, 1])
model = SVC(kernel="linear", C=1000).fit(x, y)
print("support vectors:", model.support_vectors_.flatten().tolist())
print("predictions:", model.predict(x).tolist())
for gamma in [0.25, 4.]:
print(f"gamma={gamma:.2f} similarity_at_distance_2={math.exp(-gamma * 4):.8f}")代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
使用完整构造输入核对一维最大间隔由最近两点决定,输出只表示本例计算。
y- 目标标签或连续目标值。
model- 组合预处理和估计器的模型对象。
Step 1 · 1–10 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import math
import numpy as np
from sklearn.svm import SVC
x = np.array([[-2.], [-1.], [1.], [2.]])
y = np.array([-1, -1, 1, 1])
model = SVC(kernel="linear", C=1000).fit(x, y)
print("support vectors:", model.support_vectors_.flatten().tolist())
print("predictions:", model.predict(x).tolist())
for gamma in [0.25, 4.]:
print(f"gamma={gamma:.2f} similarity_at_distance_2={math.exp(-gamma * 4):.8f}")预期输出或运行结果
support vectors: [-1.0, 1.0] predictions: [-1, -1, 1, 1] gamma=0.25 similarity_at_distance_2=0.36787944 gamma=4.00 similarity_at_distance_2=0.00000011
常见错误 · 3 条
- 未缩放
- C/gamma 都过大
- 无需求却开启 probability
实际应用
- 中小型分类问题的间隔基线
- 比较线性与核表示的效果和成本
常见错误
- 未缩放
- C/gamma 都过大
- 无需求却开启 probability
推荐学习资料
参考库不会生成虚假资源或无效外部链接。