支持向量机(七)

b站学习链接:传送门学习视频第12章

学习目录索引:吴恩达2014课程简介

知识补充

支持向量机

支持向量机(Support Vector Machine,SVM)是一种常用的监督学习算法,用于进行分类和回归分析。它的目标是找到一个最优的超平面(或者称为决策边界),以在不同类别的数据之间实现最大的间隔。

SVM的基本原理如下:

  1. 线性可分情况:对于线性可分的数据,SVM寻找一个超平面,将不同类别的样本完全分开。这个超平面具有最大的间隔,即离每个类别样本最近的距离最大化。
  2. 支持向量:支持向量是离超平面最近的样本点。它们对于定义超平面和分类决策起到重要作用。在训练SVM模型时,只有支持向量的位置会对模型的参数进行优化,而其他样本点不会对模型产生影响。
  3. 非线性情况:对于线性不可分的数据,可以通过使用核函数(Kernel Function)将数据映射到高维空间,使其在高维空间中线性可分。常用的核函数包括线性核、多项式核和径向基函数(RBF)核等。
  4. 软间隔和惩罚项:在实际情况中,数据很少是完全线性可分的,存在一些噪声和异常值。为了处理这种情况,SVM引入了软间隔和惩罚项。软间隔允许一些样本点落在间隔内部,而不是严格分离。惩罚项则控制了软间隔的大小和模型的复杂度。
  5. 分类和回归:SVM可以用于二分类和多分类问题。对于二分类,SVM构建一个决策边界来区分两个类别。对于回归问题,SVM寻找一个超平面,使得尽可能多的样本点落在超平面附近,同时满足一定的容忍度(ε)。

SVM的优点包括:

  • 在高维空间中处理线性和非线性问题。
  • 在训练过程中只依赖于支持向量,减少了存储和计算的复杂性。
  • 可以通过调整核函数和惩罚项参数来适应不同的数据和问题。

然而,SVM在处理大规模数据集和多类别问题时可能会面临一些挑战,因为它对计算资源的需求较高。

总体而言,SVM是一种强大的分类和回归算法,已经在许多领域和实际应用中得到广泛应用,如图像分类、文本分类、生物信息学等。

拉格朗日

拉格朗日(Lagrange)是一个数学家,意大利数学家乔瓦尼·拉格朗日(Giovanni Lagrange)在18世纪时为数学、物理学和力学做出了重要的贡献。拉格朗日在数学领域的研究涵盖了多个方面,包括代数、数论、微积分和力学等。

在数学中,拉格朗日有很多定理和方法以他的名字命名,其中最著名的是拉格朗日乘数法和拉格朗日插值法。

  1. 拉格朗日乘数法:拉格朗日乘数法是一种用于求解带有约束条件的优化问题的方法。在数学中,我们有时需要在某些约束条件下最大化或最小化一个函数。拉格朗日乘数法通过将约束条件引入到目标函数中,构造一个新的函数,然后通过求解该函数的极值来得到原问题的解。
  2. 拉格朗日插值法:拉格朗日插值法是一种用于构造多项式插值函数的方法。给定一组数据点,拉格朗日插值法可以通过构造一个多项式,使得该多项式经过所有给定的数据点。这个多项式称为拉格朗日插值多项式,可以用来估计数据点之间的值。

此外,拉格朗日还在力学领域做出了重要的贡献,他提出了拉格朗日力学,这是一种基于能量原理的力学体系,对于理解物体的运动和相互作用具有重要意义。

总的来说,拉格朗日是一位伟大的数学家,他的名字被用来命名了多个重要的数学和力学概念和方法,在数学和物理学领域都产生了深远的影响。

对偶问题

对偶问题(Dual Problem)是最优化问题中的一个重要概念。在最优化理论中,每个原始问题都可以与一个相关联的对偶问题相对应。这两个问题之间的关系称为对偶性。

考虑一个原始优化问题:

最小化 f(x),

其中 x 是优化变量,约束条件为 g(x) ≤ 0 和 h(x) = 0。

对应的对偶问题可以写为:

最大化 D(λ, μ),

其中 λ 和 μ 是称为拉格朗日乘子(Lagrange Multiplier)的非负数,D(λ, μ) 是拉格朗日函数在给定的 λ 和 μ 下的极大值。

原始问题的目标是找到使目标函数 f(x) 最小化的变量 x,同时满足约束条件 g(x) ≤ 0 和 h(x) = 0。而对偶问题的目标是找到使拉格朗日函数 D(λ, μ) 最大化的拉格朗日乘子 λ 和 μ,同时满足 λ ≥ 0。

对偶问题的求解和原始问题是相关联的。如果对偶问题的最优解与原始问题的最优解相等,那么这两个问题就是强对偶的。在强对偶的情况下,原始问题的最优解可以通过对偶问题的最优解来获得,并且两个问题的最优解值相等。

对偶问题在最优化理论和优化算法中有重要的应用。它们可以帮助理解原始问题的性质和结构,并提供了一种有效的方法来求解原始问题。对偶问题也在支持向量机(SVM)、线性规划和凸优化等领域中发挥着关键的作用。

欧氏距离

欧式距离(Euclidean Distance)是欧几里德空间中两点之间的距离。在二维或三维空间中,欧式距离可以简单地用勾股定理计算,而在更高维度的空间中,欧式距离仍然适用。

对于在 n 维空间中的两个点 P(x₁, x₂, ..., xₙ) 和 Q(y₁, y₂, ..., yₙ),它们之间的欧式距离记为 d(P, Q),计算公式为:

d(P, Q) = √((x₁ - y₁)² + (x₂ - y₂)² + ... + (xₙ - yₙ)²)

简而言之,欧式距离是两点间直线的长度。它可以应用于各种应用场景,如计算空间中的点与点之间的距离、数据聚类算法中的距离度量等。

欧式距离满足以下性质:

  1. 非负性:d(P, Q) ≥ 0,距离不可能是负数。
  2. 同一性:d(P, Q) = 0 当且仅当 P = Q,即两点相同时距离为零。
  3. 对称性:d(P, Q) = d(Q, P),两点间的距离与点的顺序无关。
  4. 三角不等式:对于任意三个点 P、Q 和 R,有 d(P, Q) + d(Q, R) ≥ d(P, R),即两点间的最短距离是直线距离,不可能更短。

欧式距离是最常见的距离度量之一,特别是在机器学习、数据挖掘和图像处理等领域中经常使用。它在许多算法中被用于计算样本间的距离,如K近邻算法(K-Nearest Neighbors)、聚类算法等。

mercers's(莫塞尔定理)

课堂笔记

优化目标

参考视频: 12 - 1 - Optimization Objective (15 min).mkv

到目前为止,你已经见过一系列不同的学习算法。在监督学习中,许多学习算法的性能都非常类似,因此,重要的不是你该选择使用学习算法A 还是学习算法B ,而更重要的是,应用这些算法时,所创建的大量数据在应用这些算法时,表现情况通常依赖于你的水平。比如:你为学习算法所设计的特征量的选择,以及如何选择正则化参数,诸如此类的事。还有一个更加强大的算法广泛的应用于工业界和学术界,它被称为支持向量机(Support Vector Machine )。与逻辑回归和神经网络相比,支持向量机,或者简称SVM,在学习复杂的非线性方程时提供了一种更为清晰,更加强大的方式。因此,在接下来的视频中,我会探讨这一算法。在稍后的课程中,我也会对监督学习算法进行简要的总结。当然,仅仅是作简要描述。但对于支持向量机,鉴于该算法的强大和受欢迎度,在本课中,我会花许多时间来讲解它。它也是我们所介绍的最后一个监督学习算法。

正如我们之前开发的学习算法,我们从优化目标开始。那么,我们开始学习这个算法。为了描述支持向量机,事实上,我将会从逻辑回归开始展示我们如何一点一点修改来得到本质上的支持向量机。

那么,在逻辑回归中我们已经熟悉了这里的假设函数形式,和右边的S型激励函数。然而,为了解释一些数学知识.我将用 z z z 表示 θ T x \theta^Tx θTx。

现在考虑下我们想要逻辑回归做什么:如果有一个 y = 1 y=1 y=1的样本,我的意思是不管是在训练集中或是在测试集中,又或者在交叉验证集中,总之是 y = 1 y=1 y=1,现在我们希望 h θ ( x ) {{h}{\theta }}\left( x \right) hθ(x) 趋近1。因为我们想要正确地将此样本分类,这就意味着当 h θ ( x ) {{h}{\theta }}\left( x \right) hθ(x)趋近于1时, θ T x \theta^Tx θTx 应当远大于0,这里的 > > >> >>意思是远远大于0。这是因为由于 z z z 表示 θ T x \theta^Tx θTx,当 z z z远大于0时,即到了该图的右边,你不难发现此时逻辑回归的输出将趋近于1。相反地,如果我们有另一个样本,即 y = 0 y=0 y=0。我们希望假设函数的输出值将趋近于0,这对应于 θ T x \theta^Tx θTx,或者就是 z z z 会远小于0,因为对应的假设函数的输出值趋近0。

如果你进一步观察逻辑回归的代价函数,你会发现每个样本 ( x , y ) (x,y) (x,y)都会为总代价函数,增加这里的一项,因此,对于总代价函数通常会有对所有的训练样本求和,并且这里还有一个 1 / m 1/m 1/m项,但是,在逻辑回归中,这里的这一项就是表示一个训练样本所对应的表达式。现在,如果我将完整定义的假设函数代入这里。那么,我们就会得到每一个训练样本都影响这一项。

现在,先忽略 1 / m 1/m 1/m 这一项,但是这一项是影响整个总代价函数中的这一项的。

现在,一起来考虑两种情况:

一种是 y y y等于1的情况;另一种是 y y y 等于0的情况。

在第一种情况中,假设 y = 1 y=1 y=1 ,此时在目标函数中只需有第一项起作用,因为 y = 1 y=1 y=1时, ( 1 − y ) (1-y) (1−y)项将等于0。因此,当在 y = 1 y=1 y=1 的样本中时,即在 $(x, y) $中 ,我们得到 y = 1 y=1 y=1 − log ⁡ ( 1 − 1 1 + e − z ) -\log(1-\frac{1}{1+e^{-z}}) −log(1−1+e−z1)这样一项,这里同上一张幻灯片一致。

我用 z z z 表示 θ T x \theta^Tx θTx,即: z = θ T x z= \theta^Tx z=θTx。当然,在代价函数中, y y y 前面有负号。我们只是这样表示,如果 y = 1 y=1 y=1 代价函数中,这一项也等于1。这样做是为了简化此处的表达式。如果画出关于 z z z 的函数,你会看到左下角的这条曲线,我们同样可以看到,当 z z z 增大时,也就是相当于 θ T x \theta^Tx θTx增大时, z z z 对应的值会变的非常小。对整个代价函数而言,影响也非常小。这也就解释了,为什么逻辑回归在观察到正样本 y = 1 y=1 y=1时,试图将 θ T x \theta^Tx θTx设置得非常大。因为,在代价函数中的这一项会变的非常小。

现在开始建立支持向量机,我们从这里开始:

我们会从这个代价函数开始,也就是 − log ⁡ ( 1 − 1 1 + e − z ) -\log(1-\frac{1}{1+e^{-z}}) −log(1−1+e−z1)一点一点修改,让我取这里的 z = 1 z=1 z=1 点,我先画出将要用的代价函数。

新的代价函数将会水平的从这里到右边(图外),然后我再画一条同逻辑回归非常相似的直线,但是,在这里是一条直线,也就是我用紫红色画的曲线,就是这条紫红色的曲线。那么,到了这里已经非常接近逻辑回归中使用的代价函数了。只是这里是由两条线段组成,即位于右边的水平部分和位于左边的直线部分,先别过多的考虑左边直线部分的斜率,这并不是很重要。但是,这里我们将使用的新的代价函数,是在 y = 1 y=1 y=1的前提下的。你也许能想到,这应该能做同逻辑回归中类似的事情,但事实上,在之后的优化问题中,这会变得更坚定,并且为支持向量机,带来计算上的优势。例如,更容易计算股票交易的问题等等。

目前,我们只是讨论了 y = 1 y=1 y=1的情况,另外一种情况是当 y = 0 y=0 y=0时,此时如果你仔细观察代价函数只留下了第二项,因为第一项被消除了。如果当 y = 0 y=0 y=0时,那么这一项也就是0了。所以上述表达式只留下了第二项。因此,这个样本的代价或是代价函数的贡献。将会由这一项表示。并且,如果你将这一项作为 z z z的函数,那么,这里就会得到横轴 z z z。现在,你完成了支持向量机中的部分内容,同样地,我们要替代这一条蓝色的线,用相似的方法。

如果我们用一个新的代价函数来代替,即这条从0点开始的水平直线,然后是一条斜线,像上图。那么,现在让我给这两个方程命名,左边的函数,我称之为 cos ⁡ t 1 ( z ) {\cos}t_1{(z)} cost1(z),同时,右边函数我称它为 cos ⁡ t 0 ( z ) {\cos}t_0{(z)} cost0(z)。这里的下标是指在代价函数中,对应的 y = 1 y=1 y=1 和 y = 0 y=0 y=0 的情况,拥有了这些定义后,现在,我们就开始构建支持向量机。

上图中先消除1/m这一项,为什么消除可以看下面的解释,cost的替换也使计算更简单

这里还有一项需要变化在逻辑回归中 A + λ B A+\lambda B A+λB使用lambda来控制A和B的权重,设置lambda很大来使B有很大的权重,而在支持向量机里我们写成CA+B,这里把C设置的很小来使B拥有很大的权重。所以这只是一种控制权重的方式或者一种不同参数设置的方法。来决定我们更关心第一项优化还是更关心第二项优化。

通过上面的演变我们获得了支持向量机的总体优化目标

这是我们在逻辑回归中使用代价函数 J ( θ ) J(\theta) J(θ)。也许这个方程看起来不是非常熟悉。这是因为之前有个负号在方程外面,但是,这里我所做的是,将负号移到了表达式的里面,这样做使得方程看起来有些不同。对于支持向量机而言,实质上我们要将这替换为 cos ⁡ t 1 ( z ) {\cos}t_1{(z)} cost1(z),也就是 cos ⁡ t 1 ( θ T x ) {\cos}t_1{(\theta^Tx)} cost1(θTx),同样地,我也将这一项替换为 cos ⁡ t 0 ( z ) {\cos}t_0{(z)} cost0(z),也就是代价 cos ⁡ t 0 ( θ T x ) {\cos}t_0{(\theta^Tx)} cost0(θTx)。这里的代价函数 cos ⁡ t 1 {\cos}t_1 cost1,就是之前所提到的那条线。此外,代价函数 cos ⁡ t 0 {\cos}t_0 cost0,也是上面所介绍过的那条线。因此,对于支持向量机,我们得到了这里的最小化问题,即:

然后,再加上正则化参数。现在,按照支持向量机的惯例,事实上,我们的书写会稍微有些不同,代价函数的参数表示也会稍微有些不同。

首先,我们要除去 1 / m 1/m 1/m这一项,当然,这仅仅是由于人们使用支持向量机时,对比于逻辑回归而言,不同的习惯所致,但这里我所说的意思是:你知道,我将要做的是仅仅除去 1 / m 1/m 1/m这一项,但是,这也会得出同样的 θ {{\theta }} θ 最优值,好的,因为 1 / m 1/m 1/m 仅是个常量,因此,你知道在这个最小化问题中,无论前面是否有 1 / m 1/m 1/m 这一项,最终我所得到的最优值 θ {{\theta }} θ都是一样的。这里我的意思是,先给你举一个样本,假定有一最小化问题:即要求当 ( u − 5 ) 2 + 1 (u-5)^2+1 (u−5)2+1取得最小值时的 u u u值,这时最小值为:当 u = 5 u=5 u=5时取得最小值。

现在,如果我们想要将这个目标函数乘上常数10,这里我的最小化问题就变成了:求使得 10 × ( u − 5 ) 2 + 10 10×(u-5)^2+10 10×(u−5)2+10最小的值 u u u,然而,使得这里最小的 u u u值仍为5。因此将一些常数乘以你的最小化项,这并不会改变最小化该方程时得到 u u u值。因此,这里我所做的是删去常量 m m m。也相同的,我将目标函数乘上一个常量 m m m,并不会改变取得最小值时的 θ {{\theta }} θ值。

第二点概念上的变化,我们只是指在使用支持向量机时,一些如下的标准惯例,而不是逻辑回归。因此,对于逻辑回归,在目标函数中,我们有两项:第一个是训练样本的代价,第二个是我们的正则化项,我们不得不去用这一项来平衡。这就相当于我们想要最小化 A A A加上正则化参数 λ \lambda λ,然后乘以其他项 B B B对吧?这里的 A A A表示这里的第一项,同时我用B 表示第二项,但不包括 λ \lambda λ,我们不是优化这里的 A + λ × B A+\lambda\times B A+λ×B。我们所做的是通过设置不同正则参数 λ \lambda λ达到优化目的。这样,我们就能够权衡对应的项,是使得训练样本拟合的更好。即最小化 A A A。还是保证正则参数足够小,也即是对于B 项而言,但对于支持向量机,按照惯例,我们将使用一个不同的参数替换这里使用的 λ \lambda λ来权衡这两项。你知道,就是第一项和第二项我们依照惯例使用一个不同的参数称为 C C C,同时改为优化目标, C × A + B C×A+B C×A+B。

因此,在逻辑回归中,如果给定 λ \lambda λ,一个非常大的值,意味着给予 B B B更大的权重。而这里,就对应于将 C C C 设定为非常小的值,那么,相应的将会给 B B B比给 A A A更大的权重。因此,这只是一种不同的方式来控制这种权衡或者一种不同的方法,即用参数来决定是更关心第一项的优化,还是更关心第二项的优化。当然你也可以把这里的参数 C C C 考虑成 1 / λ 1/\lambda 1/λ,同 1 / λ 1/\lambda 1/λ所扮演的角色相同,并且这两个方程或这两个表达式并不相同,因为 C = 1 / λ C=1/\lambda C=1/λ,但是也并不全是这样,如果当 C = 1 / λ C=1/\lambda C=1/λ时,这两个优化目标应当得到相同的值,相同的最优值 θ {{\theta }} θ。因此,就用它们来代替。那么,我现在删掉这里的 λ \lambda λ,并且用常数 C C C来代替。因此,这就得到了在支持向量机中我们的整个优化目标函数。然后最小化这个目标函数,得到SVM 学习到的参数 C C C。

最后有别于逻辑回归输出的概率。在这里,我们的代价函数,当最小化代价函数,获得参数 θ {{\theta }} θ时,支持向量机所做的是它来直接预测 y y y的值等于1,还是等于0。因此,这个假设函数会预测1。当 θ T x \theta^Tx θTx大于或者等于0时,或者等于0时,所以学习参数 θ {{\theta }} θ就是支持向量机假设函数的形式。那么,这就是支持向量机数学上的定义。

在接下来的视频中,让我们再回去从直观的角度看看优化目标,实际上是在做什么,以及SVM的假设函数将会学习什么,同时也会谈谈如何做些许修改,学习更加复杂、非线性的函数。

大边界的直观理解

参考视频: 12 - 2 - Large Margin Intuition (11 min).mkv

人们有时将支持向量机看作是大间距分类器。在这一部分,我将介绍其中的含义,这有助于我们直观理解SVM 模型的假设是什么样的。

这是我的支持向量机模型的代价函数,在左边这里我画出了关于 z z z的代价函数 cos ⁡ t 1 ( z ) {\cos}t_1{(z)} cost1(z),此函数用于正样本,而在右边这里我画出了关于 z z z的代价函数 cos ⁡ t 0 ( z ) {\cos}t_0{(z)} cost0(z),横轴表示 z z z,现在让我们考虑一下,最小化这些代价函数的必要条件是什么。如果你有一个正样本, y = 1 y=1 y=1,则只有在 z > = 1 z>=1 z>=1时,代价函数 cos ⁡ t 1 ( z ) {\cos}t_1{(z)} cost1(z)才等于0。

换句话说,如果你有一个正样本,我们会希望 θ T x > = 1 \theta^Tx>=1 θTx>=1,反之,如果 y = 0 y=0 y=0,我们观察一下,函数 cos ⁡ t 0 ( z ) {\cos}t_0{(z)} cost0(z),它只有在 z < = − 1 z<=-1 z<=−1的区间里函数值为0。这是支持向量机的一个有趣性质。事实上,如果你有一个正样本 y = 1 y=1 y=1,则其实我们 仅仅要求 θ T x \theta^Tx θTx大于等于0,就能将该样本恰当分出,这是因为如果 θ T x \theta^Tx θTx>0大的话,我们的模型代价函数值为0,类似地,如果你有一个负样本,则仅需要 θ T x \theta^Tx θTx<=0就会将负例正确分离,但是,支持向量机的要求更高,不仅仅要能正确分开输入的样本,即不仅仅要求 θ T x \theta^Tx θTx>0,我们需要的是比0值大很多,比如大于等于1,我也想这个比0小很多,比如我希望它小于等于-1,这就相当于在支持向量机中嵌入了一个额外的安全因子,或者说安全的间距因子。

当然,逻辑回归做了类似的事情。但是让我们看一下,在支持向量机中,这个因子会导致什么结果。具体而言,我接下来会考虑一个特例。我们将这个常数 C C C设置成一个非常大的值。比如我们假设 C C C的值为100000或者其它非常大的数,然后来观察支持向量机会给出什么结果?

如果 C C C非常大,则最小化代价函数的时候,我们将会很希望找到一个使第一项为0的最优解。因此,让我们尝试在代价项的第一项为0的情形下理解该优化问题。比如我们可以把 C C C设置成了非常大的常数,这将给我们一些关于支持向量机模型的直观感受。

我们已经看到输入一个训练样本标签为 y = 1 y=1 y=1,你想令第一项为0,你需要做的是找到一个 θ {{\theta }} θ,使得 θ T x > = 1 \theta^Tx>=1 θTx>=1,类似地,对于一个训练样本,标签为 y = 0 y=0 y=0,为了使 cos ⁡ t 0 ( z ) {\cos}t_0{(z)} cost0(z) 函数的值为0,我们需要 θ T x < = − 1 \theta^Tx<=-1 θTx<=−1。因此,现在考虑我们的优化问题。选择参数,使得第一项等于0,就会导致下面的优化问题,因为我们将选择参数使第一项为0,因此这个函数的第一项为0,因此是 C C C乘以0加上二分之一乘以第二项。这里第一项是 C C C乘以0,因此可以将其删去,因为我知道它是0。

这将遵从以下的约束: θ T x ( i ) > = 1 \theta^Tx^{(i)}>=1 θTx(i)>=1,如果 y ( i ) y^{(i)} y(i)是等于1 的, θ T x ( i ) < = − 1 \theta^Tx^{(i)}<=-1 θTx(i)<=−1,如果样本 i i i是一个负样本,这样当你求解这个优化问题的时候,当你最小化这个关于变量 θ {{\theta }} θ的函数的时候,你会得到一个非常有趣的决策边界。

具体而言,如果你考察这样一个数据集,其中有正样本,也有负样本,可以看到这个数据集是线性可分的。我的意思是,存在一条直线把正负样本分开。当然有多条不同的直线,可以把正样本和负样本完全分开。

比如,(绿色和粉色)这就是一个决策边界可以把正样本和负样本分开。但是多多少少这个看起来并不是非常自然是么?

或者我们可以画一条更差的决策界,这是另一条决策边界,可以将正样本和负样本分开,但仅仅是勉强分开,这些决策边界看起来都不是特别好的选择,支持向量机将会选择这个黑色的决策边界,相较于之前我用粉色或者绿色画的决策界。这条黑色的看起来好得多,黑线看起来是更稳健的决策界。在分离正样本和负样本上它显得的更好。数学上来讲,这是什么意思呢?这条黑线有更大的距离,这个距离叫做间距(margin )。

当画出这两条额外的蓝线,我们看到黑色的决策界和训练样本之间有更大的最短距离。然而粉线和蓝线离训练样本就非常近,在分离样本的时候就会比黑线表现差。因此,这个距离叫做支持向量机的间距,而这是支持向量机具有鲁棒性的原因,因为它努力用一个最大间距来分离样本。因此支持向量机有时被称为大间距分类器,而这其实是求解上一页幻灯片上优化问题的结果。

我知道你也许想知道求解上一页幻灯片中的优化问题为什么会产生这个结果?它是如何产生这个大间距分类器的呢?我知道我还没有解释这一点。

我将会从直观上略述为什么这个优化问题会产生大间距分类器。总之这个图示有助于你理解支持向量机模型的做法,即努力将正样本和负样本用最大的间距分开。

在本节课中关于大间距分类器,我想讲最后一点:我们将这个大间距分类器中的正则化因子常数 C C C设置的非常大,我记得我将其设置为了100000,因此对这样的一个数据集,也许我们将选择这样的决策界,从而最大间距地分离开正样本和负样本。那么在让代价函数最小化的过程中,我们希望找出在 y = 1 y=1 y=1和 y = 0 y=0 y=0两种情况下都使得代价函数中左边的这一项尽量为零的参数。如果我们找到了这样的参数,则我们的最小化问题便转变成:

上图这个公式需要带入支持向量机的min函数可以得到上面的这个公式

事实上,支持向量机现在要比这个大间距分类器所体现得更成熟,尤其是当你使用大间距分类器的时候,你的学习算法会受异常点(outlier) 的影响。比如我们加入一个额外的正样本。

在这里,如果你加了这个样本,为了将样本用最大间距分开,也许我最终会得到一条类似这样的决策界,对么?就是这条粉色的线,仅仅基于一个异常值,仅仅基于一个样本,就将我的决策界从这条黑线变到这条粉线,这实在是不明智的。而如果正则化参数 C C C,设置的非常大,这事实上正是支持向量机将会做的。它将决策界,从黑线变到了粉线,但是如果 C C C 设置的小一点,**如果你将C设置的不要太大,则你最终会得到这条黑线,**当然数据如果不是线性可分的,如果你在这里有一些正样本或者你在这里有一些负样本,则支持向量机也会将它们恰当分开。因此,大间距分类器的描述,仅仅是从直观上给出了正则化参数 C C C非常大的情形,同时,要提醒你 C C C的作用类似于 1 / λ 1/\lambda 1/λ, λ \lambda λ是我们之前使用过的正则化参数。这只是 C C C非常大的情形,或者等价地 λ \lambda λ 非常小的情形。你最终会得到类似粉线这样的决策界,但是实际上应用支持向量机的时候, C C C**不是非常非常大的时候,它可以忽略掉一些异常点的影响,得到更好的决策界。**甚至当你的数据不是线性可分的时候,支持向量机也可以给出好的结果。

回顾 C = 1 / λ C=1/\lambda C=1/λ,因此:
C C C 较大时,相当于 λ \lambda λ 较小,可能会导致过拟合,高方差。
C C C 较小时,相当于 λ \lambda λ较大,可能会导致低拟合,高偏差。

这里理解一下:CA+B就是上面说的权重,当C很大的时候,正则化项B的权重就会很小,回顾一下正则化权重小就会导致过拟合;反之C较小,B的权重就很大可能会导致低拟合

我们稍后会介绍支持向量机的偏差和方差,希望在那时候关于如何处理参数的这种平衡会变得更加清晰。我希望,这节课给出了一些关于为什么支持向量机被看做大间距分类器的直观理解。它用最大间距将样本区分开,尽管从技术上讲,这只有当参数 C C C是非常大的时候是真的,但是它对于理解支持向量机是有益的。

本节课中我们略去了一步,那就是我们在幻灯片中给出的优化问题。为什么会是这样的?它是如何得出大间距分类器的?我在本节中没有讲解,在下一节课中,我将略述这些问题背后的数学原理,来解释这个优化问题是如何得到一个大间距分类器的。

大边界分类背后的数学(选修)

参考视频: 12 - 3 - Mathematics Behind Large Margin Classification (Optional) (20 min).mkv

李航的《统计学习方法》里面讲的也比较清楚,有兴趣可以看下,没兴趣直接忽略不影响。

在本节课中,我将介绍一些大间隔分类背后的数学原理。本节为选修部分,你完全可以跳过它,但是听听这节课可能让你对支持向量机中的优化问题,以及如何得到大间距分类器,产生更好的直观理解。

首先,让我来给大家复习一下关于向量内积的知识。假设我有两个向量, u u u和 v v v,我将它们写在这里。两个都是二维向量,我们看一下, u T v u^T v uTv的结果。 u T v u^T v uTv也叫做向量 u u u和 v v v之间的内积。由于是二维向量,我可以将它们画在这个图上。我们说,这就是向量 u u u即在横轴上,取值为某个 u 1 {{u}{1}} u1,而在纵轴上,高度是某个 u 2 {{u}{2}} u2作为 u u u的第二个分量。现在,很容易计算的一个量就是向量 u u u的范数。 ∥ u ∥ \left\| u \right\| ∥u∥表示 u u u的范数,即 u u u的长度,即向量 u u u的欧几里得长度。根据毕达哥拉斯定理, ∥ u ∥ = u 1 2 + u 2 2 \left\| u \right\|=\sqrt{u_{1}^{2}+u_{2}^{2}} ∥u∥=u12+u22 ,这是向量 u u u的长度,它是一个实数。现在你知道了这个的长度是多少了。我刚刚画的这个向量的长度就知道了。

现在让我们回头来看向量 v v v ,因为我们想计算内积。 v v v是另一个向量,它的两个分量 v 1 {{v}{1}} v1和 v 2 {{v}{2}} v2是已知的。向量 v v v可以画在这里,现在让我们来看看如何计算 u u u和 v v v之间的内积。这就是具体做法,我们将向量 v v v投影到向量 u u u上,我们做一个直角投影,或者说一个90度投影将其投影到 u u u上,接下来我度量这条红线的长度。我称这条红线的长度为 p p p,因此 p p p就是长度,或者说是向量 v v v投影到向量 u u u上的量,我将它写下来, p p p是 v v v投影到向量 u u u上的长度,因此可以将 u T v = p ⋅ ∥ u ∥ {{u}^{T}}v=p\centerdot \left\| u \right\| uTv=p⋅∥u∥,或者说 u u u的长度。这是计算内积的一种方法。如果你从几何上画出 p p p的值,同时画出 u u u的范数,你也会同样地计算出内积,答案是一样的。另一个计算公式是: u T v u^T v uTv就是 [ u 1 u 2 ] \left[ {{u}{1}}\text{ }{{u}{2}} \right] [u1 u2] 这个一行两列的矩阵乘以 v v v。因此可以得到 u 1 × v 1 + u 2 × v 2 {{u}{1}}\times {{v}{1}}+{{u}{2}}\times {{v}{2}} u1×v1+u2×v2。根据线性代数的知识,这两个公式会给出同样的结果。顺便说一句, u T v = v T u u^Tv=v^Tu uTv=vTu。因此如果你将 u u u和 v v v交换位置,将 u u u投影到 v v v上,而不是将 v v v投影到 u u u上,然后做同样地计算,只是把 u u u和 v v v的位置交换一下,你事实上可以得到同样的结果。申明一点,在这个等式中 u u u的范数是一个实数, p p p也是一个实数,因此 u T v u^T v uTv就是两个实数正常相乘。

最后一点,需要注意的就是 p p p值, p p p事实上是有符号的,即它可能是正值,也可能是负值。我的意思是说,如果 u u u是一个类似这样的向量, v v v是一个类似这样的向量, u u u和 v v v之间的夹角大于90度,则如果将 v v v投影到 u u u上,会得到这样的一个投影,这是 p p p的长度,在这个情形下我们仍然有 u T v {{u}^{T}}v uTv是等于 p p p乘以 u u u的范数。唯一一点不同的是 p p p在这里是负的。在内积计算中,如果 u u u和 v v v之间的夹角小于90度,那么那条红线的长度 p p p是正值。然而如果这个夹角大于90度,则 p p p将会是负的。就是这个小线段的长度是负的。如果它们之间的夹角大于90度,两个向量之间的内积也是负的。这就是关于向量内积的知识。我们接下来将会使用这些关于向量内积的性质试图来理解支持向量机中的目标函数。

这就是我们先前给出的支持向量机模型中的目标函数。为了讲解方便,我做一点简化,仅仅是为了让目标函数更容易被分析。

我接下来忽略掉截距,令 θ 0 = 0 {{\theta }{0}}=0 θ0=0,这样更容易画示意图。我将特征数 n n n置为2,因此我们仅有两个特征 x 1 , x 2 {{x}{1}},{{x}{2}} x1,x2,现在我们来看一下目标函数,支持向量机的优化目标函数。当我们仅有两个特征,即 n = 2 n=2 n=2时,这个式子可以写作: 1 2 ( θ 1 2 + θ 2 2 ) = 1 2 ( θ 1 2 + θ 2 2 ) 2 \frac{1}{2}\left({\theta_1^2+\theta_2^2}\right)=\frac{1}{2}\left(\sqrt{\theta_1^2+\theta_2^2}\right)^2 21(θ12+θ22)=21(θ12+θ22 )2,我们只有两个参数 θ 1 , θ 2 {{\theta }{1}},{{\theta }_{2}} θ1,θ2。你可能注意到括号里面的这一项是向量 θ {{\theta }} θ的范数,或者说是向量 θ {{\theta }} θ的长度。我的意思是如果我们将向量 θ {{\theta }} θ写出来,那么我刚刚画红线的这一项就是向量 θ {{\theta }} θ的长度或范数。这里我们用的是之前学过的向量范数的定义,事实上这就等于向量 θ {{\theta }} θ的长度。

当然你可以将其写作 θ 0 , θ 1 , θ 2 {{\theta }{0}}\text{,}{{\theta }{1}},{{\theta }{2}} θ0,θ1,θ2,如果 θ 0 = 0 {{\theta }{0}}=0 θ0=0,那就是 θ 1 , θ 2 {{\theta }{1}},{{\theta }{2}} θ1,θ2的长度。在这里我将忽略 θ 0 {{\theta }{0}} θ0,这样来写 θ \theta θ的范数,它仅仅和 θ 1 , θ 2 {{\theta }{1}},{{\theta }{2}} θ1,θ2有关。但是,数学上不管你是否包含,其实并没有差别,因此在我们接下来的推导中去掉 θ 0 {{\theta }{0}} θ0不会有影响这意味着我们的目标函数是等于 1 2 ∥ θ ∥ 2 \frac{1}{2}\left\| \theta \right\|^2 21∥θ∥2。因此支持向量机做的全部事情,就是极小化参数向量 θ {{\theta }} θ范数的平方,或者说长度的平方

现在我将要看看这些项: θ T x \theta^{T}x θTx更深入地理解它们的含义。给定参数向量 θ \theta θ给定一个样本 x x x,这等于什么呢?在前一页幻灯片上,我们画出了在不同情形下, u T v u^Tv uTv的示意图,我们将会使用这些概念, θ \theta θ 和 x ( i ) x^{(i)} x(i)就类似于 u u u和 v v v 。

让我们看一下示意图:我们考察一个单一的训练样本,我有一个正样本在这里,用一个叉来表示这个样本 x ( i ) x^{(i)} x(i),意思是在水平轴上取值为 x 1 ( i ) x_1^{(i)} x1(i),在竖直轴上取值为 x 2 ( i ) x_2^{(i)} x2(i)。这就是我画出的训练样本。尽管我没有将其真的看做向量。它事实上就是一个始于原点,终点位置在这个训练样本点的向量。现在,我们有一个参数向量我会将它也画成向量。我将 θ 1 θ_1 θ1画在横轴这里,将 θ 2 θ_2 θ2 画在纵轴这里,那么内积 θ T x ( i ) θ^T x^{(i)} θTx(i) 将会是什么呢?

使用我们之前的方法,我们计算的方式就是我将训练样本投影到参数向量 θ {{\theta }} θ,然后我来看一看这个线段的长度,我将它画成红色。我将它称为 p ( i ) p^{(i)} p(i)用来表示这是第 i i i个训练样本在参数向量 θ {{\theta }} θ上的投影。根据我们之前幻灯片的内容,我们知道的是 θ T x ( i ) θ^Tx^{(i)} θTx(i)将会等于 p p p 乘以向量 θ θ θ 的长度或范数。这就等于 θ 1 ⋅ x 1 ( i ) + θ 2 ⋅ x 2 ( i ) \theta_1\cdot{x_1^{(i)}}+\theta_2\cdot{x_2^{(i)}} θ1⋅x1(i)+θ2⋅x2(i)。这两种方式是等价的,都可以用来计算 θ θ θ和 x ( i ) x^{(i)} x(i)之间的内积。

这告诉了我们什么呢?这里表达的意思是:这个 θ T x ( i ) > = 1 θ^Tx^{(i)}>=1 θTx(i)>=1 或者 θ T x ( i ) < − 1 θ^Tx^{(i)}<-1 θTx(i)<−1的,约束是可以被 p ( i ) ⋅ x > = 1 p^{(i)}\cdot{x}>=1 p(i)⋅x>=1这个约束所代替的。因为 θ T x ( i ) = p ( i ) ⋅ ∥ θ ∥ θ^Tx^{(i)}=p^{(i)}\cdot{\left\| \theta \right\|} θTx(i)=p(i)⋅∥θ∥ ,将其写入我们的优化目标。我们将会得到没有了约束, θ T x ( i ) θ^Tx^{(i)} θTx(i)而变成了 p ( i ) ⋅ ∥ θ ∥ p^{(i)}\cdot{\left\| \theta \right\|} p(i)⋅∥θ∥。

需要提醒一点,我们之前曾讲过这个优化目标函数可以被写成等于 1 2 ∥ θ ∥ 2 \frac{1}{2}\left\| \theta \right\|^2 21∥θ∥2。

现在让我们考虑下面这里的训练样本。现在,继续使用之前的简化,即 θ 0 = 0 {{\theta }_{0}}=0 θ0=0,我们来看一下支持向量机会选择什么样的决策界。这是一种选择,我们假设支持向量机会选择这个决策边界。这不是一个非常好的选择,因为它的间距很小。这个决策界离训练样本的距离很近。我们来看一下为什么支持向量机不会选择它。

看截图上的弹幕解释了 θ {{\theta }} θ**事实上是和决策界是90度正交的,**这里理解一下,很理想的情况下 p ( i ) . ∣ ∣ θ ∣ ∣ = 0 p^{(i)}.||\theta||=0 p(i).∣∣θ∣∣=0就是决策边界,支持向量机为了增强鲁棒性将其边界设置为1, p ( i ) . ∣ ∣ θ ∣ ∣ = 0 p^{(i)}.||\theta||=0 p(i).∣∣θ∣∣=0其实就是某个样本在 θ \theta θ上的投影和 θ \theta θ的乘积为0,几何意义就是决策边界上的点构成的样本是和 θ \theta θ是垂直的。
上面的公式还说明了一点,我们的目的是增大分类器的间距,即 p ( i ) p^{(i)} p(i)要大,同时我们需要使 m i n 1 2 ∑ j = 1 n θ j 2 min \frac{1}{2}\sum_{j=1}^{n}\theta_j^2 min21∑j=1nθj2尽量小,那么 p ( i ) . ∣ ∣ θ ∣ ∣ > = 1 p^{(i)}.||\theta|| >=1 p(i).∣∣θ∣∣>=1刚好可以满足 θ \theta θ小而 p ( i ) p^{(i)} p(i)要大, p ( i ) p^{(i)} p(i)大意味着分类器间距大

对于这样选择的参数 θ {{\theta }} θ,可以看到参数向量 θ {{\theta }} θ事实上是和决策界是90度正交的,因此这个绿色的决策界对应着一个参数向量 θ {{\theta }} θ这个方向,顺便提一句 θ 0 = 0 {{\theta }_{0}}=0 θ0=0的简化仅仅意味着决策界必须通过原点 ( 0 , 0 ) (0,0) (0,0)。现在让我们看一下这对于优化目标函数意味着什么。

比如这个样本,我们假设它是我的第一个样本 x ( 1 ) x^{(1)} x(1),如果我考察这个样本到参数 θ {{\theta }} θ的投影,投影是这个短的红线段,就等于 p ( 1 ) p^{(1)} p(1),它非常短。类似地,这个样本如果它恰好是 x ( 2 ) x^{(2)} x(2),我的第二个训练样本,则它到 θ {{\theta }} θ的投影在这里。我将它画成粉色,这个短的粉色线段是 p ( 2 ) p^{(2)} p(2),即第二个样本到我的参数向量 θ {{\theta }} θ的投影。因此,这个投影非常短。 p ( 2 ) p^{(2)} p(2)事实上是一个负值, p ( 2 ) p^{(2)} p(2)是在相反的方向,这个向量和参数向量 θ {{\theta }} θ的夹角大于90度, p ( 2 ) p^{(2)} p(2)的值小于0。

我们会发现这些 p ( i ) p^{(i)} p(i)将会是非常小的数,因此当我们考察优化目标函数的时候,对于正样本而言,我们需要 p ( i ) ⋅ ∥ θ ∥ > = 1 p^{(i)}\cdot{\left\| \theta \right\|}>=1 p(i)⋅∥θ∥>=1,但是如果 p ( i ) p^{(i)} p(i)在这里非常小,那就意味着我们需要 θ {{\theta }} θ的范数非常大.因为如果 p ( 1 ) p^{(1)} p(1) 很小,而我们希望 p ( 1 ) ⋅ ∥ θ ∥ > = 1 p^{(1)}\cdot{\left\| \theta \right\|}>=1 p(1)⋅∥θ∥>=1,令其实现的唯一的办法就是这两个数较大。如果 p ( 1 ) p^{(1)} p(1) 小,我们就希望 θ {{\theta }} θ的范数大。类似地,对于负样本而言我们需要 p ( 2 ) ⋅ ∥ θ ∥ < = − 1 p^{(2)}\cdot{\left\|\theta \right\|}<=-1 p(2)⋅∥θ∥<=−1。我们已经在这个样本中看到 p ( 2 ) p^{(2)} p(2)会是一个非常小的数,因此唯一的办法就是 θ {{\theta }} θ的范数变大。但是我们的目标函数是希望找到一个参数 θ {{\theta }} θ,它的范数是小的。因此,这看起来不像是一个好的参数向量 θ {{\theta }} θ的选择。

相反的,来看一个不同的决策边界。比如说,支持向量机选择了这个决策界,现在状况会有很大不同。如果这是决策界,这就是相对应的参数 θ {{\theta }} θ的方向,因此,在这个决策界之下,垂直线是决策界。使用线性代数的知识,可以说明,这个绿色的决策界有一个垂直于它的向量 θ {{\theta }} θ。现在如果你考察你的数据在横轴 x x x上的投影,比如这个我之前提到的样本,我的样本 x ( 1 ) x^{(1)} x(1),当我将它投影到横轴 x x x上,或说投影到 θ {{\theta }} θ上,就会得到这样 p ( 1 ) p^{(1)} p(1)。它的长度是 p ( 1 ) p^{(1)} p(1),另一个样本,那个样本是 x ( 2 ) x^{(2)} x(2)。我做同样的投影,我会发现, p ( 2 ) p^{(2)} p(2)的长度是负值。你会注意到现在 p ( 1 ) p^{(1)} p(1) 和 p ( 2 ) p^{(2)} p(2)这些投影长度是长多了。如果我们仍然要满足这些约束, P ( i ) ⋅ ∥ θ ∥ P^{(i)}\cdot{\left\| \theta \right\|} P(i)⋅∥θ∥>1,则因为 p ( 1 ) p^{(1)} p(1)变大了, θ {{\theta }} θ的范数就可以变小了。因此这意味着通过选择右边的决策界,而不是左边的那个,支持向量机可以使参数 θ {{\theta }} θ的范数变小很多。因此,如果我们想令 θ {{\theta }} θ的范数变小,从而令 θ {{\theta }} θ范数的平方变小,就能让支持向量机选择右边的决策界。这就是支持向量机如何能有效地产生大间距分类的原因。

看这条绿线,这个绿色的决策界。我们希望正样本和负样本投影到 θ \theta θ的值大。要做到这一点的唯一方式就是选择这条绿线做决策界。这是大间距决策界来区分开正样本和负样本这个间距的值。这个间距的值就是 p ( 1 ) , p ( 2 ) , p ( 3 ) p^{(1)},p^{(2)},p^{(3)} p(1),p(2),p(3)等等的值。通过让间距变大,即通过这些 p ( 1 ) , p ( 2 ) , p ( 3 ) p^{(1)},p^{(2)},p^{(3)} p(1),p(2),p(3)等等的值,支持向量机最终可以找到一个较小的 θ {{\theta }} θ范数。这正是支持向量机中最小化目标函数的目的。

以上就是为什么支持向量机最终会找到大间距分类器的原因。因为它试图极大化这些 p ( i ) p^{(i)} p(i)的范数,它们是训练样本到决策边界的距离。最后一点,我们的推导自始至终使用了这个简化假设,就是参数 θ 0 = 0 θ_0=0 θ0=0。

就像我之前提到的。这个的作用是: θ 0 = 0 θ_0=0 θ0=0的意思是我们让决策界通过原点。如果你令 θ 0 θ_0 θ0不是0的话,含义就是你希望决策界不通过原点。我将不会做全部的推导。实际上,支持向量机产生大间距分类器的结论,会被证明同样成立,证明方式是非常类似的,是我们刚刚做的证明的推广。

之前视频中说过,即便 θ 0 θ_0 θ0不等于0,支持向量机要做的事情都是优化这个目标函数对应着 C C C值非常大的情况,但是可以说明的是,即便 θ 0 θ_0 θ0不等于0,支持向量机仍然会找到正样本和负样本之间的大间距分隔。

总之,我们解释了为什么支持向量机是一个大间距分类器。在下一节我们,将开始讨论如何利用支持向量机的原理,应用它们建立一个复杂的非线性分类器。

核函数1

参考视频: 12 - 4 - Kernels I (16 min).mkv

回顾我们之前讨论过可以使用高级数的多项式模型来解决无法用直线进行分隔的分类问题:

为了获得上图所示的判定边界,我们的模型可能是 θ 0 + θ 1 x 1 + θ 2 x 2 + θ 3 x 1 x 2 + θ 4 x 1 2 + θ 5 x 2 2 + ⋯ {{\theta }{0}}+{{\theta }{1}}{{x}{1}}+{{\theta }{2}}{{x}{2}}+{{\theta }{3}}{{x}{1}}{{x}{2}}+{{\theta }{4}}x{1}^{2}+{{\theta }{5}}x{2}^{2}+\cdots θ0+θ1x1+θ2x2+θ3x1x2+θ4x12+θ5x22+⋯的形式。

我们可以用一系列的新的特征 f f f来替换模型中的每一项。例如令:
f 1 = x 1 , f 2 = x 2 , f 3 = x 1 x 2 , f 4 = x 1 2 , f 5 = x 2 2 {{f}{1}}={{x}{1}},{{f}{2}}={{x}{2}},{{f}{3}}={{x}{1}}{{x}{2}},{{f}{4}}=x_{1}^{2},{{f}{5}}=x{2}^{2} f1=x1,f2=x2,f3=x1x2,f4=x12,f5=x22

...得到 h θ ( x ) = θ 1 f 1 + θ 2 f 2 + . . . + θ n f n h_θ(x)={{\theta }{1}}f_1+{{\theta }{2}}f_2+...+{{\theta }_{n}}f_n hθ(x)=θ1f1+θ2f2+...+θnfn。然而,除了对原有的特征进行组合以外,有没有更好的方法来构造 f 1 , f 2 , f 3 f_1,f_2,f_3 f1,f2,f3?我们可以利用核函数来计算出新的特征。

给定一个训练样本 x x x,我们利用 x x x的各个特征与我们预先选定的地标 (landmarks ) l ( 1 ) , l ( 2 ) , l ( 3 ) l^{(1)},l^{(2)},l^{(3)} l(1),l(2),l(3)的近似程度来选取新的特征 f 1 , f 2 , f 3 f_1,f_2,f_3 f1,f2,f3。

例如: f 1 = s i m i l a r i t y ( x , l ( 1 ) ) = e ( − ∥ x − l ( 1 ) ∥ 2 2 σ 2 ) {{f}_{1}}=similarity(x,{{l}^{(1)}})=e(-\frac{{{\left\| x-{{l}^{(1)}} \right\|}^{2}}}{2{{\sigma }^{2}}}) f1=similarity(x,l(1))=e(−2σ2∥x−l(1)∥2)

其中: ∥ x − l ( 1 ) ∥ 2 = ∑ j = 1 n ( x j − l j ( 1 ) ) 2 {{\left\| x-{{l}^{(1)}} \right\|}^{2}}=\sum{{j=1}^{n}}{{({{x}{j}}-l_{j}^{(1)})}^{2}} x−l(1) 2=∑j=1n(xj−lj(1))2,为实例 x x x中所有特征与地标 l ( 1 ) l^{(1)} l(1)之间的距离的和。上例中的 s i m i l a r i t y ( x , l ( 1 ) ) similarity(x,{{l}^{(1)}}) similarity(x,l(1))就是核函数,具体而言,这里是一个高斯核函数 (Gaussian Kernel )。 注:这个函数与正态分布没什么实际上的关系,只是看上去像而已。

这里其实就是构造特征,给定一个x,然后选定不同的地标l,就可以构造不同的特征f,同时高斯函数可以看出x和l越相近特征f就等于1,越远越趋于0

这些地标的作用是什么?如果一个训练样本 x x x与地标 l l l之间的距离近似于0,则新特征 f f f近似于 e − 0 = 1 e^{-0}=1 e−0=1,如果训练样本 x x x与地标 l l l之间距离较远,则 f f f近似于 e − ( 一个较大的数 ) = 0 e^{-(一个较大的数)}=0 e−(一个较大的数)=0。

假设我们的训练样本含有两个特征[ x 1 x_{1} x1 x 2 x{_2} x2],给定地标 l ( 1 ) l^{(1)} l(1)与不同的 σ \sigma σ值,见下图:

图中水平面的坐标为 x 1 x_{1} x1, x 2 x_{2} x2而垂直坐标轴代表 f f f。可以看出,只有当 x x x与 l ( 1 ) l^{(1)} l(1)重合时 f f f才具有最大值。随着 x x x的改变 f f f值改变的速率受到 σ 2 \sigma^2 σ2的控制。

在下图中,当样本处于洋红色的点位置处,因为其离 l ( 1 ) l^{(1)} l(1)更近,但是离 l ( 2 ) l^{(2)} l(2)和 l ( 3 ) l^{(3)} l(3)较远,因此 f 1 f_1 f1接近1,而 f 2 f_2 f2, f 3 f_3 f3接近0。因此 h θ ( x ) = θ 0 + θ 1 f 1 + θ 2 f 2 + θ 1 f 3 > 0 h_θ(x)=θ_0+θ_1f_1+θ_2f_2+θ_1f_3>0 hθ(x)=θ0+θ1f1+θ2f2+θ1f3>0,因此预测 y = 1 y=1 y=1。同理可以求出,对于离 l ( 2 ) l^{(2)} l(2)较近的绿色点,也预测 y = 1 y=1 y=1,但是对于蓝绿色的点,因为其离三个地标都较远,预测 y = 0 y=0 y=0。

这样,图中红色的封闭曲线所表示的范围,便是我们依据一个单一的训练样本和我们选取的地标所得出的判定边界,在预测时,我们采用的特征不是训练样本本身的特征,而是通过核函数计算出的新特征 f 1 , f 2 , f 3 f_1,f_2,f_3 f1,f2,f3。

核函数2

参考视频: 12 - 5 - Kernels II (16 min).mkv

在上一节视频里,我们讨论了核函数这个想法,以及怎样利用它去实现支持向量机的一些新特性。在这一节视频中,我将补充一些缺失的细节,并简单的介绍一下怎么在实际中使用应用这些想法。

如何选择地标?

我们通常是根据训练集的数量选择地标的数量,即如果训练集中有 m m m个样本,则我们选取 m m m个地标,并且令: l ( 1 ) = x ( 1 ) , l ( 2 ) = x ( 2 ) , . . . . . , l ( m ) = x ( m ) l^{(1)}=x^{(1)},l^{(2)}=x^{(2)},.....,l^{(m)}=x^{(m)} l(1)=x(1),l(2)=x(2),.....,l(m)=x(m)。这样做的好处在于:现在我们得到的新特征是建立在原有特征与训练集中所有其他特征之间距离的基础之上的,即:

下面我们将核函数运用到支持向量机中,修改我们的支持向量机假设为:

• 给定 x x x,计算新特征 f f f,当 θ T f > = 0 θ^Tf>=0 θTf>=0 时,预测 y = 1 y=1 y=1,否则反之。

相应地修改代价函数为: ∑ j = 1 n = m θ j 2 = θ T θ \sum{{j=1}^{n=m}}\theta {j}{2}={{\theta}{T}}\theta ∑j=1n=mθj2=θTθ,

m i n C ∑ i = 1 m [ y ( i ) c o s t 1 ( θ T f ( i ) ) + ( 1 − y ( i ) ) c o s t 0 ( θ T f ( i ) ) ] + 1 2 ∑ j = 1 n = m θ j 2 min C\sum\limits_{i=1}^{m}{[{{y}^{(i)}}cos {{t}{1}}}( {{\theta }^{T}}{{f}^{(i)}})+(1-{{y}^{(i)}})cos {{t}{0}}( {{\theta }^{T}}{{f}^{(i)}})]+\frac{1}{2}\sum\limits_{j=1}^{n=m}{\theta _{j}^{2}} minCi=1∑m[y(i)cost1(θTf(i))+(1−y(i))cost0(θTf(i))]+21j=1∑n=mθj2

在具体实施过程中,我们还需要对最后的正则化项进行些微调整,在计算 ∑ j = 1 n = m θ j 2 = θ T θ \sum{{j=1}^{n=m}}\theta {j}{2}={{\theta}^{T}}\theta ∑j=1n=mθj2=θTθ 时,我们用 θ T M θ 代替 θ T θ , θ^TMθ代替θ^Tθ, θTMθ代替θTθ,其中 M M M是根据我们选择的核函数而不同的一个矩阵。这样做的原因是为了简化计算。

理论上讲,我们也可以在逻辑回归中使用核函数,但是上面使用 M M M来简化计算的方法不适用与逻辑回归,因此计算将非常耗费时间。

在此,我们不介绍最小化支持向量机的代价函数的方法,你可以使用现有的软件包(如liblinear ,libsvm等)。在使用这些软件包最小化我们的代价函数之前,我们通常需要编写核函数,并且如果我们使用高斯核函数,那么在使用之前进行特征缩放是非常必要的。

另外,支持向量机也可以不使用核函数,不使用核函数又称为线性核函数 (linear kernel ),当我们不采用非常复杂的函数,或者我们的训练集特征非常多而样本非常少的时候,可以采用这种不带核函数的支持向量机。

下面是支持向量机的两个参数 C C C和 σ \sigma σ的影响:

C = 1 / λ C=1/\lambda C=1/λ
C C C 较大时,相当于 λ \lambda λ较小,可能会导致过拟合,高方差;
C C C 较小时,相当于 λ \lambda λ较大,可能会导致低拟合,高偏差;
σ \sigma σ较大时,可能会导致低方差,高偏差;
σ \sigma σ较小时,可能会导致低偏差,高方差。

如果你看了本周的编程作业,你就能亲自实现这些想法,并亲眼看到这些效果。这就是利用核函数的支持向量机算法,希望这些关于偏差和方差的讨论,能给你一些对于算法结果预期的直观印象。

使用支持向量机

参考视频: 12 - 6 - Using An SVM (21 min).mkv

目前为止,我们已经讨论了SVM 比较抽象的层面,在这个视频中我将要讨论到为了运行或者运用SVM 。你实际上所需要的一些东西:支持向量机算法,提出了一个特别优化的问题。但是就如在之前的视频中我简单提到的,我真的不建议你自己写软件来求解参数 θ {{\theta }} θ,因此由于今天我们中的很少人,或者其实没有人考虑过自己写代码来转换矩阵,或求一个数的平方根等我们只是知道如何去调用库函数来实现这些功能。同样的,用以解决SVM 最优化问题的软件很复杂,且已经有研究者做了很多年数值优化了。因此你提出好的软件库和好的软件包来做这样一些事儿。然后强烈建议使用高优化软件库中的一个,而不是尝试自己落实一些数据。有许多好的软件库,我正好用得最多的两个是liblinearlibsvm,但是真的有很多软件库可以用来做这件事儿。你可以连接许多你可能会用来编写学习算法的主要编程语言。

在高斯核函数之外我们还有其他一些选择,如:

多项式核函数(Polynomial Kerne l)

字符串核函数(String kernel

卡方核函数( chi-square kernel

直方图交集核函数(histogram intersection kernel

等等...

这些核函数的目标也都是根据训练集和地标之间的距离来构建新特征,这些核函数需要满足Mercer's定理,才能被支持向量机的优化软件正确处理。

多类分类问题

假设我们利用之前介绍的一对多方法来解决一个多类分类问题。如果一共有 k k k个类,则我们需要 k k k个模型,以及 k k k个参数向量 θ {{\theta }} θ。我们同样也可以训练 k k k个支持向量机来解决多类分类问题。但是大多数支持向量机软件包都有内置的多类分类功能,我们只要直接使用即可。

尽管你不去写你自己的SVM的优化软件,但是你也需要做几件事:

1、是提出参数 C C C的选择。我们在之前的视频中讨论过误差/方差在这方面的性质。

2、你也需要选择内核参数或你想要使用的相似函数,其中一个选择是:我们选择不需要任何内核参数,没有内核参数的理念,也叫线性核函数。因此,如果有人说他使用了线性核的SVM (支持向量机),这就意味这他使用了不带有核函数的SVM (支持向量机)。

从逻辑回归模型,我们得到了支持向量机模型,在两者之间,我们应该如何选择呢?

下面是一些普遍使用的准则:
n n n为特征数, m m m为训练样本数。

(1)如果相较于 m m m而言, n n n要大许多,即训练集数据量不够支持我们训练一个复杂的非线性模型,我们选用逻辑回归模型或者不带核函数的支持向量机。

(2)如果 n n n较小,而且 m m m大小中等,例如 n n n在 1-1000 之间,而 m m m在10-10000之间,使用高斯核函数的支持向量机。

(3)如果 n n n较小,而 m m m较大,例如 n n n在1-1000之间,而 m m m大于50000,则使用支持向量机会非常慢,解决方案是创造、增加更多的特征,然后使用逻辑回归或不带核函数的支持向量机。

值得一提的是,神经网络在以上三种情况下都可能会有较好的表现,但是训练神经网络可能非常慢,选择支持向量机的原因主要在于它的代价函数是凸函数,不存在局部最小值。

在使用高斯核函数的时候,需要做特征归一化,不然会出现像有的特征权重很大,导致其他特征几乎不起作用

今天的SVM 包会工作得很好,但是它们仍然会有一些慢。当你有非常非常大的训练集,且用高斯核函数是在这种情况下,我经常会做的是尝试手动地创建,拥有更多的特征变量,然后用逻辑回归或者不带核函数的支持向量机。如果你看到这个幻灯片,看到了逻辑回归,或者不带核函数的支持向量机。在这个两个地方,我把它们放在一起是有原因的。原因是:逻辑回归和不带核函数的支持向量机它们都是非常相似的算法,不管是逻辑回归还是不带核函数的SVM ,通常都会做相似的事情,并给出相似的结果。但是根据你实现的情况,其中一个可能会比另一个更加有效。但是在其中一个算法应用的地方,逻辑回归或不带核函数的SVM 另一个也很有可能很有效。但是随着SVM的复杂度增加,当你使用不同的内核函数来学习复杂的非线性函数时,这个体系,你知道的,当你有多达1万(10,000)的样本时,也可能是5万(50,000),你的特征变量的数量这是相当大的。那是一个非常常见的体系,也许在这个体系里,不带核函数的支持向量机就会表现得相当突出。你可以做比这困难得多需要逻辑回归的事情。

最后,神经网络使用于什么时候呢? 对于所有的这些问题,对于所有的这些不同体系一个设计得很好的神经网络也很有可能会非常有效。有一个缺点是,或者说是有时可能不会使用神经网络的原因是:对于许多这样的问题,神经网络训练起来可能会特别慢,但是如果你有一个非常好的SVM 实现包,它可能会运行得比较快比神经网络快很多,尽管我们在此之前没有展示,但是事实证明,SVM 具有的优化问题,是一种凸优化问题。因此,好的SVM 优化软件包总是会找到全局最小值,或者接近它的值。对于SVM 你不需要担心局部最优。在实际应用中,局部最优不是神经网络所需要解决的一个重大问题,所以这是你在使用SVM 的时候不需要太去担心的一个问题。根据你的问题,神经网络可能会比SVM 慢,尤其是在这样一个体系中,至于这里给出的参考,看上去有些模糊,如果你在考虑一些问题,这些参考会有一些模糊,但是我仍然不能完全确定,我是该用这个算法还是改用那个算法,这个没有太大关系,当我遇到机器学习问题的时候,有时它确实不清楚这是否是最好的算法,但是就如在之前的视频中看到的算法确实很重要。但是通常更加重要的是:你有多少数据, 你有多熟练是否擅长做误差分析和排除学习算法,指出如何设定新的特征变量和找出其他能决定你学习算法的变量等方面,通常这些方面会比你使用逻辑回归还是SVM 这方面更加重要。但是,已经说过了,SVM 仍然被广泛认为是一种最强大的学习算法,这是一个体系,包含了什么时候一个有效的方法去学习复杂的非线性函数。因此,实际上与逻辑回归、神经网络、SVM 一起使用这些方法来提高学习算法,我认为你会很好地建立很有技术的状态。(编者注:当时GPU计算比较慢,神经网络还不流行。)

机器学习系统对于一个宽泛的应用领域来说,这是另一个在你军械库里非常强大的工具,你可以把它应用到很多地方,如硅谷、在工业、学术等领域建立许多高性能的机器学习系统。

作业练习

知识补充

作业描述

在本练习中,您将使用支持向量机(SVM)构建垃圾邮件分类器。在开始编程练习之前,我们强烈建议您观看视频讲座并完成相关主题的复习问题。

ex6data1.mat-示例数据集1

ex6data2.mat-示例数据集2

ex6data3.mat-示例数据集3

spamTrain.mat-垃圾邮件训练集

spamTest.mat-垃圾邮件测试集

emailSample1.txt-示例电子邮件1

emailSample2.txt-示例电子邮件2

spamSample1.txt-垃圾邮件示例1

spamSample2.txt-垃圾邮件示例2

vocab.txt-词汇列表

支持向量机

在本练习的前半部分,您将使用支持向量机(SVMs)和各种示例2D数据集。对这些数据集进行实验将帮助您直观地了解SVM是如何工作的,以及如何将高斯(Gaussian )核与SVM一起使用。在下半部分练习中,您将使用支持向量机构建垃圾邮件分类器。

示例数据集1

我们将从2D示例数据集开始,该数据集可以由线性边界分隔。脚本ex6.m将绘制训练数据(图1)。在该数据集中,阳性示例(用+表示)和阴性示例(用o表示)的位置表明由间隙表示的自然分离。但是,请注意,在最左边大约(0.1;4.1)处有一个异常值正示例+。作为本练习的一部分,您还将看到这个异常值如何影响SVM决策边界。

在练习的这一部分中,您将尝试在SVMs中使用C参数的不同值。非正式地说,C参数是一个正值,它控制对错误分类的训练示例的惩罚。一个较大的C参数告诉SVM尝试正确分类所有示例。C的作用类似于 1 λ \frac1λ λ1,其中λ是我们之前用于逻辑回归的正则化参数。

ex6.m中的下一部分将使用SVM软件运行SVM训练(C=1),该软件包含在启动代码svmTrain.m.2中。当C=1时,您应该发现SVM将决策边界放在两个数据集之间的间隙中,并对最左边的数据点进行错误分类(图2)。

:::info

实现说明:大多数SVM软件包(包括svmTrain.m)会自动为您添加额外的特征x0=1,并自动学习截距项θ0。因此,当将训练数据传递给SVM软件时,不需要自己添加这个额外的特征x0=1。特别是,在Octave/MATLAB中,您的代码应该使用训练示例x2 Rn(而不是x2 Rn+1);例如在第一示例数据集x2 R2中。

:::

您的任务是在此数据集上尝试不同的C值。具体来说,您应该将脚本中的C值更改为C=100,然后再次运行SVM训练。当C=100时,您应该会发现SVM现在对每一个例子都进行了正确的分类,但它的决策边界似乎并不适合数据(图3)。

高斯(Gaussian )核支持向量机

在练习的这一部分中,您将使用SVMs进行非线性分类。特别是,您将在不可线性分离的数据集上使用具有高斯核的SVMs。

高斯(Gaussian )核

为了用支持向量机找到非线性决策边界,我们需要首先实现高斯核。你可以把高斯核看作是一个相似性函数,它测量一对例子之间的距离, ( x ( i ) , x ( j ) ) (x^{(i)},x^{(j)}) (x(i),x(j))。高斯核还通过带宽参数σ来参数化,σ决定了当例子相距更远时,相似性度量下降(到0)的速度。

您现在应该在gaussianKernel.m中完成代码以进行计算两个例子之间的高斯核, ( x ( i ) , x ( j ) ) (x^{(i)},x^{(j)}) (x(i),x(j))。高斯核函数定义为:

一旦您完成了函数gaussianKernel.m,脚本ex6.m将在提供的两个示例上测试您的内核函数,您应该会看到0.324652的值。

示例数据集2

ex6.m中的下一部分将加载并绘制数据集2(图4)。在该图中,您可以观察到,对于该数据集,没有线性决策边界来区分正示例和负示例。然而,通过将高斯核与SVM结合使用,您将能够学习一个非线性决策边界,该边界可以对数据集执行得相当好。

如果您已经正确地实现了高斯核函数,ex6.m将继续在该数据集上使用高斯核来训练SVM。

图5显示了具有高斯核的SVM找到的决策边界。决策边界能够正确地分离大多数正面和负面例子,并很好地遵循数据集的轮廓。

示例数据集3

在这部分练习中,您将获得更多关于如何使用带有高斯核的SVM的实用技能。ex6.m的下一部分将加载并显示第三个数据集(图6)。您将在这个数据集中使用带有高斯核的SVM。

在所提供的数据集ex6data3.mat中,您得到了变量X,y、Xval、yval。ex6.m中提供的代码使用训练集(X,y)使用从数据集3Params.m加载的参数来训练SVM分类器。

您的任务是使用交叉验证集Xval,yval来确定最佳C和σ参数。您应该编写任何必要的附加代码来帮助您搜索参数C和σ。对于C和σ,我们建议以乘法步骤尝试值(例如,0.01;0.03;0.1;0.3;1;3;10;30)。请注意,您应该尝试C和σ的所有可能的值对(例如,C=0.3和σ=0.1)。例如,如果你尝试上面列出的C和 σ 2 σ^2 σ2的8个值中的每一个,你最终会训练和评估(在交叉验证集上)总共 8 2 = 64 8^2=64 82=64个不同的模型。

在您确定了要使用的最佳C和σ参数后,您应该修改dataset3Params.m中的代码,填写您找到的最佳参数。对于我们的最佳参数,SVM返回了一个决策边界,如图7所示。

实现提示:当实现交叉验证以选择要使用的最佳C和σ参数时,您需要评估交叉验证集上的错误。回想一下,对于分类,错误被定义为交叉验证示例中分类错误的部分。在Octave/MATLAB中,您可以使用均值(double(predictions ~=yval))计算此误差,其中predictions是包含SVM的所有预测的向量,yval是交叉验证集的真实标签。您可以使用svmPredict函数为交叉验证集生成预测。

垃圾邮件分类

如今,许多电子邮件服务提供垃圾邮件过滤器,能够高精度地将电子邮件分类为垃圾邮件和非垃圾邮件。在练习的这一部分中,您将使用SVM来构建自己的垃圾邮件过滤器。

您将训练一个分类器来分类给定的电子邮件x是垃圾邮件(y=1)还是非垃圾邮件(y=0)。特别是,您需要将每封电子邮件转换为一个特征向量 x ∈ R n x\in \R^n x∈Rn。练习的以下部分将引导您了解如何从电子邮件中构建这样的特征向量。

在本练习的其余部分中,您将使用脚本ex6-spam.m。本练习包含的数据集基于SpamAssassin公共语料库的一个子集。就本练习而言,您将仅使用电子邮件的正文(不包括电子邮件标题)。

预处理电子邮件

在开始执行机器学习任务之前,通常会深入了解数据集中的示例。图8显示了一个示例电子邮件,其中包含一个URL、一个电子邮件地址(在末尾)、数字和金额。虽然许多电子邮件将包含类似类型的实体(例如,数字、其他URL或其他电子邮件地址),但几乎每封电子邮件中的特定实体(例如特定URL或特定金额)都是不同的。因此,在处理电子邮件时经常使用的一种方法是"规范化"这些值,以便所有URL都被相同对待,所有数字都被相同处理,等等。例如,我们可以用唯一的字符串"httpaddr"替换电子邮件中的每个URL,以指示存在URL。

这具有让垃圾邮件分类器根据是否存在任何URL而不是是否存在特定URL来做出分类决定的效果。这通常会提高垃圾邮件分类器的性能,因为垃圾邮件发送者经常将URL随机化,因此在新的垃圾邮件中再次看到任何特定URL的几率非常小。

在processEmail.m中,我们实现了以下电子邮件预处理和规范化步骤:

  • 小写:整个电子邮件被转换为小写,因此忽略标题(例如,IndIcaTE与IndIcaTE相同)。
  • 剥离HTML:所有HTML标记都将从电子邮件中删除。许多电子邮件通常带有HTML格式;我们删除了所有的HTML标记,这样只剩下内容。
  • 规范URL:所有URL都替换为文本"httpaddr"。
  • 规范电子邮件地址:所有电子邮件地址都替换为"emailaddr"。
  • 标准化数字:所有数字都替换为文本"数字"。
  • 美元标准化:所有美元符号($)均替换为文本"美元"。
  • 词干:单词被简化为词干形式。例如,"discount"、"discounts"和"discount"都是替换为"折扣"。有时,Stemmer实际上会脱光衣服从末尾开始的附加字符,因此"include"、"includes"、"included",和"including "均替换为"includ "。
  • 删除非单词:删除了非单词和标点符号。所有的空格(制表符、换行符、空格)都被修剪为一个空格字符。

这些预处理步骤的结果如图9所示。虽然预处理留下了单词片段和非单词,但这种形式更容易用于执行特征提取。

词汇表

在对电子邮件进行预处理后,我们为每封电子邮件提供了一个单词列表(例如,图9)。下一步是选择我们想在分类器中使用哪些单词,以及我们想省略哪些单词。

在这个练习中,我们只选择了最频繁出现的单词作为我们考虑的单词集(词汇表)。由于训练集中很少出现的单词只出现在少数电子邮件中,它们可能会导致模型过度拟合我们的训练集。完整的词汇表列表在vocab.txt文件中,如图10所示。我们的词汇表是通过选择垃圾邮件语料库中出现至少100次的所有单词来选择的,得到了1899个单词的列表。在实践中,通常使用一个包含大约10000到50000个单词的词汇表。

给定词汇表,我们现在可以将预处理电子邮件中的每个单词(例如,图9)映射到单词索引列表中,该列表包含词汇表中单词的索引。图11显示了示例电子邮件的映射。具体来说,在示例电子邮件中,单词"anyone"首先被标准化为"anyon",然后映射到词汇表中的索引86。

您现在的任务是完成processEmail.m中的代码以执行此映射。在代码中,您会得到一个字符串str,它是处理过的电子邮件中的一个单词。您应该在词汇表vocabList中查找该单词,并查找该单词是否存在于词汇表中。如果单词存在,则应将该单词的索引添加到单词索引变量中。如果该单词不存在,因此不在词汇表中,则可以跳过该单词。

一旦您实现了processEmail.m,脚本ex6-spam.m将在电子邮件示例上运行您的代码,您应该会看到类似于图9和图11的输出。

从电子邮件中提取功能

现在,您将实现将每个电子邮件转换为 R n \R^n Rn中的向量的特征提取。在本练习中,您将使用词汇表中的 n = # n=\# n=#个单词。具体来说,特征 x i ∈ { 0 , 1 } x_i \in \{0,1\} xi∈{0,1}对应于字典中的第i个单词是否出现在电子邮件中。也就是说,如果电子邮件中有第i个单词,则 x i = 1 x_i=1 xi=1;如果电子邮件中没有第i个词,则 x i = 0 x_i=0 xi=0。

因此,对于典型的电子邮件,此功能看起来像:

现在,您应该完成emailFeatures.m中的代码,以便在给定单词索引的情况下为电子邮件生成特征向量。

用于垃圾邮件分类的SVM训练

完成特征提取功能后,ex6-spam.m的下一步将加载一个预处理的训练数据集,该数据集将用于训练SVM分类器。spamTrain.mat包含4000个垃圾邮件和非垃圾邮件的训练示例,而spamTest.mat包含1000个测试示例。每个原始电子邮件都使用processEmail和emailFeatures函数进行处理,并转换为向量 x ( i ) ∈ R 1899 x^{(i)} \in \R^{1899} x(i)∈R1899。

加载数据集后,ex6-spam.m将继续训练SVM来在垃圾邮件(y=1)和非垃圾邮件(y=0)之间进行分类。一旦训练完成,你应该看到分类器的训练准确率约为99.8%,测试准确率约98.5%。

垃圾邮件的主要预测因素

为了更好地理解垃圾邮件分类器是如何工作的,我们可以检查参数,看看分类器认为哪些单词最能预测垃圾邮件。ex6-spam.m的下一步在分类器中找到具有最大正值的参数,并显示相应的单词(图12)。因此,如果一封电子邮件包含诸如"保证"、"删除"、"美元"和"价格"之类的词(图12所示的最重要的预测因素),那么它很可能被归类为垃圾邮件。

可选(未分级)练习:尝试自己的电子邮件

既然你已经训练了一个垃圾邮件分类器,你就可以开始在自己的电子邮件上尝试了。在起始代码中,我们包含了两个电子邮件示例(emailSample1.txt和emailSample2.txt)和两个垃圾邮件示例(spamSample1.txt和spamSample2.txt)。ex6-spam.m的最后一部分在第一个垃圾邮件示例上运行垃圾邮件分类器,并使用学习到的SVM对其进行分类。您现在应该尝试我们提供的其他示例,看看分类器是否正确。您也可以尝试使用自己的电子邮件,将示例(纯文本文件)替换为自己的电子邮件。

可选(未分级)练习:构建自己的数据集

在这个练习中,我们提供了一个经过预处理的训练集和测试集。这些数据集是使用您现在已经完成的相同函数(processEmail.m和emailFeatures.m)创建的。对于这个可选(未分级)练习,您将使用SpamAssassin公共语料库中的原始电子邮件构建自己的数据集。

在这个可选(未分级)练习中,您的任务是从公共语料库下载原始文件并提取它们。提取它们之后,您应该在每封电子邮件上运行processEmail和emailFeatures函数,以从每封电子邮件中提取一个特征向量。这将允许您构建示例的数据集X,y。然后,您应该将数据集随机划分为训练集、交叉验证集和测试集。

当您构建自己的数据集时,我们还鼓励您尝试构建自己的词汇表(通过选择数据集中出现的高频词),并添加您认为可能有用的任何其他功能。

最后,我们还建议尝试使用高度优化的SVM工具箱,例如LIBSVM

作业提交路径

总结

  • 支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本非线性高维模式识别中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中。
  • Logistic回归目的是从特征学习出一个0/1分类模型,而这个模型是将特性的线性组合作为自变量,由于自变量的取值范围是负无穷到正无穷。因此,使用logistic函数(或称作sigmoid函数)将自变量映射到(0,1)上,映射后的值被认为是属于y=1的概率
  • 线性分类器(一定意义上,也可以叫做感知机) 是最简单也很有效的分类器形式.
  • 支持向量机(Support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,他的学习策略就是间隔最大化,同时该方法可以形式化为一个求解图二次规划。
  • SVM由简至繁可分为三类 :线性可分支持向量机、硬间隔(hard-margin svm);线性支持向量机、软间隔(soft-margin svm);非线性支持向量机、Kernel SVM。

问题一

这个里面为甚这么画?向量的表示形式

问题二

感兴趣可以证明一下这个推理过程

问题三

为什么使用核函数?

支持向量机(Support Vector Machine,SVM)使用核函数是为了处理非线性可分的数据。在某些情况下,数据在原始特征空间中无法被一个线性超平面完美地分割开。为了解决这个问题,SVM引入了核函数的概念。

核函数允许我们在原始特征空间中进行非线性映射,将数据映射到更高维的特征空间,从而使得数据在高维空间中线性可分。在高维空间中,我们可以通过一个线性超平面来分隔数据,然后将这个超平面的投影映射回原始特征空间,从而得到在原始特征空间中的非线性决策边界。

使用核函数的好处有:

  1. 非线性分类:通过核函数,SVM可以处理复杂的非线性决策边界,从而更好地适应复杂的数据分布。
  2. 避免高维计算:在直接映射数据到高维空间进行分类时,计算复杂度会显著增加。但使用核函数,我们可以在原始低维特征空间中计算核函数的值,避免了在高维空间进行复杂计算。

常见的核函数有:

  1. 线性核函数:K(x, z) = x·z,实现线性分类。
  2. 多项式核函数:K(x, z) = (γx·z + r)^d,实现多项式分类。
  3. 高斯(径向基函数)核函数:K(x, z) = exp(-γ ||x - z||^2),实现非线性分类。
  4. Sigmoid核函数:K(x, z) = tanh(γx·z + r),实现非线性分类。

选择合适的核函数取决于数据的特点和问题的复杂性。核函数的选择不仅可以提高分类性能,还可以降低计算成本,使得SVM成为一个强大的非线性分类算法。

相关内容

相关推荐
sp_fyf_20248 分钟前
【大语言模型】ACL2024论文-35 WAV2GLOSS:从语音生成插值注解文本
人工智能·深度学习·神经网络·机器学习·语言模型·自然语言处理·数据挖掘
AITIME论道8 分钟前
论文解读 | EMNLP2024 一种用于大语言模型版本更新的学习率路径切换训练范式
人工智能·深度学习·学习·机器学习·语言模型
明明真系叻1 小时前
第二十六周机器学习笔记:PINN求正反解求PDE文献阅读——正问题
人工智能·笔记·深度学习·机器学习·1024程序员节
88号技师3 小时前
2024年12月一区SCI-加权平均优化算法Weighted average algorithm-附Matlab免费代码
人工智能·算法·matlab·优化算法
IT猿手3 小时前
多目标应用(一):多目标麋鹿优化算法(MOEHO)求解10个工程应用,提供完整MATLAB代码
开发语言·人工智能·算法·机器学习·matlab
88号技师3 小时前
几款性能优秀的差分进化算法DE(SaDE、JADE,SHADE,LSHADE、LSHADE_SPACMA、LSHADE_EpSin)-附Matlab免费代码
开发语言·人工智能·算法·matlab·优化算法
我要学编程(ಥ_ಥ)3 小时前
一文详解“二叉树中的深搜“在算法中的应用
java·数据结构·算法·leetcode·深度优先
埃菲尔铁塔_CV算法3 小时前
FTT变换Matlab代码解释及应用场景
算法
许野平4 小时前
Rust: enum 和 i32 的区别和互换
python·算法·rust·enum·i32
chenziang14 小时前
leetcode hot100 合并区间
算法