资讯动态

ML:支持向量机的基本原理与实现

发布时间:2026/8/24 0:07:47 来源:尧图企业网站定制
在机器学习中并不是所有分类或回归模型都通过“尽量拟合全部样本”来建立决策规则。有一类方法的关注点更集中它试图找到一个能够把不同类别尽量分开的边界并且希望这个边界不仅能分开训练样本还能对新样本保持较好的泛化能力。支持向量机Support Vector MachineSVM正是这种思想的典型代表。一、支持向量机的基本思想支持向量机SVM的核心思想是寻找一个能够把样本分开的边界并让这个边界到两侧最近样本的距离尽可能大。如果先看最简单的二分类情形假设两类样本在特征空间中可以被一条直线、一个平面或更高维超平面分开那么支持向量机不会只满足于“把它们分开”而是进一步要求在所有可分开的边界中选择那个间隔最大的边界。这里的“间隔”可以理解为边界到两侧最近样本的距离。距离这个边界最近、并真正决定边界位置的那些样本就叫作“支持向量”Support Vector。从机器学习视角看支持向量机完成的是这样一件事• 输入一组特征• 输出类别标签或连续数值• 目标找到一个具有良好泛化能力的边界或函数• 关键边界由少数关键样本决定而不是平均依赖所有样本这说明支持向量机并不是简单地“拟合所有样本”而是在寻找一个对新数据也更稳健的决策规则。图 1支持向量机的基本工作流程二、线性可分情形下的数学表达1、分类超平面在线性分类问题中支持向量机首先考虑一个线性决策函数其中• x 表示输入特征向量•ᵀ表示 w 的转置与 x 的内积• b 表示截距• f(x) 的符号决定样本位于边界哪一侧对应的分类规则可以写成这说明支持向量机在最基础情形下本质上仍然是一个线性分类器。2、分类间隔支持向量机与一般线性分类器的关键区别不在于“是否有一个线性边界”而在于它追求的是最大间隔分类。图 2支持向量机的最大间隔分类若训练样本标签为yᵢ ∈ {−1, 1}则线性可分约束可以写成在这一约束下分类间隔与‖w‖成反比。于是“最大化间隔”就等价于“让‖w‖尽可能小”从而通常写成如下优化问题这就是硬间隔支持向量机的基本思想在正确分类的前提下让边界尽量远离两类样本。3、为什么支持向量重要在最大间隔边界确定之后并不是所有样本都会同等影响最终结果。真正决定边界位置的是那些离边界最近的样本。这些样本之所以重要是因为如果移动它们边界通常会明显改变而远离边界的样本即使略有移动对边界影响也往往不大。这正是“支持向量”这个名字的含义它们是“支撑”最终边界的关键样本。三、软间隔思想与参数 C1、现实数据通常并不完全可分在实际任务中数据很少像教科书上的理想样本那样完全线性可分。如果硬性要求“所有样本都必须被完全正确分类”模型往往会为了照顾个别异常样本而把边界调整得过于极端反而损害泛化能力。因此支持向量机通常采用软间隔思想允许少量样本违反间隔约束但要为这种违反付出代价。2、软间隔优化目标为此可以引入松弛变量ξᵢ把优化问题写成并满足这里•对应“希望间隔大”•对应“允许违例但要惩罚”•控制这两部分之间的权衡3、C 的作用参数 C 是支持向量机中最关键的超参数之一。图 3软间隔支持向量机与参数 C从直观上看• C 较大模型更重视把训练样本分对边界会更努力贴近训练数据• C 较小模型更重视边界平滑与间隔稳定允许一定分类错误因此C 并不是越大越好也不是越小越好而是需要在训练拟合与泛化能力之间做平衡。Scikit-learn 也把 C 作为典型的需要调优的超参数之一。在 Scikit-learn 中C 是误差项的正则化参数且其强度与 C 成反比C 越大正则化越弱C 越小正则化越强。四、核函数与非线性支持向量机1、为什么需要核函数如果数据在原始特征空间中不是线性可分的那么单纯依靠一个线性超平面往往无法得到理想效果。这时一个自然想法是能否把原始数据映射到一个更高维的空间在那里再做线性分类图 4核函数支持的非线性分类思路支持向量机的一个强大之处就在于它可以借助核函数kernel function在不显式展开高维特征的前提下间接完成这种映射。2、常见核函数在 Scikit-learn 中SVC 用于分类SVR 用于回归。SVC 和 SVR 都支持多种核函数常见选项包括• linear• poly• rbf• sigmoid• precomputed其中• linear线性核对应普通线性边界• poly多项式核可表示更复杂的曲线关系• rbf径向基核也称“高斯核”最常用也最灵活• sigmoid形态类似神经网络中的某些激活方式SVC 与 SVR 默认都使用 rbf 核。3、gamma 的作用在 RBF 核支持向量机中gamma 是另一个关键参数。Scikit-learn 中的 gamma 可以被理解为“单个训练样本影响范围的倒数”。gamma 越低影响范围越远gamma 越高影响范围越近。从直观上看• gamma 较小决策边界更平滑、影响范围更大• gamma 较大决策边界更局部、更容易贴合训练样本细节因此gamma 与 C 一样也会显著影响模型复杂度。RBF SVM 的实际效果常常依赖 C 与 gamma 的联合作用。五、支持向量回归的基本思想1、SVM 不只用于分类支持向量机并不只用于分类它也可以用于回归。在 Scikit-learn 中对应的方法通常叫作支持向量回归Support Vector RegressionSVR。2、ε-不敏感损失思想SVR 的一个核心思想是不要求模型对每个样本都严格拟合而是允许预测值与真实值之间存在一个宽度为 ε 的“容忍带”。只要误差落在这条带内部就不进行惩罚只有超出这条带的部分才被当作损失。图 5支持向量回归SVR的 ε-不敏感区间这常被称为“ε-不敏感损失”epsilon-insensitive loss。从直观上看• ε 越大模型对误差更宽容• ε 越小模型要求更精细地贴近目标值这说明SVR 关注的不只是“拟合得有多近”还关心“哪些误差可以忽略、哪些误差必须处理”。3、SVR 中的主要参数在 Scikit-learn 的 SVR 中关键参数包括• C控制误差惩罚强度• epsilon控制不敏感区间宽度• kernel控制使用何种核函数• gamma在 rbf、poly、sigmoid 等核下控制局部影响范围SVR 同样基于 libsvm 实现并且训练复杂度随样本数增长较快当样本非常多时可考虑 LinearSVR 或 SGDRegressor。六、模型结果如何解释1、分类中的解释在分类任务中SVM 的预测并不是直接输出“哪一个特征贡献最大”的简单结论而是判断样本位于边界哪一侧。对于线性 SVM可以通过法向量 w 理解决策边界方向对于核 SVM则更适合从“哪些支持向量在支撑边界”来理解模型。Scikit-learn 的决策函数只依赖训练点中的一个子集也就是支持向量。2、回归中的解释在 SVR 中最终预测函数由支持向量决定。直观上可以理解为• 大部分“普通样本”不会直接决定最终回归函数• 真正关键的是那些位于 ε 管道边界附近或超出容忍带的样本因此SVR 的解释性也更多体现在“哪些样本成为支持向量”而不是一组像线性回归那样直观的全局系数。3、解释性与核函数有关如果使用线性核模型解释会更接近普通线性模型如果使用 RBF、poly 等非线性核模型表达能力更强但全局解释性会下降。这也是支持向量机在实践中的一个典型特点边界越灵活通常越难用简单全局规则来解释。七、Python 实现支持向量分类示例下面用一个简洁的二分类示例说明支持向量分类的基本使用方式。Scikit-learn 的 SVC 是 C-Support Vector Classification 的实现默认核函数为 rbf。# 导入所需模块from sklearn.datasets import make_classification # 生成模拟分类数据集的函数from sklearn.model_selection import train_test_split # 划分训练集和测试集from sklearn.svm import SVC # 支持向量机分类器 # 1. 生成二分类数据# make_classification 创建一个用于二分类默认或多元分类的随机数据集# 参数解释# n_samples200: 生成200个样本# n_features2: 每个样本有2个特征便于在二维平面上可视化# n_informative2: 2个特征都是信息丰富的与分类相关没有冗余特征# n_redundant0: 没有冗余特征由信息特征线性组合生成# n_clusters_per_class1: 每个类别的样本聚集在1个簇中使数据线性可分或近似可分# random_state42: 随机种子保证每次生成的数据相同便于复现X, y make_classification( n_samples200, n_features2, n_informative2, n_redundant0, n_clusters_per_class1, random_state42) # 2. 划分训练集与测试集# train_test_split 将数据集随机划分为训练集和测试集# test_size0.2: 测试集占总数据的20%40个样本训练集占80%160个样本# random_state42: 固定划分方式确保结果可复现X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42) # 3. 创建支持向量分类器# SVCSupport Vector Classifier是支持向量机用于分类的实现# 参数解释# kernelrbf: 使用径向基函数Radial Basis Function作为核函数可将数据映射到高维空间处理非线性问题# 常用核函数还有 linear线性、poly多项式、sigmoid 等# C1.0: 正则化参数控制对误分类的惩罚程度。C 越大对训练样本分类要求越严格可能过拟合C 越小分类边界越平滑可能欠拟合# gammascale: 核函数系数影响单个训练样本的影响范围。scale 使用 1/(n_features * X.var()) 作为默认值# 也可使用 auto1/n_features。gamma 越大支持向量影响范围越小决策边界越复杂model SVC( kernelrbf, C1.0, gammascale) # 4. 训练模型# fit 方法基于训练集学习支持向量机寻找最大化分类间隔的超平面或在高维空间中并确定支持向量model.fit(X_train, y_train) # 5. 预测# predict 方法根据学习到的决策函数对测试集每个样本进行分类返回预测类别0或1y_pred model.predict(X_test) # 输出前10个预测结果直观查看模型预测的类别print(前 10 个预测结果, y_pred[:10]) # score 方法返回测试集上的分类准确率预测正确的样本数 / 总样本数print(测试集得分, model.score(X_test, y_test)) # n_support_ 属性返回每个类别的支持向量数量是一个数组如 [n_support_class0, n_support_class1]# 支持向量是距离决策边界最近的那些训练样本它们决定了最终的决策边界print(支持向量个数, model.n_support_)此代码展示了支持向量分类的基本工作流1、生成或加载数据2、划分训练集与测试集3、创建 SVC 模型4、用 fit 训练模型5、用 predict 输出分类结果6、查看 n_support_ 了解各类别中的支持向量数量n_support_ 是 SVC 提供的属性用于返回每个类别中的支持向量个数。SVC 若设置 probabilityTrue还可以输出类别概率但训练会更慢。八、Python 实现支持向量回归示例下面再给出一个一维回归示例说明支持向量回归如何通过核函数与 ε-不敏感损失来拟合非线性趋势。import numpy as npfrom sklearn.model_selection import train_test_split # 数据集划分函数from sklearn.svm import SVR # 支持向量回归器 # 1. 构造一维非线性数据rng np.random.RandomState(42) # 创建随机数生成器固定种子42保证噪声可复现X np.linspace(-3, 3, 120).reshape(-1, 1) # 生成120个在[-3, 3]上均匀分布的点并转换为列向量特征# y sin(x) 噪声模拟非线性回归问题# np.sin(X[:, 0])计算每个x的正弦值X是二维数组取第一列# 0.3 * rng.normal(size120)添加均值为0、标准差为0.3的高斯噪声使数据更真实y np.sin(X[:, 0]) 0.3 * rng.normal(size120) # 2. 划分训练集与测试集# test_size0.2测试集占20%24个样本训练集占80%96个样本# random_state42固定随机划分方式便于结果复现X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42) # 3. 创建支持向量回归模型# SVRSupport Vector Regression是支持向量机用于回归的实现# 参数解释# kernelrbf使用径向基函数RBF作为核函数可将数据映射到高维空间处理非线性关系# C1.0正则化参数控制对误差的惩罚程度。C越大对训练样本的误差容忍度越小可能过拟合C越小回归曲线越平坦# epsilon0.1定义不敏感损失函数的宽度即模型允许的预测误差范围。在epsilon带内的点不计算损失带外的点才产生惩罚# gammascale核函数的系数影响单个训练样本的影响范围。scale 使用 1/(n_features * X.var()) 作为默认值# gamma越大支持向量影响范围越小决策边界越复杂model SVR( kernelrbf, C1.0, epsilon0.1, gammascale) # 4. 训练模型# fit 方法基于训练集学习支持向量回归寻找一个通过核函数映射后的回归函数使得在epsilon不敏感损失下误差最小化model.fit(X_train, y_train) # 5. 预测# predict 方法对测试集每个样本进行预测返回连续数值y_pred model.predict(X_test) # 打印前5个样本的真实值与预测值保留3位小数直观对比回归效果for i in range(5): print(f真实值: {y_test[i]:.3f} 预测值: {y_pred[i]:.3f})此代码展示了 SVR 的基本使用流程1、构造或加载数据2、划分训练集与测试集3、创建 SVR 模型4、用 fit 训练5、用 predict 输出连续预测值SVR 的默认核也是 rbf关键参数包括 C 与 epsilon。九、支持向量机的适用场景与主要局限1、适用场景支持向量机较适合以下情况• 样本量不是特别大• 特征维度较高• 需要一个边界较稳健的分类器• 希望借助核函数处理非线性结构• 数据中存在清晰的分类间隔或局部结构SVM 在高维空间中通常有效即使特征数大于样本数时也仍然可能表现良好。2、主要局限支持向量机虽然强大但也并不是万能方法。1训练复杂度较高SVC 与 SVR 的拟合时间至少呈二次增长当样本达到数万级时训练可能变得不实用。2参数敏感C、gamma、epsilon、kernel 的选择会显著影响结果因此通常需要调参。3对特征尺度较敏感尤其在距离与核函数相关的设置下不同特征量纲差异较大时常需先标准化。4大规模数据上的概率输出成本更高SVC(probabilityTrue) 会显著增加训练开销5非线性核的全局解释性较弱边界虽然灵活但更难用简单公式概括。 小结支持向量机通过最大间隔思想与支持向量机制建立分类或回归模型并可借助核函数处理非线性问题。它是理解间隔、核方法与正则化权衡的重要入口。“点赞有美意赞赏是鼓励”

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价