尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

MLAlgorithms SVM支持向量机实现揭秘:线性、多项式与RBF核函数一次讲透

MLAlgorithms SVM支持向量机实现揭秘:线性、多项式与RBF核函数一次讲透 MLAlgorithms SVM支持向量机实现揭秘线性、多项式与RBF核函数一次讲透【免费下载链接】MLAlgorithmsMinimal and clean examples of machine learning algorithms implementations项目地址: https://gitcode.com/gh_mirrors/ml/MLAlgorithmsMLAlgorithms是一个用 Python 从零手写机器学习算法的开源项目其中 SVM支持向量机部分用不到 150 行代码实现了完整的支持向量机分类器并通过简化的 SMO 算法同时支持线性、多项式、RBF高斯核函数是理解 SVM 核函数机制和训练流程的绝佳入门材料。 支持向量机为什么值得从零实现工业界调用sklearn一行代码就能训练 SVM但它的内部到底在做什么MLAlgorithms 给出了一个去优化化的透明版本代码量小、无黑盒每个符号都能对照公式看懂基于简化的 SMOSequential Minimal Optimization序列最小优化算法核函数与分类器解耦换核函数只需换一个类核心源码分布在两个文件模块说明mla/svm/svm.pySVM 分类器主体含 SMO 训练循环mla/svm/kernerls.pyLinear、Poly、RBF 三种核函数examples/svm.py可运行的分类示例SVM 的核心思想一句话概括找到一条分类间隔margin最大的分界线且只由边界上最关键的少数样本支持向量决定。当数据无法线性可分时核函数把数据映射到高维空间让原本缠在一起的类别在高维里变得可分——这就是核技巧Kernel Trick的精髓。 三种核函数逐一拆解所有核函数都在 mla/svm/kernerls.py 中定义每个都实现了给定两个样本返回它们在高维空间的内积。1. 线性核Linear最简单的一刀切class Linear(object): def __call__(self, x, y): return np.dot(x, y.T)线性核就是普通的向量点积K(x, y) x·y等价于在原始特征空间找一条直线/平面分界。它是 SVM 的默认核当不指定核函数时SVM 构造函数 会自动创建Linear()。适用场景特征数量远多于样本数、或数据本身近似线性可分如文本词袋向量。2. 多项式核Poly给数据升维class Poly(object): def __init__(self, degree2): self.degree degree def __call__(self, x, y): return np.dot(x, y.T) ** self.degree多项式核K(x, y) (x·y)^degree默认阶数degree2。它相当于把特征空间扩展到了包含特征两两乘积的项能拟合曲线形的决策边界。阶数越高边界越弯曲但也更容易过拟合——调节degree相当于调节模型复杂度。3. RBF 核RBF最通用的万能核class RBF(object): def __init__(self, gamma0.1): self.gamma gamma def __call__(self, x, y): x np.atleast_2d(x) y np.atleast_2d(y) return np.exp(-self.gamma * dist.cdist(x, y) ** 2).flatten()RBF径向基/高斯核$$K(x, y) \exp(-\gamma |x - y|^2)$$它衡量的是两个样本的相似度距离越近越接近 1距离越远越接近 0。理论上 RBF 可以拟合任意复杂的边界是实际应用中最常用的核。关键超参数gamma代码默认 0.1gamma 取值效果太大每个点只影响自己附近极小的区域 → 决策边界锯齿化易过拟合太小影响范围过宽边界过于平滑可能欠拟合适中平滑且贴合数据结构的曲线边界 三个核函数是复杂度阶梯线性 低阶多项式 RBF。实际调参时通常先用线性核不够好再升级到 RBF 并搜索 gamma。⚙️ 训练内幕简化 SMO 是如何工作的SVM 的训练本质是求解一个带约束的二次规划问题直接求解太昂贵所以 SMO 算法把它拆成每次只优化两个拉格朗日系数 α 的子问题循环迭代直到收敛。mla/svm/svm.py 中 _train 方法完整复刻了这个流程预计算核矩阵fit 方法 先算出所有样本两两之间的核值 K之后整个训练不再触碰原始特征——这是核技巧在代码层面的体现成对优化 α对每一对样本 (i, j)利用 K 矩阵中的三个值算出步长系数 η按梯度方向更新 α 并用 clip 函数 截断到合法区间 [L, H]区间由 _find_bounds 根据类别关系求出更新偏置 b根据更新后 α 是否落在 (0, C) 开区间内选择用 b1、b2 还是二者均值作为新的偏置收敛判断本轮所有 α 的更新量范数小于tol即停止。构造函数暴露了四个直观超参数见 SVM.initC松弛系数控制容忍误分类的程度。C 越大对误分类惩罚越重边界越贴合训练集易过拟合kernel核函数对象缺省为线性核tol收敛容差默认1e-3max_iter最大迭代轮数默认 100示例中提高到 500 以保证收敛。训练结束后alpha 0 的样本 就是支持向量——其余样本对模型贡献为零。预测函数 也只与支持向量做核计算对新样本求加权和Σ αᵢyᵢK(支持向量ᵢ, x) b再取符号即可分类。这正是 SVM 稀疏特性的由来。 五分钟跑通示例与测试项目自带的示例 examples/svm.py 展示了完整用法生成 1200 个二维分类样本 → 标签映射到 {-1, 1} → 8:2 切分 → 分别用 RBF 与线性核训练并输出准确率for kernel in [RBF(gamma0.1), Linear()]: model SVM(max_iter500, kernelkernel, C0.6) model.fit(X_train, y_train) predictions model.predict(X_test)在仓库根目录执行python -m examples.svm即可运行需先安装 requirements.txt 中的 scipy、numpy、scikit-learn 依赖。SVM 的精度回归测试位于 mla/tests/test_classification_accuracy.py其中test_svm_classification验证了 RBF 核模型在留出集上的 AUC 表现可作为你修改实现后的自检基准。另外注意 BaseEstimator 提供了统一的fit/predict接口和输入校验SVM 继承它所以接口风格与 scikit-learn 一致学完这套代码迁移到生产库几乎零成本。✅ 总结如何挑选核函数与参数你的情况建议数据线性可分或特征很多线性核快且稳边界明显是曲线/圆弧多项式核从degree2起步未知分布、通用场景RBF 核配合网格搜索gamma分类错误代价高调大C收紧边界过拟合迹象调小CRBF 则调小gamma、降低 degreeMLAlgorithms 的 SVM 实现值得逐行精读svm.py 约 140 行讲透了核矩阵 SMO 迭代 支持向量稀疏化三件套kernerls.py 用三个小类讲透了线性、多项式与 RBF 核函数的数学本质。对照公式读代码支持向量机将从黑盒变成白盒。【免费下载链接】MLAlgorithmsMinimal and clean examples of machine learning algorithms implementations项目地址: https://gitcode.com/gh_mirrors/ml/MLAlgorithms创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表