【机器学习】SVM 支持向量机


1、支持向量机算法

1.1 支持向量机算法的基本思想

       支持向量机(Support Vector Machine,简称SVM)是一种常见的机器学习算法,其基本思想是在高维空间中构建一个超平面,用于分类或回归任务。
       具体而言,SVM首先将数据映射到高维空间,并在该空间中找到一个最优的超平面,使得该超平面能够将不同类别的数据点有效地分开。其中,对于最优超平面的定义是使得间隔最大化,即离超平面最近的数据点到超平面的距离最大化。这些最靠近超平面的样本点被称为支持向量。
       SVM最终分类的过程是将新的数据点映射到高维空间,并根据其位置与最优超平面的关系来进行分类。如果新数据点在超平面正侧,则属于正类;反之则属于负类。


1.2 支持向量机算法的基本思想

       支持向量机算法的分类过程主要包括以下几个步骤:

  1. 数据预处理:对原始数据进行特征提取和特征选择,将数据转化为合适的形式。
  2. 特征映射:将原始的特征空间通过某个映射函数映射到高维特征空间,使得数据在该空间中线性可分。
  3. 最优超平面的选择:在高维特征空间中寻找一个最优的超平面来将不同类别的样本点分开。其中最优超平面满足:离超平面最近的样本点到超平面的距离最大化。
  4. 支持向量的确定:确定最优超平面上的支持向量,即距离超平面最近的数据点。
  5. 分类:将新的样本点投影到高维特征空间中,并根据其位置(在最优超平面的哪一侧)和超平面来进行分类,即按照所在的类别标签进行打标。
           具体而言,在分类过程中,我们使用 SVM 学习得到的最优超平面对新样本进行分类。首先将新样本映射到高维特征空间中。然后,计算测试样本与最优超平面之间的距离(距离的计算是以超平面上的支持向量计算的)。如果该距离小于某个预设阈值,则将该测试样本分类为正类;否则,将该测试样本分类为负类。这个预设阈值就是 SVM 的决策边界(discriminative boundary)所对应的距离(或称为"裕度",margin)。因此 SVM 对新样本的分类结果取决于它与决策边界(即分离超平面)之间的距离。
           总之,SVM 通过特征映射和最优超平面的选择,将不同类别的样本点分开,并在测试时,通过计算距离来对新的样本点进行分类。超平面实现分类效果、以及各个参数之间关系可参考下图。

在这里插入图片描述


1.3 支持向量机算法的模型构建过程

       SVM(Support Vector Machine)的模型构建流程通常包括以下步骤:

  1. 数据收集与预处理:收集相关数据并进行数据清洗、变换、标准化等预处理工作,以保证数据质量和可用性。
  2. 特征选择与提取:选择合适的特征变量作为模型输入,或者从现有特征中提取新的特征变量。特征选择和提取是 SVM 模型中非常关键的一环,它们往往对最终模型的表现产生重要影响。
  3. 训练数据集划分:将收集到的数据划分为训练数据集和测试数据集,以便在训练过程中验证模型的准确性和性能。
  4. 核函数和参数选择:选择合适的核函数和参数,这决定了 SVM 在特征空间中寻找决策边界的能力。常用的核函数有线性核、多项式核、高斯径向基核等,不同的核函数及其参数设定会影响模型的分类性能。
  5. SVM 模型训练:使用训练数据集进行模型训练,求解最优解,即找到合适的超平面和分类边界,使得两类样本之间的距离最大化,并且满足一定约束条件。
  6. 模型评估:使用测试数据集对模型进行性能评估,包括计算模型的准确率、召回率、F1 值等指标,以判断模型效果的好坏。
  7. 模型的调优和改进:根据评估结果,对模型进行调优和改进,包括优化模型参数、特征选择和提取方法等方面,以提高模型的泛化能力和分类性能。
  8. 模型应用:将优化后的 SVM 模型应用于实际问题中,进行样本分类和预测,以实现数据分析和决策支持等功能。图二展示了其中一个训练模型,图三则展示出常见的核函数。
    在这里插入图片描述
    在这里插入图片描述

2、使用Python语言编写支持向量机的源程序代码并分析

2.1 支持向量机SVM模型代码

2.1.1 计算SVM中使用的核函数calcKernelValue()

       用于计算核函数值的函数,其实现了线性核和径向基函数(RBF)核。该函数通过循环逐个计算每个样本与待测样本之间的核函数值,并将结果存储在一个数组中返回。这些核函数值将在后续步骤中用于计算支持向量机模型的决策边界和预测结果。

  1. 首先获取了输入矩阵 matrix_x 的总行数,即数据集中的样本数目 numSamples。
  2. 如果 kernelType 为 ‘linear’,那么就使用线性核函数计算 kernelValue,这里直接使用矩阵乘法计算所有训练样本与待计算样本的内积;
  3. 如果 kernelType 为 ‘rbf’,那么就使用径向基函数(RBF)核计算 kernelValue,这里计算每个训练样本与待计算样本之间的欧氏距离,并根据参数 sigma 计算出高斯核函数的值。
  4. 如果 kernelType 不是 ‘linear’ 或 ‘rbf’,则会抛出一个 NameError 异常。最后,该函数返回 kernelValue,即所有样本和待计算样本之间的核函数值。图4为SVM中核函数的具体实现:
    在这里插入图片描述

2.1.2 向量机(SVM)模型的训练和测试

       实现了一个支持向量机(SVM)模型的训练和测试。使用的是Sequential Minimal Optimization(SMO)算法来求解SVM的优化问题,其中包含了计算样本之间核函数值、选择优化参数、更新阈值等步骤。此外还有对于数据可视化和模型准确度计算的函数。需要注意的是,此段代码只适用二维数据的可视化。
       这段代码定义了一个SVMStruct类,用于存储SVM模型的相关参数和数据,其中包括:

参数含义
SVMStruct初始化创建存储变量和数据的结构体,并且初始化一些变量值
calcError函数计算优化参数的误差值
selectAlpha_j函数选择第二个优化参数
innerLoop函数SMO算法中的内循环,用于更新alpha的值
trainSVM函数整个SVM模型的训练过程
testSVM函数使用测试集来测试训练好的SVM模型的准确度
showSVM函数用于在二维数据上可视化SVM模型的结果

下图展示了其中innerLoop函数的核心代码:
在这里插入图片描述


2.1.3 SVM模型的测试代码

       这段代码实现对SVM算法的测试,具体包括以下步骤:

  1. 从文件’testSet.txt’中读取数据,并将其处理为Numpy矩阵类型,其中前80个样本作为训练数据train_x、train_y,后20个样本作为测试数据test_x、test_y。
  2. 使用SVM.trainSVM函数在训练数据集上训练SVM模型,得到svmClassifier。
  3. 使用SVM.testSVM函数对测试数据集进行测试,得到分类准确率accuracy。
  4. 使用SVM.showSVM函数展示SVM模型在二维空间内的分类结果。
    主要作用是对SVM算法的正确性进行验证,通过测试样例来检验实现是否正确和有效。图6则展示了这段代码的测试结果。
    在这里插入图片描述
    在这里插入图片描述

2.2 SVM的优缺点

2.2.1 SVM的优点

1、在高维空间中⾮常高效;
2、即使在数据维度⽐样本数量⼤的情况下仍然有效;
3、在决策函数(称为支持向量)中使用训练集的子集,因此它也是⾼效利用内存的;
4、通用性:不同的核函数与特定的决策函数⼀⼀对应;

2.2.2 SVM的缺点

1、SVM算法对于大规模数据处理较为困难,计算复杂度较高;
2、对于多分类问题,需要进行多次二分类,计算量较大;
3、对于不平衡数据集,SVM算法可能会出现过拟合的情况;


3、SVM支持向量机算法不同类型核函数的可视化

       SVM(支持向量机)可以使用不同类型的核函数来实现非线性分类和回归任务。以下是几种常见的核函数以及它们在 SVM 中的可视化方法:

3.1 线性核函数

       线性核函数是 SVM 默认的核函数,它对应于线性分类器。由于线性核函数没有进行任何映射操作,因此可视化时仍然是一个线性决策边界。下面是线性核函数的核心代码:

# 创建线性核函数的 SVM 分类器  
svc_classifier = svm.SVC(kernel='linear', C=1.0).fit(X, y)  
  
# 在网格点上进行预测并重塑结果  
Z = svc_classifier.predict(X_plot)  
Z = Z.reshape(xx.shape)  

       图7展示了通过线性核函数的SVM分类器进行数据的预测以及可视化结果。

在这里插入图片描述


3.2 多项式核函数

       多项式核函数通过将输入特征映射到高维空间,将原始问题转换为在高维空间中线性可分的问题。可视化时,可以绘制决策边界,并在图中展示多项式核函数映射后的特征空间。下面是多项式核函数的核心代码:

# 创建多项式核函数的支持向量机分类器  
svc_classifier = svm.SVC(kernel='poly', degree=3, C=1.0)  
  
# 在网格点上进行预测并重塑结果  
Z = svc_classifier.predict(X_plot)  
Z = Z.reshape(xx.shape)   

       图8展示了通过多项式核函数的SVM分类器进行数据的预测以及可视化结果。

在这里插入图片描述


3.3 径向基函数RBF

       高斯核函数是一种常用的非线性核函数,它通过计算数据点之间的相似度来建模非线性关系。可视化时,可以绘制决策边界,并使用颜色或等高线表示相似度。下面是径向基函数RBF的核心代码:

# 创建径向基函数核的支持向量机分类器  
svc_classifier = svm.SVC(kernel='rbf', C=1.0).fit(X, y)  
  
# 在网格点上进行预测并重塑结果  
Z = svc_classifier.predict(X_plot)  
Z = Z.reshape(xx.shape)  

       图9展示了通过径向基函数的SVM分类器进行数据的预测以及可视化结果。
在这里插入图片描述


3.4 Sigmoid核函数

       Sigmoid 核函数通过将输入特征进行非线性映射,将二分类问题转化为一个非线性分类问题。可视化时,可以绘制决策边界,并在图中显示特征空间的非线性变换。下面是Sigmoid 核函数的核心代码:

# 创建sigmoid核函数的支持向量机分类器  
svc_classifier = svm.SVC(kernel='sigmoid', C=1.0)  
  
# 在网格点上进行预测并重塑结果  
Z = svc_classifier.predict(X_plot)  
Z = Z.reshape(xx.shape)  

       图10展示了通过Sigmoid 核函数的SVM分类器进行数据的预测以及可视化结果。

在这里插入图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慢热型网友.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值