版权声明:本系列文章为博主原创文章,转载请注明出处!谢谢!
本章索引:
前4章,我们依次讨论了回归问题与各种回归方法,分类问题与各种分类方法,以及一种通用的建模方式,按照它提供的假设和流程,可以很方便的自动生成广义线性模型模型,以解决实际的回归问题和分类问题。之前介绍过的方法都属于判别学习算法,最重要的特点是,它们都对$(y|x)$直接建模。我们将在本章介绍一种新的学习方法,它不是针对$y|x$建模,而是针对$(x|y)$建模,而后利用贝叶斯公式进行极大似然估计。这种方法在某些应用领域非常有效(例如朴素贝叶斯算法用在文本分类)。
1. 生成学习算法
2. 高斯判别式分析
3. 朴素贝叶斯
1. 生成学习算法
我们用一个例子引出生成学习算法,比如,我们现在需要一个能区分大象和狗的算法。本章之前的方法都是根据训练集合提供的特征和对应标签,建立分类标准。等新的动物来分类的时候,按照新来动物的特征计算它的标签,从而决定应该分在哪边。除此以外,我们还有另一种方法:遍历训练集合中所有大象的特征,根据大象的特征建立一个模型;遍历训练集合中所有狗的特征,根据狗的特征建立另一个模型。当有一个新的动物来需要分类的时候,把它特征与上述两个模型对比,与哪个更相似,就属于哪一类。
让我们更正式的来描述一下判别学习法和生成学习发的区别。如果一个算法的目的是学习$p(y|x)$,或者学习从输入空间X到标签$\{0,1\}$的映射$h_\theta(x)$,那么它就属于判别学习算法。相反地,如果一个算法的目的是学习$p(x|y)$,或者出于技术上的考虑去对$p(y)$进行建模,那么它就是生成学习算法。之后再应用贝叶斯模型计算后验概率:
\begin{equation*}
p(y|x)=\frac{p(x|y)p(y)}{p(x)}
\end{equation*}
其中,分母的$p(x)$可以由$p(x) = p(x|y=1)p(y=1) + p(x|y=0)p(y=0)$计算出。甚至如果是为了求$p(y|x)$的最大似然估计的话,可以忽略分母。
\begin{eqnarray*}
\mathop{arg\ max\ p(y|x)}\limits_y & = & \mathop{arg\ max\ \frac{p(x|y)p(y)}{p(x)}}\limits_y \\
& = & \mathop{arg\ max\ p(x|y)p(y)}\limits_y
\end{eqnarray*}
2. 高斯判别式分析
我们要介绍的第一个生成学习算法是高斯判别式分析(Gaussian Discriminant Analysis, GDA)。在这个模型里面,我们假设$p(x|y)$服从多维正态分布。首先来看下多维正态分布。
多维正态分布:
多维正态分布的参数是:均值向量$\mu \in \mathbb{R}^n$和协方差矩阵$\Sigma \in \mathbb{R}^{n \times n}$,其中$\Sigma \geq 0$是对称的半正定矩阵。多维正态分布也写做$\mathcal{N}(\mu, \Sigma)$。 它的概率密度函数如下:
\begin{equation*}
p(x;\mu,\Sigma)= \frac{1}{(2\pi)^{n/2} |\Sigma|^{1/2}} exp(-\frac{1}{2}(x-\mu)^T \Sigma^{-1}(x-\mu))
\end{equation*}
期望值如下:
\begin{equation*}
E[X]= \int_x xp(x; \mu, \Sigma)dx=\mu
\end{equation*}
协方差矩阵如下:
\begin{equation*}
\Sigma=\begin{bmatrix}1&0 \\ 0&1 \end{bmatrix};\ \Sigma=\begin{bmatrix}1&0.5 \\ 0.5&1 \end{bmatrix}\ \Sigma=\begin{bmatrix}1&0.8 \\ 0.8&1 \end{bmatrix}
\end{equation*}
假设一个二分类问题,输入特征$x$是连续的,我们就可以用高斯判别分析法建模,即用多维正态分布对$p(x|y)$建模:
\begin{equation*}
y\ \sim\ Bernoulli(\phi)
\end{equation*}
\begin{equation*}
x|y=0\ ~\ N(\mu_0,\Sigma)
\end{equation*}
\begin{equation*}
x|y=1\ ~\ N(\mu_1,\Sigma)
\end{equation*}
概率密度函数如下:
\begin{equation*}
p(y)=\phi_y(1-\phi)^{1-y}
\end{equation*}
\begin{equation*}
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))}
\end{equation*}
\begin{equation*}
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{equation*}
这个模型的参数包括:。
对数似然如下:
\begin{eqnarray*}
l(\phi, \mu_0, \mu_1, \Sigma) &=& log \prod_{i=1}^m p(x^{(i)}, y^{(i)}; \phi, \mu_0, \mu_1, \Sigma) \\
&=& log \prod_{i=1}^m p(x^{(i)}|y^{(i)}; \mu_0, \mu_1, \Sigma)p(y^{(i)}; \phi)
\end{eqnarray*}
为了最大化对数似然,得到参数的最大似然估计:
\begin{equation*}
\phi = \frac{1}{m}\sum_{i=1}^m 1\{y^{(i)}=1\}
\end{equation*}
\begin{equation*}
\mu_0=\frac{\sum_{i=1}^m 1 \{y^{(i)}=0\}x^{(i)} }{\sum_{i=1}^m 1 \{y^{(i)} =0 \}}
\end{equation*}
\begin{equation*}
\mu_1 = \frac{\sum_{i=1}^m 1 \{y^{(i)}=1\}x^{(i)}}{\sum_{i=1}^m 1 \{y^{(i)}=1\} }
\end{equation*}
\begin{equation*}
\Sigma = \frac{1}{m} \sum_{i=1}^m (x^{(i)} - \mu_{y^{(i)}}) (x^{(i)} - \mu_{y^{(i)}})^T
\end{equation*}
总结下高斯判别式分析和Logistic回归的对比:
如果你知道数据大概服从高斯分布,那么高斯判别式分析将优于logistic回归,因为算法应用了这个信息;相反,如果你不确定$x|y$的情况, 那么logisitc判别式将更好。 举个例子,如果你假设数据服从高斯,但它实际上服从泊松,那么logistic回归仍然有不错的性能,因为如果数据服从泊松,$p(y=1|x)$仍是一个logistic函数。
通过对数据做更强的假设,高斯判别式为了拟合一个还不错的模型,通常需要更少的数据。Logistic回归的假设更少,对模型的假设方面的错误更加健壮,但通常需要更多的样本。
生成学习算法的真正好处通常在于,它需要更少的数据,数据通常不是精确服从高斯分布的,只是近似;这时候生成学习就不错。
此外,一定注意,高斯判别式法属于生成学习算法,而不是判别学习算法。(话说,有些算法的名字真的很容易误导人,比如:Logistic回归不是解决回归问题的算法,而是解决分类问题的算法;高斯判别式分析不是判别算法,而是生成算法...)
3. 朴素贝叶斯
下面介绍第2种生成学习算法:朴素贝叶斯。朴素贝叶斯算法通常用于文本分类的场景。文本分类系统的一个例子就是垃圾邮件分类器。它根据邮件中的文本来自动判断该邮件是否是垃圾邮件。为了得到这个分类器,假设我们已经有了一个训练集合,它包含了一大坨邮件已经每封邮件是否是垃圾邮件的标签信息。
首先明确这个分类器如何表示特征。为了根据邮件内容决定是否垃圾邮件,建立一个字典,它包含了很多个可能出现在邮件中的单词。这个字典规模可能是几百到几万,比如50 000。然后,我们用一个特征向量$x$来表示一封邮件,这个特征向量的$x$的长度等于字典中词语的个数。如果这封邮件包含了字典中的第$i$个单词,那么特征变量中的第$i$个元素的值为1,否则值为0。如下图:
\begin{equation*}
x = \begin{bmatrix} 1 \\ 0 \\ 0 \\ vdots \\ 1 \\ \vdots \\ 0 \end{bmatrix} \ \ \begin{bmatrix} a \\ aardvark \\ aardwolf \\ \vdots \\ buy \\ \vdots \\ zygmurgy \end{bmatrix}
\end{equation*}
这个特征向量的含义是:邮件中出现了字符串"a"和"buy",没有出现字符串"aardvark","aardwolf"和"zygmurgy"。在这种表示下,如果我们用判别式方法中的多项式模型建模,至少需要2^50 000-1个参数,是非常困难的。这种将电子邮件表示成特征向量的方法叫“多元伯努利事件模型”,因为这个向量中包含了很多个伯努利随机变量。本章最后部分会讨论另一种方法:“多项式事件模型”。
在朴素贝叶斯算法中,我们会对$p(x|y)$做一个很强的假设:给定$y$,$x_i$之间条件独立。注意,条件独立不等同于完全独立。例如,如果我们用$y=1$表示这是一封垃圾邮件,字典的第3000个单词是"price",第5000个单词是"buy",条件的独立的意思,如果我知道了这是一封垃圾邮件(即已经给定$y=1$为条件下),第3000个单词"price"是否出现对第5000个单词"buy"是否出现没有影响,即条件概率$p(x_3000|y) = p(x_3000|y, x_5000)$成立,不带条件的概率$p(x_3000)$和p(x_3000|5000)$并不一定相等。这个假设称为朴素贝叶斯假设,在这个假设下的算法则称为朴素贝叶斯算法。通常情况下,这个假设在实际中是不成立的,但从结果来看这并不影响朴素贝叶斯是一个好的文本分类方法。
在条件独立的假设下,以下等式成立:
\begin{eqnarray*}
p(x_1,\cdots ,x_50000|y) & = & p(x_1|y) p(x_2|y,x_1) p(x_3|y,x_1,x_2)\cdots p(x_50000|y,x_1,\cdots , x_49999) \\
& = & p(x_1|y) p(x_2|y) p(x_3|y)\cdots p(x_50000|y) \\
& = & \prod_{i=1}^n p(x_i|y)
\end{eqnarray*}
模型的参数应该是这样的:\begin{equation*} \phi_{i|y=1} = p(x_i=1|y=1), \phi_{i|y=0} = p(x_i=1|y=0), \phi_y = p(y=1) \end{equation*}
根据模型我们写出似然:
\begin{equation*}
L(\phi_y, \phi_{i|y=0}, \phi_{i|y=1}) = \prod_{i=1}^m p(x^{(i)},y^{(i)})
\end{equation*}
以及最大似然估计的拟合结果:
\begin{equation*}
\phi_{j|y=1}= \frac{\sum_{i=1}^m 1 \{x_j^{(i)}=1\land y^{(i)}=1\}} {\sum_{i=1}^m 1 \{y^{(i)}=1\}}
\end{equation*}
\begin{equation*}
\phi_{j|y=0}= \frac{\sum_{i=1}^m 1 \{x_j^{(i)}=1\land y^{(i)}=0\}} {\sum_{i=1}^m 1 \{y^{(i)}=0\}}
\end{equation*}
\begin{equation*}
\phi_y=\frac{\sum_{i=1}^m 1 \{y^{(i)}=1\} } {m}
\end{equation*}
上面符号$\land$的含义是“与”。这些参数估计的含义也很明显,例如$\phi_{j|y=1}$是指在训练集合的所有垃圾邮件中,包含词语$j$的邮件的比例。
得到这些参数的估计值后,可以根据贝叶斯公式,在有新的样本需要分类时,用下式计算$p(y|x)$:
\begin{eqnarray*}
p(y=1|x) & = & \frac{p(x|y=1)p(y=1)}{p(x)} \\
& = & \frac{(\prod_{i=1}^m p(x_i|y=1))p(y=1)} {(\prod_{i=1}^m p(x_i|y=1))p(y=1)+(\prod_{i=1}^n p(x_i|y=0))p(y=0)}
\end{eqnarray*}
拉普拉斯平滑
朴素贝叶斯已经不错了,但是它有时会有点小问题。如果我们用拉普拉斯平滑改变一下,它可以变得更好。
假设,字典中第30000个单词是"aabbcc",且在之前的训练集合中,无论垃圾邮件还是非垃圾邮件,这个词都没有出现过,那么根据我们之前的结论,有:
\begin{equation*}
\phi_{35000|y=1} = \frac{\sum_{i=1}^m 1 \{x_35000^{(i)} =1 \land y^{(i)}=1\}} {\sum_{i=1}^m 1 \{y^{(i)} =1\}} =0
\end{equation*}
\begin{equation*}
\phi_{35000|y=0} = \frac{\sum_{i=1}^m 1 \{x_35000^{(i)} =1 \land y^{(i)}=0\}} {\sum_{i=1}^m 1 \{y^{(i)} =0\}} =0
\end{equation*}
用上述结果来计算后验概率的话,有:
\begin{eqnarray*}
p(y=1|x) & = & \frac{(\prod_{i=1}^m p(x_i|y=1))p(y=1)} {\prod_{i=1}^m p(x_i|y=1)p(y=1)+\prod_{i=1}^n p(x_i|y=0)p(y=0)} \\
& = & \frac{0}{0}
\end{eqnarray*}
这是因为公式中,每一项$\prod_{i=1}^n p(x_i|y)$都包含了一项$p(x_35000|y) = 0$来相乘。如此,得到的$0/0$的结果是没有意义的。
正如我们之前看到的,当我们用最大似然估计的时候,如果有某些$\phi_j$的结果是0的话,那么就会出现问题。为了避免这种情况,我们可以把之前的估计替换为:
\begin{equation*}
\phi_{j|y=1}= \frac{\sum_{i=1}^m 1 \{x_j^{(i)}=1\land y^{(i)}=1\}+1} {\sum_{i=1}^m 1 \{y^{(i)}=1\}+2}
\end{equation*}
\begin{equation*}
\phi_{j|y=0}= \frac{\sum_{i=1}^m 1 \{x_j^{(i)}=1\land y^{(i)}=0\}+1} {\sum_{i=1}^m 1 \{y^{(i)}=0\}+2}
\end{equation*}
即,在分子后面加1,在分母后面加2,这样就可以保证分子分母都不为0。这种方法称为拉普拉斯平滑。
朴素贝叶斯算法的两种变化形式
第一种:二值特征到多值特征的一般性推广
如果我们希望把朴素贝叶斯算法从二值的特征$x_i$推广到一般的多值情况,我们只需把之前的对$p(x|y)$建模时的伯努利模型替换为多项式模型即可。另外,如果输入变量本身的取值为连续的,我们依然可以把它离散化,然后用贝叶斯模型来建模。如下例中关于房屋面积的离散化方式:
房屋面积(平方英尺) | <400 | 400-800 | 800-1200 | 1200-1600 | >1600 |
$x_i$ | 1 | 2 | 3 | 4 | 5 |
第二种:朴素贝叶斯的事件模型。
之前的算法中,当我们把邮件表示成特征向量时,并没有考虑每个单词在邮件中出现的次数。我们只是定义,只要某个单词在邮件中出现过,那么特征向量中,这个单词对应位置的元素就为1。这种方式叫“多元伯努利模型”。
这里介绍一种新的方法,不但可以。我们让$x_i$表示邮件中的第$i$个词,那么$x_i$的取值范围就是:$\{ 1, 2, \cdots, |V| \}$,其中$|V|$是我们词典的size,上例中的50000。一封邮件就可以由向量$(x_1, x_2, \cdots, x_n)$构成,长度为$n$,对不同的邮件,$n$的取值也都是不一样的。换句话说,$x_1$的值就是第一个单词在词典中的索引,然后依次类推,生成这个特征向量。
如此,训练集合的似然为:
\begin{eqnarray*}
L(\phi, \phi_{i|y=0},\phi_{i|y=1}) & = & \prod_{i=1}^m p(x^{(i)}, y^{(i)}) \\
& = & \prod_{i=1}^m (\prod_{j=1}^{n_i}p(x_j^{(i)}|y;\phi_{i|y=0},\phi_{i|y=1}))p(y^{(i)};\phi_y)
\end{eqnarray*}
最大似然估计的结果:
\begin{equation*}
\phi_{k|y=1}= \frac{\sum_{i=1}^m \sum_{j=1}^{n_i} 1 \{x_j^{(i)}=k\land y^{(i)}=1\}} {\sum_{i=1}^m1 \{y^{(i)}=1\}n_i}
\end{equation*}
\begin{equation*}
\phi_{k|y=0}= \frac{\sum_{i=1}^m \sum_{j=1}^{n_i} 1 \{x_j^{(i)}=k\land y^{(i)}=0\}} {\sum_{i=1}^m1 \{y^{(i)}=0\}n_i}
\end{equation*}
\begin{equation*}
\phi_y=\frac{\sum_{i=1}^m 1 \{y^{(i)}=1\} } {m}
\end{equation*}
考虑拉普拉斯平滑后的结果:
\begin{equation*}
\phi_y=\frac{\sum_{i=1}^m 1 \{y^{(i)}=1\} } {m}
\end{equation*}
\begin{equation*}
\phi_{k|y=1}= \frac{\sum_{i=1}^m \sum_{j=1}^{n_i} 1 \{x_j^{(i)}=k\land y^{(i)}=1\}+1 } {\sum_{i=1}^m1 \{y^{(i)}=1\}n_i+|V|}
\end{equation*}
\begin{equation*}
\phi_{k|y=0}= \frac{\sum_{i=1}^m \sum_{j=1}^{n_i} 1 \{x_j^{(i)}=k\land y^{(i)}=0\}+1 } {\sum_{i=1}^m1 \{y^{(i)}=0\}n_i+|V|}
\end{equation*}
思考:非线性分类的logistic回归,为什么会得到一条线性的分界线????线性分类器?线性分类?http://www.cnblogs.com/dengdan890730/p/5539400.html
反向传播:梯度下降算法运用在在神经网络上时的特殊名字,即在一个神经网络上对这样的一个成本函数执行梯度下降算法。