机器学习(六)——高斯判别法(GDA)

6.高斯判别法(GDA)

多元正态分布

p(x;μ,Σ)=1(2π)n/2Σ1/2exp(12(xμ)TΣ1(xμ)) p(x;\mu,\Sigma)=\frac{1}{(2\pi)^{n/2}|\Sigma|^{1/2}} exp(-\frac{1}{2}(x-\mu)^T\Sigma^{-1}(x-\mu))

假如我们有一个分类问题,其中输入特征 xx 是一系列的连续随机变量(continuous-valued random variables),那就可以使用高斯判别分析(Gaussian Discriminant Analysis ,缩写为 GDA)模型,其中对 p(xy)p(x|y)用多元正态分布来进行建模。这个模型为:
yBernoulli(ϕ)xy=0N(μo,Σ)xy=1N(μ1,Σ) \begin{aligned} y & \sim Bernoulli(\phi)\\ x|y = 0 & \sim N(\mu_o,\Sigma)\\ x|y = 1 & \sim N(\mu_1,\Sigma)\\ \end{aligned}
分布写出来的具体形式如下:
p(y)=ϕy(1ϕ)1yp(xy=0)=1(2π)n/2Σ1/2exp(12(xμ0)TΣ1(xμ0))p(xy=1)=1(2π)n/2Σ1/2exp(12(xμ1)TΣ1(xμ1)) \begin{aligned} p(y) & =\phi^y (1-\phi)^{1-y}\\ p(x|y=0) & = \frac{1}{(2\pi)^{n/2}|\Sigma|^{1/2}} exp ( - \frac{1}{2}(x-\mu_0)^T\Sigma^{-1}(x-\mu_0) )\\ p(x|y=1) & = \frac{1}{(2\pi)^{n/2}|\Sigma|^{1/2}} exp ( - \frac{1}{2}(x-\mu_1)^T\Sigma^{-1}(x-\mu_1) )\\ \end{aligned}
在上面的等式中,模型的参数包括ϕ,Σ,μ0μ1\phi, \Sigma, \mu_0 和 \mu_1。(要注意,虽然这里有两个不同方向的均值向量μ0\mu_0μ1\mu_1,针对这个模型还是一般只是用一个协方差矩阵Σ\Sigma。)取对数的似然函数(log-likelihood)如下所示:
l(ϕ,μ0,μ1,Σ)=logi=1mp(x(i),y(i);ϕ,μ0,μ1,Σ)=logi=1mp(x(i)y(i);μ0,μ1,Σ)p(y(i);ϕ) \begin{aligned} l(\phi,\mu_0,\mu_1,\Sigma) &= \log \prod^m_{i=1}p(x^{(i)},y^{(i)};\phi,\mu_0,\mu_1,\Sigma)\\ &= \log \prod^m_{i=1}p(x^{(i)}|y^{(i)};\mu_0,\mu_1,\Sigma)p(y^{(i)};\phi)\\ \end{aligned}
通过使 ll 取得最大值,找到对应的参数组合,然后就能找到该参数组合对应的最大似然估计,如下所示(参考习题集1):
ϕ=1mi=1m1{y(i)=1}μ0=i=1m1{y(i)=0}x(i)i=1m1{y(i)=0}μ1=i=1m1{y(i)=1}x(i)i=1m1{y(i)=1}Σ=1mi=1m(x(i)μy(i))(x(i)μy(i))T \begin{aligned} \phi & = \frac {1}{m} \sum^m_{i=1}1\{y^{(i)}=1\}\\ \mu_0 & = \frac{\sum^m_{i=1}1\{y^{(i)}=0\}x^{(i)}}{\sum^m_{i=1}1\{y^{(i)}=0\}}\\ \mu_1 & = \frac{\sum^m_{i=1}1\{y^{(i)}=1\}x^{(i)}}{\sum^m_{i=1}1\{y^{(i)}=1\}}\\ \Sigma & = \frac{1}{m}\sum^m_{i=1}(x^{(i)}-\mu_{y^{(i)}})(x^{(i)}-\mu_{y^{(i)}})^T\\ \end{aligned}
用图形化的方式来表述,这个算法可以按照下面的图示所表示:
机器学习(六)——高斯判别法(GDA)
高斯判别模型能比逻辑回归对数据进行更强的建模和假设(stronger modeling assumptions)。这也就意味着,在这两种模型假设都可用的时候,高斯判别分析法去拟合数据是更好的,是一个更好的模型。 尤其当p(xy)p(x|y)已经确定是一个高斯分布(有共享的协方差矩阵Σ\Sigma),那么高斯判别分析是渐进有效的(asymptotically efficient)。 实际上,这也意味着,在面对非常大的训练集(训练样本规模 mm特别大)的时候,严格来说,可能就没有什么别的算法能比高斯判别分析更好(比如考虑到对 p(yx)p(y|x)估计的准确度等等)。所以在这种情况下就表明,高斯判别分析(GDA)是一个比逻辑回归更好的算法;再扩展一下,即便对于小规模的训练集,我们最终也会发现高斯判别分析(GDA)是更好的。

朴素贝叶斯

要给p(xy)p(x|y)建模,先来做一个非常强的假设。我们假设特征向量xix_i 对于给定的 yy 是独立的。 这个假设也叫做朴素贝叶斯假设(Naive Bayes ,NB assumption), 基于此假设衍生的算法也就叫做朴素贝叶斯分类器(Naive Bayes classifier)。 例如,如果 y=1y = 1 意味着一个邮件是垃圾邮件;然后其中"buy" 是第20872087个单词,而 "price"是第3983139831个单词;那么接下来我们就假设,如果我告诉你 y=1y = 1,也就是说某一个特定的邮件是垃圾邮件,那么对于x2087x_{2087} (也就是单词 buy 是否出现在邮件里)的了解并不会影响你对x39831x_{39831} (单词price出现的位置)的采信值。更正规一点,可以写成 p(x2087y)=p(x2087y,x39831)p(x_{2087}|y) = p(x_{2087}|y, x_{39831})。(要注意这个并不是说x2087x_{2087}x39831x_{39831}这两个特征是独立的,那样就变成了p(x2087)=p(x2087x39831)p(x_{2087}) = p(x_{2087}|x_{39831}),我们这里是说在给定了 yy 的这样一个条件下,二者才是有条件的独立。)

然后我们就得到了等式:
p(x1,...,x50000y)=p(x1y)p(x2y,x1)p(x3y,x1,x2)...p(x50000y,x1,x2,...,x49999)=p(x1y)p(x2y)p(x3y)...p(x50000y)=i=1np(xiy) \begin{aligned} p(x_1, ..., x_{50000}|y) & = p(x_1|y)p(x_2|y,x_1)p(x_3|y,x_1,x_2) ... p(x_{50000}|y,x_1,x_2,...,x_{49999})\\ & = p(x_1|y)p(x_2|y)p(x_3|y) ... p(x_{50000}|y)\\ & = \prod^n_{i=1}p(x_i|y)\\ \end{aligned}
第一行的等式就是简单地来自概率的基本性质,第二个等式则使用了朴素贝叶斯假设。这里要注意,朴素贝叶斯假设也是一个很强的假设,产生的这个算法可以适用于很多种问题。

我们这个模型的参数为 ϕiy=1=p(xi=1y=1),ϕiy=0=p(xi=1y=0)\phi_{i|y=1} = p (x_i = 1|y = 1), \phi_{i|y=0} = p (x_i = 1|y = 0), 而 ϕy=p(y=1)\phi_y = p (y = 1)。和以往一样,给定一个训练集{(x(i),y(i));i=1,...,m}\{(x^{(i)},y^{(i)}); i = 1, ..., m\},就可以写出下面的联合似然函数:
L(ϕy,ϕjy=0,ϕjy=1)=i=1mp(x(i),y(i)) \mathcal{L}(\phi_y,\phi_{j|y=0},\phi_{j|y=1})=\prod^m_{i=1}p(x^{(i)},y^{(i)})
找到使联合似然函数取得最大值的对应参数组合 ϕy,ϕiy=0ϕiy=1\phi_y , \phi_{i|y=0} 和 \phi_{i|y=1} 就给出了最大似然估计:
ϕjy=1=i=1m1{xj(i)=1y(i)=1}i=1m1{y(i)=1}ϕjy=0=i=1m1{xj(i)=1y(i)=0}i=1m1{y(i)=0}ϕy=i=1m1{y(i)=1}m \begin{aligned} \phi_{j|y=1} &=\frac{\sum^m_{i=1}1\{x_j^{(i)} =1 \wedge y^{(i)} =1\} }{\sum^m_{i=1}1\{y^{(i)} =1\}} \\ \phi_{j|y=0} &= \frac{\sum^m_{i=1}1\{x_j^{(i)} =1 \wedge y^{(i)} =0\} }{\sum^m_{i=1}1\{y^{(i)} =0\}} \\ \phi_{y} &= \frac{\sum^m_{i=1}1\{y^{(i)} =1\}}{m}\\ \end{aligned}
在上面的等式中,"\wedge(and)“这个符号的意思是逻辑"和”。这些参数有一个非常自然的解释。例如 ϕjy=1\phi_{j|y=1} 正是单词 jj 出现的邮件中垃圾邮件所占 (y=1)(y = 1) 的比例。

拟合好了全部这些参数之后,要对一个新样本的特征向量 xx 进行预测,只要进行如下的简单地计算:
p(y=1x)=p(xy=1)p(y=1)p(x)=(i=1np(xiy=1))p(y=1)(i=1np(xiy=1))p(y=1)+(i=1np(xiy=0))p(y=0) \begin{aligned} p(y=1|x)&= \frac{p(x|y=1)p(y=1)}{p(x)}\\ &= \frac{(\prod^n_{i=1}p(x_i|y=1))p(y=1)}{(\prod^n_{i=1}p(x_i|y=1))p(y=1)+ (\prod^n_{i=1}p(x_i|y=0))p(y=0)} \\ \end{aligned}
然后选择有最高后验概率的概率。

最后我们要注意,刚刚我们对朴素贝叶斯算法的使用中,特征向量 xix_i 都是二值化的,其实特征向量也可以是多个离散值,比如{1,2,...,ki}\{1, 2, ..., k_i\}这样也都是可以的。这时候只需要把对p(xiy)p(x_i|y) 的建模从伯努利分布改成多项式分布。实际上,即便一些原始的输入值是连续值(比如我们第一个案例中的房屋面积),也可以转换成一个小规模的离散值的集合,然后再使用朴素贝叶斯方法。例如,如果我们用特征向量 xix_i 来表示住房面积,那么就可以按照下面所示的方法来对这一变量进行离散化:

居住面积 <400<400 400800400-800 8001200800-1200 120016001200-1600 >1600>1600
离散值 xix_i 11 22 33 44 55

这样,对于一个面积为 890890 平方英尺的房屋,就可以根据上面这个集合中对应的值来把特征向量的这一项的xix_i值设置为33。然后就可以用朴素贝叶斯算法,并且将p(xiy)p(x_i|y)作为多项式分布来进行建模,就都跟前面讲过的内容一样了。当原生的连续值的属性不太容易用一个多元正态分布来进行建模的时候,将其特征向量离散化然后使用朴素贝叶斯法(NB)来替代高斯判别分析法(GDA),通常能形成一个更好的分类器。

拉普拉斯平滑(Laplace smoothing)
ϕj=i=1m1{z(i)=j}+1m+k \phi_j=\frac{\sum^m_{i=1}1\{z^{(i)}=j\}+1}{m+k}
这里首先是对分子加11,然后对分母加kk,要注意j=1kϕj=1\sum^k_{j=1} \phi_j = 1依然成立(自己检验一下),这是一个必须有的性质,因为ϕj\phi_j 是对概率的估计,然后所有的概率加到一起必然等于11。另外对于所有的 jj 值,都有ϕj0\phi_j \neq 0,这就解决了概率估计为零的问题了。在某些特定的条件下(相当强的假设条件下,arguably quite strong),可以发现拉普拉斯平滑还真能给出对参数ϕj\phi_j 的最佳估计(optimal estimator)。

回到我们的朴素贝叶斯分选器问题上,使用了拉普拉斯平滑之后,对参数的估计就写成了下面的形式:
ϕjy=1=i=1m1{xj(i)=1y(i)=1}+1i=1m1{y(i)=1}+2ϕjy=0=i=1m1{xj(i)=1y(i)=10}+1i=1m1{y(i)=0}+2 \begin{aligned} \phi_{j|y=1} & =\frac{\sum^m_{i=1}1\{x_j^{(i)}=1\wedge y ^{(i)}=1\}+1}{\sum^m_{i=1}1{\{y^{(i)}=1\}}+2}\\ \phi_{j|y=0} & =\frac{\sum^m_{i=1}1\{x_j^{(i)}=1\wedge y ^{(i)}=10\}+1}{\sum^m_{i=1}1{\{y^{(i)}=0\}}+2}\\ \end{aligned}
(在实际应用中,通常是否对ϕy\phi_y 使用拉普拉斯并没有太大影响,因为通常我们会对每个垃圾邮件和非垃圾邮件都有一个合适的划分比例,所以ϕy\phi_y 会是对p(y=1)p(y = 1) 的一个合理估计,无论如何都会与零点有一定距离。)