版权声明:本系列文章为博主原创文章,转载请注明出处!谢谢!
本章索引:
前4章,我们依次讨论了回归问题与各种回归方法,分类问题与各种分类方法,以及一种通用的建模方式,按照它提供的假设和流程,可以很方便的自动生成广义线性模型模型,以解决实际的回归问题和分类问题。之前介绍过的方法都属于判别学习算法,最重要的特点是,它们都对$(y|x)$直接建模。我们将在本章介绍一种新的学习方法,它不是针对$y|x$建模,而是针对$(x|y)$建模,而后利用贝叶斯公式进行极大似然估计。这种方法在某些应用领域非常有效(例如朴素贝叶斯算法用在文本分类)。
1. 生成学习算法
2. 高斯判别式分析
3. 朴素贝叶斯
1. 生成学习算法
我们用一个例子引出生成学习算法,比如,我们现在需要一个能区分大象和狗的算法。本章之前的方法都是根据训练集合提供的特征和对应标签,建立分类标准。等新的动物来分类的时候,按照新来动物的特征计算它的标签,从而决定应该分在哪边。除此以外,我们还有另一种方法:遍历训练集合中所有大象的特征,根据大象的特征建立一个模型;遍历训练集合中所有狗的特征,根据狗的特征建立另一个模型。当有一个新的动物来需要分类的时候,把它特征与上述两个模型对比,与哪个更相似,就属于哪一类。
让我们更正式的来描述一下判别学习法和生成学习发的区别。如果一个算法的目的是学习$p(y|x)$,或者学习从输入空间X到标签${0,1}$的映射$h_ heta(x)$,那么它就属于判别学习算法。相反地,如果一个算法的目的是学习$p(x|y)$,或者出于技术上的考虑去对$p(y)$进行建模,那么它就是生成学习算法。之后再应用贝叶斯模型计算后验概率:
egin{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)$的最大似然估计的话,可以忽略分母。
egin{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 imes n}$,其中$Sigma geq 0$是对称的半正定矩阵。多维正态分布也写做$mathcal{N}(mu, Sigma)$。 它的概率密度函数如下:
egin{equation*}
p(x;mu,Sigma)= frac{1}{(2pi)^{n/2} |Sigma|^{1/2}} exp(-frac{1}{2}(x-mu)^T Sigma^{-1}(x-mu))
end{equation*}
期望值如下:
egin{equation*}
E[X]= int_x xp(x; mu, Sigma)dx=mu
end{equation*}
协方差矩阵如下:
egin{equation*}
Sigma=egin{bmatrix}1&0 \ 0&1 end{bmatrix}; Sigma=egin{bmatrix}1&0.5 \ 0.5&1 end{bmatrix} Sigma=egin{bmatrix}1&0.8 \ 0.8&1 end{bmatrix}
end{equation*}
假设一个二分类问题,输入特征$x$是连续的,我们就可以用高斯判别分析法建模,即用多维正态分布对$p(x|y)$建模:
egin{equation*}
y sim Bernoulli(phi)
end{equation*}
egin{equation*}
x|y=0 ~ N(mu_0,Sigma)
end{equation*}
egin{equation*}
x|y=1 ~ N(mu_1,Sigma)
end{equation*}
概率密度函数如下:
egin{equation*}
p(y)=phi_y(1-phi)^{1-y}
end{equation*}
egin{equation*}
p(x|y=0) = frac{1}{(2pi)^{n/2}|Sigma|^{1/2} exp(-frac{1}{2}(x-mu_0)^TSigma^{-1}(x-mu_0))}
end{equation*}
egin{equation*}
p(x|y=1) = frac{1}{(2pi)^{n/2}|Sigma|^{1/2} exp(-frac{1}{2}(x-mu_1)^TSigma^{-1}(x-mu_1)) }
end{equation*}
这个模型的参数包括:。
对数似然如下:
egin{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*}
为了最大化对数似然,得到参数的最大似然估计:
egin{equation*}
phi = frac{1}{m}sum_{i=1}^m 1{y^{(i)}=1}
end{equation*}
egin{equation*}
mu_0=frac{sum_{i=1}^m 1 {y^{(i)}=0}x^{(i)} }{sum_{i=1}^m 1 {y^{(i)} =0 }}
end{equation*}
egin{equation*}
mu_1 = frac{sum_{i=1}^m 1 {y^{(i)}=1}x^{(i)}}{sum_{i=1}^m 1 {y^{(i)}=1} }
end{equation*}
egin{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。如下图:
egin{equation*}
x = egin{bmatrix} 1 \ 0 \ 0 \ vdots \ 1 \ vdots \ 0 end{bmatrix} egin{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)$并不一定相等。这个假设称为朴素贝叶斯假设,在这个假设下的算法则称为朴素贝叶斯算法。通常情况下,这个假设在实际中是不成立的,但从结果来看这并不影响朴素贝叶斯是一个好的文本分类方法。
在条件独立的假设下,以下等式成立:
egin{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*}
模型的参数应该是这样的:egin{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*}
根据模型我们写出似然:
egin{equation*}
L(phi_y, phi_{i|y=0}, phi_{i|y=1}) = prod_{i=1}^m p(x^{(i)},y^{(i)})
end{equation*}
以及最大似然估计的拟合结果:
egin{equation*}
phi_{j|y=1}= frac{sum_{i=1}^m 1 {x_j^{(i)}=1land y^{(i)}=1}} {sum_{i=1}^m 1 {y^{(i)}=1}}
end{equation*}
egin{equation*}
phi_{j|y=0}= frac{sum_{i=1}^m 1 {x_j^{(i)}=1land y^{(i)}=0}} {sum_{i=1}^m 1 {y^{(i)}=0}}
end{equation*}
egin{equation*}
phi_y=frac{sum_{i=1}^m 1 {y^{(i)}=1} } {m}
end{equation*}
上面符号$land$的含义是“与”。这些参数估计的含义也很明显,例如$phi_{j|y=1}$是指在训练集合的所有垃圾邮件中,包含词语$j$的邮件的比例。
得到这些参数的估计值后,可以根据贝叶斯公式,在有新的样本需要分类时,用下式计算$p(y|x)$:
egin{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",且在之前的训练集合中,无论垃圾邮件还是非垃圾邮件,这个词都没有出现过,那么根据我们之前的结论,有:
egin{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*}
egin{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*}
用上述结果来计算后验概率的话,有:
egin{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的话,那么就会出现问题。为了避免这种情况,我们可以把之前的估计替换为:
egin{equation*}
phi_{j|y=1}= frac{sum_{i=1}^m 1 {x_j^{(i)}=1land y^{(i)}=1}+1} {sum_{i=1}^m 1 {y^{(i)}=1}+2}
end{equation*}
egin{equation*}
phi_{j|y=0}= frac{sum_{i=1}^m 1 {x_j^{(i)}=1land 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$的值就是第一个单词在词典中的索引,然后依次类推,生成这个特征向量。
如此,训练集合的似然为:
egin{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*}
最大似然估计的结果:
egin{equation*}
phi_{k|y=1}= frac{sum_{i=1}^m sum_{j=1}^{n_i} 1 {x_j^{(i)}=kland y^{(i)}=1}} {sum_{i=1}^m1 {y^{(i)}=1}n_i}
end{equation*}
egin{equation*}
phi_{k|y=0}= frac{sum_{i=1}^m sum_{j=1}^{n_i} 1 {x_j^{(i)}=kland y^{(i)}=0}} {sum_{i=1}^m1 {y^{(i)}=0}n_i}
end{equation*}
egin{equation*}
phi_y=frac{sum_{i=1}^m 1 {y^{(i)}=1} } {m}
end{equation*}
考虑拉普拉斯平滑后的结果:
egin{equation*}
phi_y=frac{sum_{i=1}^m 1 {y^{(i)}=1} } {m}
end{equation*}
egin{equation*}
phi_{k|y=1}= frac{sum_{i=1}^m sum_{j=1}^{n_i} 1 {x_j^{(i)}=kland y^{(i)}=1}+1 } {sum_{i=1}^m1 {y^{(i)}=1}n_i+|V|}
end{equation*}
egin{equation*}
phi_{k|y=0}= frac{sum_{i=1}^m sum_{j=1}^{n_i} 1 {x_j^{(i)}=kland 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
反向传播:梯度下降算法运用在在神经网络上时的特殊名字,即在一个神经网络上对这样的一个成本函数执行梯度下降算法。