这节介绍一个新算法,广义线性模型是计算变量\( 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)} \)。
高斯判别法顾名思义,与高斯有关,是生产学习算法的一个特例。同*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回归的关系:
如上图所示,黑线和蓝线分别是\( p(x|y=0) \)和\( p(x|y=1) \)的密度曲线,红线表示\( p(y=1|x) \)在各点的预测值。红线与logistic回归曲线十分相似,事实上高斯判别法只是在lodistic回归的基础上作了正态分布的假设,同理可以作伽马分布、泊松分布等假设得到不同的模型。
使用*logistic回归*得到比较稳健的模型,但对数据量的要求较大;使用高斯判别法可能会误选模型,当数据不服从正态分布时可能得到误差较大的结果。
最后,在*生成学习法*中对自变量在因变量上的条件分布的假设,只要属于指数分布簇,都可以得到类似*logistic回归*的曲线,都可以转换为logistic函数,但与logistic回归的结果是有差异的,曲线的陡峭程度不同,上图便是一个例子。
考虑自变量比较多的情况,比如垃圾邮件的识别需要检测成百上千甚至上万的字符是否出现,如有*‘免费’*、*‘购买‘*等类似的词出现的邮件很大可能是垃圾邮件。这种情况下若有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回顾是输入变量是连续的,仅此而已。
首先来看朴素贝叶斯的两个问题:
在垃圾邮件的例子中,值考虑了关键词是否出现,并未利用出现次数这个信息。 这个问题在下一节对朴素贝叶斯进行扩展时解决。
假设共有k个关键词即k个变量,其中一个关键词是所有邮件里都没有提到的。于是可以由最大似然估计得到\( p(x_i|y=1)=p(x_i|y=0)=0 \),然后进行预测时: \[ \begin{aligned} p(y=1|x) &= \frac{p(x|y=1)p(y=1)}{p(x|y=1)p(y=1) + p(x|y=0)p(y=0)} \\ &= \frac{p(y=1) \prod_{i=1}^{k} p(x_i|y=1)} {p(y=1) \prod_{i=1}^{k} p(x_i|y=1) +p(y=0) \prod_{i=1}^{k} p(x_i|y=0)} \end{aligned} \] 由于存在\( p(x_i|y=1)=p(x_i|y=0)=0 \),上式的分子分母均为0,傻眼了… 类似的例子还有,比如在产品质检时抽到3个产品都没问题,运用最大似然估计会得到次品率为0,即下次抽到次品的概率为0,明显不合常理。通常这样的问题是由于样本量太小造成的。
为了改善最大似然估计,大牛拉普拉斯发明了拉普拉斯平滑(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。确实对最大似然估计的缺点起到了一定修正作用。