目录
一、算法介绍
1.1算法背景
1.2算法引入
1.3算法假设
1.4算法原理
1.5算法实现步骤
二、算法关键点
2.1核函数选择
2.2 支持向量的选取
2.3间隔最大化
三、算法公式推导
3.1 关键概念和方法介绍
3.2支持向量机公式推导
3.3基于核函数的支持向量机公式推导
四、算法实现
4.1数据集描述
4.2代码实现
五、实验讨论
5.1SVM算法优缺点
5.2关于模型评估的讨论
5.3关于支持向量机针对线性可分与非线性可分问题的讨论
六、实验总结
支持向量机(Support Vector Machine,SVM)是一种经典的统计学习方法,由Vapnik等人在20世纪90年代提出。它在解决二分类问题上具有很高的准确性和鲁棒性,并且在实践中被广泛应用。
SVM的理论基础源自于统计学习理论和VC维理论。统计学习理论认为,通过从有限的训练样本中学习得到的模型可以推广到未知的样本上,从而实现对未知数据的预测。而VC维理论则提供了一种衡量模型复杂度和泛化能力之间关系的方法。
为什么要引入SVM算法,而不使用简单的逻辑回归线性模型?
(1)首先,从解决问题的角度,SVM能方便解决很多算法无法解决的问题,如线性不可分问题。
下图这类异或问题,线性模型就解决不了,即找不到任何一条直线能分割两类样本。我们一般有两种思路解决这个问题。一种是用感知机组成的有向图构造函数逼近器,思路是多画几条线以区分样本点,对应多层感知机;另一种就是将这些点映射到高维空间,再用超平面分割,对应支持向量机。
(2)其次,从解决问题的高效性分面,SVM算法具有更好的泛化能力。
如下图我们可以看到,SVM找到的超平面拥有强大的泛化能力,对于可能出现的新的接近划分平面的样本点(蓝色标注点)的分类能力强于另外两种方法,因为线性模型很难保证每次都取到距离所有点都很远的划分线。
支持向量机(Support Vector Machine,SVM)算法基于以下假设:
(1)假设数据是线性可分的:SVM在最初的形式中假设数据可以被一个超平面完全分割开,即存在一个超平面可以将不同类别的样本完全分开。这个假设对于线性可分问题是成立的。
(2)假设最优超平面具有最大间隔:SVM的目标是找到一个能够将不同类别样本分开的超平面,并且使得该超平面与最近的样本点之间的距离最大化。这个假设基于间隔最大化的思想,认为具有最大间隔的超平面对数据的泛化能力更强。
(3)假设支持向量决定了分类器:SVM的关键在于支持向量的选择。支持向量是离超平面最近的一些样本点,它们决定了超平面的位置和形状,从而决定了分类器的性能。SVM假设只有支持向量对分类结果起作用,其他样本点对分类结果没有影响。
但在实际应用中,以上假设并不是绝对成立的。因为SVM算法也可以应用于非线性可分的问题,通过使用核函数将低维特征映射到高维空间中进行分类。此外,SVM还有一些改进的版本,如软间隔SVM和非线性SVM,可以处理一些不满足线性可分假设的情况。
支持向量机(Support Vector Machine,SVM)是一种经典的机器学习算法,被广泛应用于分类和回归问题。
在我的理解里,支持向量机算法原理可以通俗地解释为:找到一个超平面,将不同类别的数据点分开,并使得该超平面与最近的样本点之间的距离最大化。
具体来说,SVM通过将数据映射到高维空间中,并在该空间中寻找一个能够将两类数据完全分开的超平面,从而实现分类任务。在这个过程中,SVM采用了一种基于间隔的策略,即选取距离两类数据最近的几个样本点作为支持向量,从而得到最大间隔的超平面。
下面是我总结的SVM算法的简单步骤:
将数据点映射到高维空间中,将每个数据点表示为一个特征向量。
在高维空间中寻找一个超平面,使得该超平面能够将不同类别的数据点完全分开。这个超平面被称为最优超平面。
确定最优超平面的位置和形状,即确定超平面的法向量和截距项。
通过计算支持向量到最优超平面的距离,得到最大间隔的超平面。
利用最大间隔的超平面对新样本进行分类,即将新样本点映射到高维空间中,计算其在超平面上方还是下方。
我认为很关键的一点是,SVM算法的核心思想是基于间隔最大化的。通过最大化支持向量到最优超平面的距离,使得分类器具有较好的泛化能力和鲁棒性。此外,SVM还可以通过引入核函数来处理非线性问题,将低维特征映射到高维空间中进行分类。
总的来说,SVM算法是一种强大而灵活的机器学习算法,适用于二分类问题,并且在实际应用中表现出色。理解SVM算法的原理对于掌握其实现和应用非常重要。
在支持向量机(Support Vector Machine,SVM)算法中,核函数用于将原始输入空间映射到一个高维特征空间,从而使得原本线性不可分的问题在新的特征空间中可以线性可分。选择合适的核函数是SVM算法中非常重要的一步,它直接影响到算法的性能和分类结果。
对于线性可分问题,可以选择不使用核函数(线性核函数),这意味着样本可以在原始的输入空间中被完美地划分为两个类别。在这种情况下,使用线性核函数是最简单和高效的选择,不需要进行特征映射。
然而,对于非线性可分问题,就需要使用非线性核函数来将数据映射到一个更高维的特征空间中,以期望在新的特征空间中实现线性可分。以下是几种常见的非线性核函数:
(1)线性核函数、
线性核函数(Linear Kernel)其实就是我们的原公式,表达式为:
也就是说,线性可分SVM我们可以和线性不可分SVM归为一类,区别仅仅在于线性可分SVM用的是线性核函数。
(2)多项式核函数
多项式核函数(Polynomial Kernel)是线性不可分SVM常用的核函数之一,表达式为:
其中, γ , r , d 都需要自己调参定义。
(3)高斯核函数
高斯核函数(Gaussian Kernel),在SVM中也称为径向基核函数(Radial Basis Function,RBF),它是非线性分类SVM最主流的核函数。libsvm默认的核函数就是它。表达式为:
其中, γ 大于 0,需要自己调参定义。
(4)sigmoid 核函数
Sigmoid核函数(Sigmoid Kernel)也是线性不可分SVM常用的核函数之一,表达式为:
其中, γ , r 都需要自己调参定义。
在选择核函数时,需要进行实验和验证以确定最佳的核函数和参数设置。这可以通过交叉验证、网格搜索、评估指标等方法来进行选择和比较。同时,也需要注意避免过拟合和欠拟合问题,以及对训练数据的合理选择和处理。
选择支持向量的过程可以简单地概括为以下几个步骤:
(1)训练模型:首先,我们需要使用训练数据来训练SVM模型。训练过程中,SVM算法会根据训练数据找到一个最优的超平面,使得所有样本点都能被正确分类或使得分类错误的样本点和超平面之间的距离最小化。
(2)确定支持向量:在训练完成后,我们可以通过分析模型的参数来确定支持向量。支持向量是离超平面最近的样本点,它们决定了超平面的位置和形状。只有这些支持向量才对分类结果有贡献,其他的样本点对于超平面的位置没有影响。
(3)支持向量的分类决策:支持向量的分类决策是通过计算它们与超平面的距离来确定的。对于线性可分问题,支持向量到超平面的距离应该是相等的;对于非线性可分问题,支持向量到超平面的距离可能不相等。
(4)调整超平面:如果模型的性能不理想,我们可以通过调整支持向量的位置来改变超平面的位置和形状。例如,我们可以添加或删除一些支持向量,或者调整它们的权重,以改变超平面的决策边界。
需要注意的是,支持向量的选取是在训练过程中自动完成的,而不是手动选择的。SVM算法通过优化过程来找到最优的超平面和支持向量,以使分类器的性能最优。
SVM算法通过最大化间隔来提高分类器的泛化能力,这是因为最大化间隔有助于减少过拟合现象。间隔指的是超平面与最近的样本点之间的距离,即分类器的鲁棒性和泛化能力。最大化间隔的目标是使分类器对新的未见过的数据具有更好的预测能力。
在SVM算法中,最大化间隔是通过优化问题来实现的。
最大化间隔的求解过程可以简化为以下几个步骤:
(1)计算间隔:对于给定的超平面w·x+b=0,我们可以计算出每个样本点到该超平面的距离。距离的计算可以使用点到直线的距离公式:d = |w·x+b|/||w||,其中||w||表示向量w的模长。
(2)最大化间隔:我们希望找到一个最优的超平面,使得所有样本点的距离之间的最小值最大。这个问题可以转化为一个凸优化问题,可以使用二次规划或者梯度下降等算法来求解。
(3)加入松弛变量:对于非线性可分问题,我们需要引入松弛变量来允许一些样本点分类错误。松弛变量允许一些样本点距离超平面的距离小于1,但是会受到惩罚,惩罚力度由超参数C控制。
(4)引入核函数:对于非线性可分问题,我们需要将样本点映射到高维空间中,并在高维空间中寻找最优超平面。这个过程可以通过引入核函数来实现。
最大化间隔可以提高分类器的泛化能力和鲁棒性,因为它允许分类器对新的未见过的数据进行更好的预测。同时,最大化间隔也有助于减少过拟合现象,使分类器更具有普适性。
在推导支持向量机公式前,首先对一些关键概念和方法进行介绍
(1)超平面
关于SVM,我认为需要对于超平面有最基本的认识,包括但不限于以下3点。
超平面的表达、超平面计算距离、超平面的正反n维空间下的超平面表达式:
其中w和x为n维向量
代表n维空间的法向量,决定超平面的方向,x代表超平面内的点,b代表位移项。实在不理解可以带入到三维空间想想。
超平面计算距离的方法很简单,超平外的一点 x 到超平面 (w,b) 的距离为:
上式中的||w|| 为一个L2范数。
超平面的正反意味着x点与超平面间的关系:
(2)拉格朗日乘子法
整体思路是面对多元函数求极值问题时,通过引入拉格朗日乘子a个变量b个约束条件的问题转化为a+b个变量无约束的问题,然后优化求解。而约束条件一般分为两种——等式约束和不等式约束。
①等式约束
我们有目标函数和约束条件:
定义拉格朗日函数:
分别对 L ( x , λ ) 的偏导置零,将变量转化为条件。目标其实就是求 L ( x , λ ) 的极值。
②不等式约束
我们有目标函数和约束条件:
定义拉格朗日函数:
约束条件转化为KKT条件:
问题转化为在KKT条件下求解 L ( x , λ )的最小值。
有一堆训练数据的正负样本,标记为:D:{,},i=1,…,l,∈{-1,1},x∈,假设有一个
超平面H:wx+b=0,可以把这些样本正确无误地分割开来,同时存在两个平行于H的超平面H1和H2:
使离H最近的正负样本刚好分别落在H1和H2上,这样的样本就是支持向量机。那么其他所有的训练样本都将位于H1和H2之外,也就是满足如下约束:
写成统一的式子就是:
而超平面H1和H2之间的距离可知为:
SVM的任务就是寻找一个超平面H把样本无误地分割成两部分,并且使H1和H2的距离最大。要找到这样的超平面,只需最大化间隔 margin也就是最小化 .
于是可以构造如下的条件极值问题:
对于不等式约束的条件极值问题,可以用拉格朗日方法求解。而拉格朗日方程的构造规则是:用约束方程乘以非负的拉格朗日系数,然后再从目标函数中减去。于是得到拉格朗日方程如下:
其中
那么我们要处理的规划问题就变为:
上式才是严格的不等式约束的拉格朗日条件极值的表达式。对于这一步的变换,很多文章都没有多做表述,或者理解有偏差,从而影响了读者后续的推演。在此我将详细地一步步推导,以解困惑。
(5)式是一个凸规划问题,其意义是先对α求偏导,令其等于0消掉α,然后再对w和b求L的最小值。要直接求解(5)式是有难度的,通过消去拉格朗日系数来化简方程,对我们的问题无济于事。所幸这个问题可以通过拉格朗日对偶问题来解决,为此我们把(5)式做一个等价变换:
上式即为对偶变换,这样就把这个凸优化问题转换成了对偶问题:
其意义是:原凸规划问题可以转化为先对w和b求偏导,令其等于0消掉w和b,然后再对α求L的最大值。下面我们就来求解(6)式,为此我们先计算w和b的偏导数。由(3)式有:
我们假设整个问题的最优解是 w ∗ , b ∗ , α ,接下来进行求解。
求解 α ∗
对于(11)式
这个优化式子比较复杂,里面有 l l l 个变量组成的向量 α 需要在目标函数极小化的时候求出。直接优化时很难的。这时候需要用 SMO 算法进行求解。
SMO算法采用了一种启发式的方法。它每次只优化两个变量,将其他的变量都视为常数。由于 =0.假如将 , , . . . , 固定,那么 , 之间的关系也确定了。这样SMO算法将一个复杂的优化算法转化为一个比较简单的两变量优化问题。
最后可以求出 α ∗ 。
需要指出的一点是,(2)式的条件极值问题能够转化为(5)式的凸规划问题,其中隐含着一个约束,即:
这个约束是这样得来的,如果(2)和(5)等效,必有:
把(3)式代入上式中,得到:
化简得到:
又因为约束(1)和(4),有:
所以要使(13)式成立,只有令: ( ( w ⋅ + b ) − 1 ) = 0由此得到(12)式的约束。该约束的意义是:如果一个样本是支持向量,则其对应的拉格朗日系数非零;如果一个样本不是支持向量,则其对应的拉格朗日系数一定为0。由此可知大多数拉格朗日系数都是0。
接下来我们要用到上面求出的一些公式:
由 KTT 条件可以退出不可能所有的 都是0,如果所有的都是 0 的话,那么 w ∗ =0,这显然是错误的,所以至少有一个 α > 0,这个时候根据(11)可以得到:
将(8) 代入 (14)可以得到:
要先把 b 解出来,先消除 ,因为 为标签, =±1,所以 =1,上式左右两边同时乘以 ,可以解出:
鸢尾花数据集,下载自UCI Machine Learning Repository
每个实例都是一棵植物;这是分类方法文献中使用的最早数据集之一,广泛用于统计学和机器学习。该数据集包含3类,每个类50个实例,其中每个类指的是一种虹膜植物。一个类与另一个2线性分离;后者不可线性分离。预测属性:虹膜植物类。这是一个非常简单的领域。
输出结果
分类result
根据结果,发现分类的效果并不好。接着,将输入鸢尾花的所有特征进行训练,并将分类结果降维后可视化展示。
(2)SVM实现高维数据多分类及其可视化
由于全部的特征共有四个维度,不方便直接进行可视化展示,所以需要利用PCA降维后再绘制可视化图。
PCA——主成分分析法
PCA设法将原来众多具有一定相关性的属性(比如p个属性),重新组合成一组相互无关的综合属性来代替原属性。通常数学上的处理就是将原来p个属性做线性组合,作为新的综合属性。
# pca降维
# 直接使用sklearn中的PCA进行降维
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
pca.fit(x)
xx = pca.transform(x) # 降维后的结果
train_data_2, test_data_2, train_label_2, test_label_2 = train_test_split(xx, y, random_state=1, train_size=0.7,
test_size=0.3) # 降维后的测试集划分
# 训练集和测试集的预测结果
trainPredict = (model.predict(train_data).reshape(-1, 1))
testPredict = model.predict(test_data).reshape(-1, 1)
# 将预测结果进行展示,首先画出预测点,再画出分类界面
# 预测点的画法,可参考https://zhuanlan.zhihu.com/p/81006952
# 画图例和点集
xx1_min, xx1_max = xx[:, 0].min(), xx[:, 0].max() # x轴范围
xx2_min, xx2_max = xx[:, 1].min(), xx[:, 1].max() # y轴范围
matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
cm_dark = matplotlib.colors.ListedColormap(['g', 'r', 'b']) # 设置点集颜色格式
cm_light = matplotlib.colors.ListedColormap(['#A0FFA0', '#FFA0A0', '#A0A0FF']) # 设置边界颜色
plt.xlabel('fea1', fontsize=13) # x轴标注
plt.ylabel('fea2', fontsize=13) # y轴标注
plt.xlim(xx1_min, xx1_max) # x轴范围
plt.ylim(xx2_min, xx2_max) # y轴范围
plt.title('SVM result') # 标题
plt.scatter(xx[:, 0], xx[:, 1], c=y[:, 0], s=30, cmap=cm_dark) # 画出测试点
plt.scatter(test_data_2[:, 0], test_data_2[:, 1], c=testPredict[:, 0], s=80, edgecolors='k', marker='+', zorder=2,
cmap=cm_dark) # 画出测试点,并将预测点圈出(注意这里是测试集的预测标签值)
plt.show()
输出结果
分类result
这里由于分类界面降维后难以直观展示,所以采用预测值和实际值点来展示分类效果。
其中,绿、红、蓝三种颜色代表花的三个品种,横纵坐标为pca降维后的两个特征维度,没有实际意义。圆点指真实分类,包含训练集和测试集。“+”形状的点为模型输出的预测值,仅含测试集。
从图中可以看出,降维后三类花的分布具有明显的聚类特性,而绝大多数测试集预测值都与真实值重合(即同颜色的圆点与十字形状重合),仅有少量样本出现预测误差。
支持向量机(Support Vector Machine,SVM)算法是一种经典的监督学习算法,用于二分类和多分类任务。它在许多实际问题中取得了很好的性能,并具有以下优点和缺点:
(1)优点:
高效性:SVM在处理高维数据和大规模数据集时具有较高的计算效率,因为它只依赖于支持向量,而不是整个数据集。
可用于非线性问题:通过使用不同的核函数(如多项式核、高斯核等),SVM可以有效地处理非线性分类问题。
泛化能力强:SVM通过最大化间隔来划分两个类别,从而使其具有较好的泛化能力,能够更好地处理未见过的数据。
对于小样本数据表现良好:由于SVM是一种基于边界的方法,它对于小样本数据集也能够给出较好的分类结果。
可以处理高维特征空间:SVM在高维特征空间中表现出色,这使它能够应对文本分类、图像识别等复杂任务。
(2)缺点:
对大规模数据集需要大量存储空间:SVM需要存储所有支持向量,这会占用较大的存储空间,特别是当数据集很大时。
难以选择合适的核函数和参数:SVM的性能非常依赖于所选的核函数和相关参数的选择,这对于非专业人士来说可能会比较困难。
对缺失数据敏感:SVM算法对于缺失数据是敏感的,因为它需要计算样本点之间的距离和相似性,而缺失数据会导致距离和相似性的计算产生问题。
计算复杂度高:在处理大规模数据集时,SVM的训练时间较长,尤其是在使用复杂核函数时。
对噪声和异常点敏感:由于SVM倾向于最大化间隔,它对噪声和异常点比较敏感,这可能会影响分类性能。
在实际应用中,需要根据具体问题和数据情况来选择是否使用SVM算法。
常见的模型评估方法有以下几种
(1)Holdout检验:Holdout检验是最简单也是最直接的验证方法,它将原始的样本集合随机划分成训练集和验证集两部分。比方说,对于一个2分类问题,将样本按照7:3的比例分成两部分,70%的样本用于模型训练;30%的样本用于模型验证,包括绘制ROC曲线、计算精确率和召回率等指标来评估模型性能。
Holdout检验的缺点很明显,即在验证集上计算出来的最后评估指标与原始分组有很大关系。
(2)交叉验证
I k-fold交叉验证:首先将全部样本划分成k个大小相等的样本子集;依次遍历这k个子集,每次把当前子集作为验证集,其余所有子集作为训练集,进行模型的训练和评估;最后把k次评估指标的平均值作为最终的评估指标,k通常取10。
II 留一验证:每次留下1个样本作为验证集,其余所有样本作为测试集。样本总数为n,依次对n个样本进行遍历,进行n次验证,再将评估指标求平均值得到最终的评估指标。在样本总数较多的情况下,留一验证法的时间开销极大。
III 留p验证:每次留下p个样本作为验证集,而从n个元素中选择p个元素有
种可能,因此它的时间开销更是远远高于留一验证,故而很少在实际中应用。
(1)当数据集线性可分时,即存在一个超平面可以将不同类别的样本完全分开,支持向量机(SVM)的处理方式如下:
线性可分的硬间隔支持向量机:此时我们可以使用硬间隔支持向量机来构建一个最大间隔超平面,使得正负样本之间的间隔最大化。硬间隔SVM的目标是找到一个超平面,使得所有样本都位于超平面两侧,并且使得最近的正负样本点到超平面的距离最大化。
线性可分的软间隔支持向量机:在实际应用中,数据往往不是完全线性可分的,可能存在一些噪声和异常点。为了处理这种情况,我们可以使用软间隔支持向量机。软间隔SVM允许一些样本点出现在超平面的误分类区域内,通过引入松弛变量来对错误分类进行惩罚。这样可以在一定程度上容忍噪声和异常点,提高模型的泛化能力。
(2)当数据集非线性可分时,即无法通过一个超平面将不同类别的样本完全分开,支持向量机可以通过引入核函数来处理非线性可分问题。核函数能够将样本映射到高维特征空间,使得在高维空间中线性可分。常用的核函数包括多项式核函数、高斯核函数等。
使用非线性核函数的软间隔支持向量机可以在高维特征空间中构建一个超平面,将非线性可分的数据分开。通过选择合适的核函数和调整相应的超参数,可以更好地拟合数据结构,提高模型的分类性能。
需要注意的是,在使用非线性核函数时,可能会面临维度灾难(curse of dimensionality)和过拟合的问题。因此,我们需要谨慎选择核函数和超参数,并进行适当的模型评估和调优,以确保模型具有良好的泛化性能。
本次实验对机器学习算法——SVM算法进行了研究学习。首先由SVM算法相对于其他算法在解决问题及高效性方面的的优势引出SVM算法,并介绍其背景及算法假设。
然后对SVM算法原理进行了阐述,按照我的理解,SVM算法核心思想通俗来讲就是构建一个超平面(对于二维数据就是一条直线),最大化样本点到超平面的间隔,从而实现对不同类别的数据进行分类。
本次实验一个很关键的部分是对SVM算法公式的推导。
通过拉格朗日乘子法和对偶原理对公式进行推导,并基于核函数进行了进一步分析。采用了一种启发式算法,求出了式中的一些关键参数。
在代码实现部分,此处采用了鸢尾花数据集,对支持向量机多分类,及高维数据多分类及其可视化进行了复现。在利用PCA进行降维后,得到了很好的效果。
总之,本次实验让我对SVM算法有了更深的认识和理解。在理论课上很多不理解的问题都得到了解决。
2024-1-21