吴恩达教授的机器学习课程的第七周相关内容:
支持向量机(Support Vector Machines)
1、优化目标
还有一个更加强大的算法广泛的应用于工业界和学术界,它被称为支持向量机(Support Vector
Machine)。与逻辑回归和神经网络相比,支持向量机,或者简称 SVM,在学习复杂的非线性
方程时提供了一种更为清晰,更加强大的方式。将会从逻辑回归开始展示我们如何一点一点修改来得到本质上的支持向量机。
这里,我用自己的话总结下,对于一个标记y=1,那么我们的目标就是预测为1,即h=1,就需要z远大于0,相反,对于一个标记y=0,那么我们的目标就是预测为0,即h=1,就需要z远小于0。
给这两个方程命名,左边的函数,我称之为 cost1(z),同时,右
边函数我称它为 cost0(z) 。这里的下标是指在代价函数中,对应的 y=1 和 y=0 的情况,拥有
了这些定义后,现在,我们就开始构建支持向量机。
你可以把这里的参数 C 考虑成 1/λ,同 1/λ 所扮演的角色相同.
最后有别于逻辑回归输出的概率。在这里,我们的代价函数,当最小化代价函数,获得参数
θ
\theta
θ时,支持向量机所做的是它来直接预测 y 的值等于 1,还是等于 0。
小结:由逻辑回归来推出SVM的损失函数。
2、大边界的直观理解
人们有时将支持向量机看作是大间距分类器。
其实我们仅仅要求
θ
⊤
x
>
0
\theta ^{\top }x>0
θ⊤x>0大于等于 0,就能将该样本恰当分出,这是因为如果
θ
⊤
x
>
0
\theta ^{\top }x>0
θ⊤x>0的话,我们的模型代价函数值为 0,类似地,如果你有一个负样本,则仅需要
θ
⊤
x
<
0
\theta ^{\top }x<0
θ⊤x<0 就会将负例正确分离,但是,支持向量机的要求更高,不仅仅要能正确分开输入的样本,即不仅要求
θ
⊤
x
>
0
\theta ^{\top }x>0
θ⊤x>0,我们需要的是比 0 值大很多,比如大于等于 1,我也想这个比 0 小很多,比如我希望它小于等于-1,这就相当于在支持向量机中嵌入了一个额外的安全因子。或者说安全的间距因子。
如果 C 非常大,则最小化代价函数的时候,我们将会很希望找到一个使第一项为 0 的最优解。因此,让我们尝试在代价项的第一项为 0 的情形下理解该优化问题。比如我们可以把 C 设置成了非常大的常数,这将给我们一些关于支持向量机模型的直观感受。
具体而言,如果你考察这样一个数据集,其中有正样本,也有负样本,可以看到这个数据集是线性可分的。我的意思是,存在一条直线把正负样本分开。当然有多条不同的直线,可以把正样本和负样本完全分开。
这条黑线有更大的距离,这个距离叫做间距 (margin)。
当画出这两条额外的蓝线,我们看到黑色的决策界和训练样本之间有更大的最短距离。然而粉线和蓝线离训练样本就非常近,在分离样本的时候就会比黑线表现差。因此,这个距离叫做支持向量机的间距,而这是支持向量机具有鲁棒性的原因,因为它努力用一个最大间距来分离样本。因此支持向量机有时被称为大间距分类器。
那么在让代价函数最小化的过程中,我们希望找出在 y=1 和 y=0 两种情况下都使得代价函数中左边的这一项尽量为零的参数。如果我们找到了这样的参数,则我们的最小化问题便转变成:
事实上,支持向量机现在要比这个大间距分类器所体现得更成熟,尤其是当你使用大间距分类器的时候,你的学习算法会受异常点 (outlier) 的影响。
如果你将 C 设置的不要太大,则你最终会得到这条黑线, 当然数据如果不
是线性可分的,如果你在这里有一些正样本或者你在这里有一些负样本,则支持向量机也会将它们恰当分开。当 C 不是非常非常大的时候,它可以忽略掉一些异常点的影响,得到更好的决策界。 甚至当你的数据不是线性可分的时候,支持向量机也可以给出好的结果。
回顾 C=1/λ, 因此:
C 较大时, 相当于 λ 较小, 可能会导致过拟合, 高方差。
C 较小时, 相当于 λ 较大, 可能会导致低拟合, 高偏差。
小结:解释了为什么支持向量机被看做大间距分类器。
3、数学背后的大边界分类(选修)
u
⊤
v
u ^{\top }v
u⊤v也叫做向量u 和 v 之间的内积。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 和 v 之间的内积。这就是具体做法,我们将向量 v 投影到向量u 上,我们做一个直角投影,或者说一个 90 度投影将其投影到u 上,接下来我度量这条红线的长度。我称这条红线的长度为 p,因此 p 就是长度,或者说是向量 v 投影到向量u 上的量,我将它写下来, p 是 v 投影到向量 u 上的长度,因此可以将
u
⊤
v
=
p
.
∥
u
∥
u^{\top }v=p.\left \| u \right \|
u⊤v=p.∥u∥,或者说 u 的长度。这是计算内积的一种方法。
这就是我们先前给出的支持向量机模型中的目标函数。为了讲解方便,我做一点简化,仅仅是为了让目标函数更容易被分析。
因此支持向量机做的全部事情,就是极小化参数向量
θ
\theta
θ 范数的平方, 或者说长度的平方。
θ
\theta
θ和
x
(
i
)
x^{\left ( i \right )}
x(i) 就类似于u 和 v,故
θ
⊤
.
x
(
i
)
=
p
(
i
)
.
∥
θ
∥
\theta ^{\top }.x^{\left ( i \right )}=p^{\left ( i \right )}.\left \| \theta \right \|
θ⊤.x(i)=p(i).∥θ∥,所以可以将后者作为我们的优化目标。
我们来看一下支持向量机会选择什么样的决策界。这是一种选择,我们假设支持向量机会选择这个决策边界。这不是一个非常好的选择,因为它的间距很小。这个决策界离训练样本的距离很近。我们来看一下为什么支持向量机不会选择它。
对于这样选择的参数
θ
\theta
θ,可以看到参数向量
θ
\theta
θ事实上是和决策界是 90 度正交的,因此这个绿色的决策界对应着一个参数向量
θ
\theta
θ 指向这个方向,顺便提一句
θ
0
=
0
\theta _{0}=0
θ0=0的简化仅仅意味着决策界必须通过原点 (0,0)。现在让我们看一下这对于优化目标函数意味着什么。
比如这个样本,我们假设它是我的第一个样本 x(1),如果我考察这个样本到参数 的投影,投影是这个短的红线段,就等于 p(1),它非常短。类似地,这个样本如果它恰好是 x(2),我的第二个训练样本,则它到
θ
\theta
θ 的投影在这里。我将它画成粉色,这个短的粉色线段是 p(2),即第二个样本到我的参数量
θ
\theta
θ的投影。因此,这个投影非常短。 p(2)事实上是一个负值, p(2)是在相反的方向,这个向量和参数向量
θ
\theta
θ 的夹角大于 90 度, p(2)的值小于 0。我们会发现这些 p(i)将会是非常小的数,因此当我们考察优化目标函数的时候,对于正样本而言,我们需要
p
(
i
)
.
∥
θ
∥
≥
1
p^{\left ( i \right )}.\left \| \theta \right \|\geq 1
p(i).∥θ∥≥1,但是如果 p(i) 在这里非常小,那就意味着我们需要 θ 的范数非常大.因为如果 p(1) 很小,而我们希望
p
(
1
)
.
∥
θ
∥
≥
1
p^{\left ( 1\right )}.\left \| \theta \right \|\geq 1
p(1).∥θ∥≥1,令其实现的唯一的办法就是这两个数较大。 如果 p(1)小, 我们就希望 θ 的范数大。 类似地, 对于负样本而言我们需要
p
(
2
)
.
∥
θ
∥
≤
−
1
p^{\left ( 2\right )}.\left \| \theta \right \|\leq -1
p(2).∥θ∥≤−1。我们已经在这个样本中看到 p(2)会是一个非常小的数,因此唯一的办法就是
θ
\theta
θ 的范数变大。但是我们的目标函数是希望找到一个参数
θ
\theta
θ ,它的范数是小的。
相反的,来看一个不同的决策边界。比如说,支持向量机选择了这个决策界,现在状况会有很大不同。如果这是决策界, 这就是相对应的参数 θ 的方向, 因此, 在这个决策界之下,垂直线是决策界。使用线性代数的知识,可以说明,这个绿色的决策界有一个垂直于它的向量θ 。现在如果你考察你的数据在横轴 x 上的投影,比如这个我之前提到的样本,我的样本x(1), 当我将它投影到横轴 x 上, 或说投影到 θ 上, 就会得到这样的 p(1)。 它的长度是 p(1),另一个样本,那个样本是 x(2)。我做同样的投影,我会发现, p(2)的长度是负值。你会注意到现在 p(1) 和 p(2)这些投影长度是长多了。如果我们仍然要满足这些约束,
p
(
1
)
.
∥
θ
∥
≥
1
p^{\left ( 1\right )}.\left \| \theta \right \|\geq 1
p(1).∥θ∥≥1,则因为 p(1)变大了, θ 的范数就可以变小了。因此这意味着通过选择右边的决策界,而不是左边的那个, 支持向量机可以使参数 θ 的范数变小很多。 因此, 如果我们想令θ的范数变小,从而令θ 范数的平方变小,就能让支持向量机选择右边的决策界。这就是支持向量机如何能有效地产生大间距分类的原因。
以上就是为什么支持向量机最终会找到大间距分类器的原因。因为它试图极大化这些 p(i)的范数,它们是训练样本到决策边界的距离。最后一点,我们的推导自始至终使用了这个简化假设, 就是参数 θ0 =0。
就像我之前提到的。 这个的作用是: θ0 = 0 的意思是我们让决策界通过原点。 如果你令θ0不是 0 的话, 含义就是你希望决策界不通过原点。
小结:解释了为什么支持向量机是一个大间距分类器。
4、核函数 1
回顾我们之前讨论过可以使用高级数的多项式模型来解决无法用直线进行分隔的分类问题:
为了获得上图所示的判定边界,我们的模型可能是:
我们可以用一系列的新的特征 f 来替换模型中的每一项。例如令:
…得到 hθ(x)=f1+f2+…+fn。 然而, 除了对原有的特征进行组合以外, 有没有更好的方法来构造 f1,f2,f3?我们可以利用核函数来计算出新的特征。
给定一个训练实例 x,我们利用 x 的各个特征与我们预先选定的地标(landmarks)l(1),l(2),l(3)的近似程度来选取新的特征 f1,f2,f3。
为实例 x 中所有特征与地标 l(1)之间的距离的和。上例中的 similarity(x,l(1))就是核函数,具体而言,这里是一个高斯核函数(GaussianKernel)。这个函数与正态分布没什么实际上的关系。
这些地标的作用是什么?如果一个训练实例 x 与地标 L 之间的距离近似于 0,则新特征f 近似于 e-0=1,如果训练实例 x 与地标 L 之间距离较远,则 f 近似于 e-(一个较大的数)=0。
假设我们的训练实例含有两个特征[x1 x2], 给定地标 l(1)与不同的 σ 值, 见下图:
图中水平面的坐标为 x1, x2而垂直坐标轴代表 f。可以看出,只有当 x 与 l(1)重合时 f 才具有最大值。 随着 x 的改变 f 值改变的速率受到 σ2的控制。
当实例处于洋红色的点位置处,因为其离 l(1)更近,但是离 l(2)和 l(3)较远,因
此 f1接近 1, 而 f2,f3 接近 0。 因此 hθ(x)=θ0+θ1f1+θ2f2+θ1f3>0, 因此预测 y=1。 同理可以求出,对于离 l(2)较近的绿色点,也预测 y=1,但是对于蓝绿色的点,因为其离三个地标都较远,预测 y=0。
小结:介绍了高斯核函数及其地标作用。
5、核函数 2
如何选择地标?
我们通常是根据训练集的数量选择地标的数量,即如果训练集中有 m 个实例,则我们选取 m 个地标,并且令: l(1)=x(1),l(2)=x(2),…,l(m)=x(m)。这样做的好处在于:现在我们得到的新特征是建立在原有特征与训练集中所有其他特征之间距离的基础之上的,即:
下面我们将核函数运用到支持向量机中,修改我们的支持向量机假设为:
• 给定 x, 计算新特征 f, 当 θTf>=0 时, 预测 y=1, 否则反之。 相应地修改代价函数为:
在具体实施过程中,我们还需要对最后的正则化项进行些微调整,在计算第二部分时, 我们用 θTMθ 代替 θTθ, 其中 M 是根据我们选择的核函数而不同的一个矩阵。 这样做的原因是为了简化计算。
另外,支持向量机也可以不使用核函数,不使用核函数又称为线性核函数(linear kernel),当我们不采用非常复杂的函数,或者我们的训练集特征非常多而实例非常少的时候,可以采用这种不带核函数的支持向量机。
下面是支持向量机的两个参数 C 和 σ 的影响:
C=1/λ
C 较大时, 相当于 λ 较小, 可能会导致过拟合, 高方差;
C 较小时, 相当于 λ 较大, 可能会导致低拟合, 高偏差;
σ 较大时, 可能会导致低方差, 高偏差;
σ 较小时, 可能会导致低偏差, 高方差。
小结:解释了高斯核究竟怎么决定的决策边界。
6、使用支持向量机
强烈建议使用高优化软件库中的一个,而不是尝试自己落实
一些数据。有许多好的软件库,我正好用得最多的两个是 liblinear 和 libsvm,但是真的有很多软件库可以用来做这件事儿。
在高斯核函数之外我们还有其他一些选择,如:
多项式核函数(Polynomial Kernel)
字符串核函数(String kernel)
卡方核函数(chi-square kernel)
直方图交集核函数(histogram intersection kernel)
等等…
这些核函数的目标也都是根据训练集和地标之间的距离来构建新特征,这些核函数需要满足 Mercer’s 定理,才能被支持向量机的优化软件正确处理。
1、是提出参数 C 的选择。我们在之前的视频中讨论过误差/方差在这方面的性质。
2、你也需要选择内核参数或你想要使用的相似函数,其中一个选择是:我们选择不需要任何内核参数,没有内核参数的理念,也叫线性核函数。因此,如果有人说他使用了线性核的 SVM(支持向量机),这就意味这他使用了不带有核函数的 SVM(支持向量机)。
从逻辑回归模型,我们得到了支持向量机模型,在两者之间,我们应该如何选择呢?
下面是一些普遍使用的准则:
n 为特征数, m 为训练样本数。
(1)如果相较于 m 而言, n 要大许多,即训练集数据量不够支持我们训练一个复杂的非线性模型,我们选用逻辑回归模型或者不带核函数的支持向量机。
(2)如果 n 较小,而且 m 大小中等,例如 n 在 1-1000 之间,而 m 在 10-10000 之间,使用高斯核函数的支持向量机。
(3)如果 n 较小,而 m 较大,例如 n 在 1-1000 之间,而 m 大于 50000,则使用支持向量机会非常慢,解决方案是创造、增加更多的特征,然后使用逻辑回归或不带核函数的支持向量机。
值得一提的是,神经网络在以上三种情况下都可能会有较好的表现,但是训练神经网络可能非常慢,选择支持向量机的原因主要在于它的代价函数是凸函数,不存在局部最小值。
小结:SVM模型的选择。
7、第七周编程题
1、gaussianKernel.m sim=exp(-sum((x1-x2).^2)
/(2*sigma^2));
2、dataset3Params.m
values=[0.01 0.03,0.1 0.3 1 3 10 30];
error_min=inf;
for C=values
for sigma=values
model=svmTrain(X,y,C,@(x1,x2) gaussianKernel(x1, x2, sigma));
predictions=svmPredict(model,Xval);
error=mean(double(predictions ~= yval));
if error<error_min
error_min=error;
fin_C=C;
fin_sigma=sigma;
end
end
end
C=fin_C;
sigma=fin_sigma;
3、processEmail.m
for i=1:length(vocabList)
if strcmp(str,vocabList(i))==1
word_indices=[word_indices;i];
end
end
4、emailFeatures.m
for i=word_indices
x(i)=1;
end