机器学习05-生成学习算法(generative learning algorithm)

1.生成学习算法(generative learning algorithm)

这节介绍一个新算法,广义线性模型是计算变量\( y \)在变量\( x \)上的条件分布\( p(y|x) \),而这里要讲的生成学习算法是计算变量\( x \)在变量\( y \)上的条件分布\( p(x|y) \)和变量\( y \)的分布\( p(y) \),然后使用贝叶斯公式计算\( p(y|x)=\frac{p(x,y)}{p(x)}=\frac{p(y)*p(x|y)}{p(x)} \)。

2.高斯判别法(Gussian discriminant analysis)

高斯判别法顾名思义,与高斯有关,是生产学习算法的一个特例。同*logistic回归*一样,考虑变量\( y \)只有两类,分别记为0,1并记\( p(y=1)=\phi \)。假设每类中的变量\( x \)均服从正态分布,即: \[ p(x|y=0) \sim N(\vec{\mu_0},\Sigma_0) \to p(x|y=0) = (\sqrt{2\pi})^{m_0}|\Sigma_{0}|^{-\frac{1}{2}} e^{-\frac{1}{2} (x-\vec{\mu_0})^T \Sigma_{0}^{-1} (x-\vec{\mu_0})} \\ p(x|y=1) \sim N(\vec{\mu_1},\Sigma_1) \to p(x|y=1) = (\sqrt{2\pi})^{m_1}|\Sigma_{1}|^{-\frac{1}{2}} e^{-\frac{1}{2} (x-\vec{\mu_1})^T \Sigma_{1}^{-1} (x-\vec{\mu_1})} \] 为得到\( p(x|y) \)和变量\( y \)的分布\( p(y) \)的分布,需要估计五个参数\( \phi,\vec{\mu_0},\Sigma_0,\vec{\mu_1},\Sigma_1 \),使用最大似然估计计算变量\( x \)和变量\( y \)的联合分布: \[ \ell(\phi,\vec{\mu_0},\Sigma_0,\vec{\mu_1},\Sigma_1) = \prod_{i=1}^{m}p(y^{(i)})*p(x^{(i)}|y=y^{(i)}) \] 由上式很容易得到各参数的估计值: \[ \begin{aligned} \phi &=\frac { \sum_{i=1}^{m} y^{(i)} } {m} \\ \vec{\mu_0} &=\frac {\sum_{i=1}^{m} (1-y^{(i)})*x^{(i)} }{ \sum_{i=1}^{m}1-y^{(i)}} \\ \vec{\mu_1} &=\frac {\sum_{i=1}^{m} y^{(i)}*x^{(i)} }{ \sum_{i=1}^{m} y^{(i)}} \end{aligned} \] 上式的估计值事实上就是平均值,最大似然估计一向与均值联系紧密。

预测:
运用贝叶斯公式分别计算\( p(y=0|x) \)和\( P(y=1|x) \)并找出二者中的较大者作为预测值,\( p(y|x)=\frac{p(x,y)}{p(x)}=\frac{p(y)*p(x|y)}{p(x)} \)式中未知的还有\( p(x) \),但它是\( p(y=0|x) \)和\( P(y=1|x) \)的共项,比较大小时可忽略不计。

高斯判别法与logsitic回归的关系:
plot of chunk unnamed-chunk-1

如上图所示,黑线和蓝线分别是\( p(x|y=0) \)和\( p(x|y=1) \)的密度曲线,红线表示\( p(y=1|x) \)在各点的预测值。红线与logistic回归曲线十分相似,事实上高斯判别法只是在lodistic回归的基础上作了正态分布的假设,同理可以作伽马分布、泊松分布等假设得到不同的模型。
使用*logistic回归*得到比较稳健的模型,但对数据量的要求较大;使用高斯判别法可能会误选模型,当数据不服从正态分布时可能得到误差较大的结果。
最后,在*生成学习法*中对自变量在因变量上的条件分布的假设,只要属于指数分布簇,都可以得到类似*logistic回归*的曲线,都可以转换为logistic函数,但与logistic回归的结果是有差异的,曲线的陡峭程度不同,上图便是一个例子。

3.朴素贝叶斯(Naive Bayes)

考虑自变量比较多的情况,比如垃圾邮件的识别需要检测成百上千甚至上万的字符是否出现,如有*‘免费’*、*‘购买‘*等类似的词出现的邮件很大可能是垃圾邮件。这种情况下若有k个自变量,考虑各变量之间的交互作用就需要计算\( 2^k \)次,为了简化计算量对模型作一个更强的假设:

给定因变量\( y \)的值,各自变量之间相互独立.

用数学语言描述就是: \[ \begin{aligned} p(x_1,x_2,x_3...x_k|y) &= p(x_1|y)*p(x_2|y,x_1)*p(x_3|y,x_1,x_2) \ldots \\ &= p(x_1|y)*p(x_2|y)*p(x_3|y) \ldots \\ &= \prod_{i=i}^{k}p(x_k|y) \end{aligned} \] 这就是朴素贝叶斯(Naive Bayes)算法,不知道谁起的名字。不但要会用很多模型算法,还要面对一堆不知所谓的名称从容不迫的把名字和用法对应起来,真是麻烦o(︶︿︶)o 。另外想起在微博上看到一海归应聘,被问到数据透视表,该君茫然,回去一查原来是pivottable,顿时欲哭无泪…
言归正传,各变量相互独立在很多情况下是个比较荒谬的假设,比如亲爱的发来邮件“老公,XX打折包邮啦,快给我买下来”,而电商的邮件很可能是“亲爱的id,…打折……包邮…购买”,同样出现*打折*、*包邮*、*买*等关键词把二者都归为垃圾邮件恐怕要跪搓衣板了。虽然如此,但据说这个算法很好用。
具体做法:
构造特征向量(与线性代数无关,特征是指关键词) \[ \begin{aligned} X &= (x_1,x_2,x_3 \ldots x_k)^T \\ x_i &= \left\{ \begin{array}{} 1 \qquad \textrm{出现$x_i$} \\ 0 \qquad \textrm{不含$x_i$} \end{array} \right.\\ y &= \left\{ \begin{array}{} 1 \qquad \textrm{垃圾邮件} \\ 0 \qquad \textrm{正常邮件} \end{array} \right. \end{aligned} \] 记: \[ \begin{aligned} \phi_{i|y=1} &= p(x_i=1|y=1) \\ \phi_{i|y=1} &= p(x_i=1|y=1) \\ \phi_y &= p(y=1) \end{aligned} \] 使用最大似然估计对上述参数进行估计,仍然计算输入变量和输出变量的联合密度函数: \[ \begin{aligned} \ell(\phi) &= \prod_{i=1}^{m} p(x^{(i)}|y^{(i)})*p(y^{(i)}) \\ &= \prod_{i=1}^{m} \big( \phi_y^{y^{(i)}} \phi_y^{1-y^{(i)}} \prod_{j=i}^{k} \phi_{j|y^{(i)}=1}^{y^{(i)}} \phi_{j|y^{(i)}}^{1-y^{(i)}} \big) \end{aligned} \] 最后得到参数估计值是: \[ \begin{aligned} \phi_{j|y=1} &= \frac{\sum_{i=1}^{m} I(x^{(i)}=1,y^{(i)}=1)} {\sum_{i=1}^{m} y^{(i)}} \\ \phi_{j|y=0} &= \frac{\sum_{i=1}^{m} I(x^{(i)}=1,y^{(i)}=0)} {\sum_{i=1}^{m} 1-y^{(i)}} \\ \phi_y &= \frac{\sum_{i=1}^{m} y^{(i)}} {m} \end{aligned} \] 虽然公式比字还多很麻烦的样子,但原理很简单。其实logistic回归也没有考虑变量间的交互作用,同样假设变量相互独立,只不过在朴素贝叶斯里输入变量是离散的,在logistic回顾是输入变量是连续的,仅此而已。

4.拉普拉斯平滑(Laplace smoothing)

首先来看朴素贝叶斯的两个问题:

为了改善最大似然估计,大牛拉普拉斯发明了拉普拉斯平滑(Laplace smoothing): 假设变量\( y \)可以取\( k \)个值(1,2,3…k),抽到\( m \)个样本并对\( p(y=i) \)进行估计时,最大似然估计得到\( p(y=j)=\frac{\sum_{i=1}^{m} I(y^{(i)}=j)} {m} \),对其进行修正得到: \[ p(y=j)=\frac{1+ \sum_{i=1}^{m} I(y^{(i)}=j) } {k+m} \] 对分子加1,分母加上类别总数,这样抽到3个产品都合格得到次品率是\( \frac{1}{5} \),如果抽到的全是合格品那么抽到越多合格率越高,趋近与1。确实对最大似然估计的缺点起到了一定修正作用。