阅读 96

贝叶斯算法

原文链接: click.aliyun.com

谈到贝叶斯,会提到概率论的两大学派,频率学派和贝叶斯学派,也是机器学习中的判别方法和生成方法,对于大多数的分类算法,如决策树,SVM,逻辑回归,KNN等,这些都是判别方法,也就是直接学习出特征输出Y和特征X之间的关系,要么是决策函数Y=f(X),要么是条件分布P(Y|X)。但是朴素贝叶斯却是生成方法,也就是直接找出特征输出Y和特征X的联合分布P(X,Y),然后用P(Y|X)=P(X,Y)/P(X)得出。
一、贝叶斯决策轮
贝叶斯决策论是概率框架下实施决策的基本方法,对分类任务来说,在所有相关概率都已知的理想情况下,贝叶斯决策论考虑如何基于这些概率和误判损失来选择最优的类别标记,以多分类任务为例讲解。
假设有N种可能的类别标记,即 Y=\left \{ c_1,c_2,...,c_N \right \},\lambda _{ij}是将一个真实标记为c_j的样本误分类为c_i所产生的损失,基于后验概率P(c_i|x)可获得将样本x分类为c_i所产生的期望损失,即在样本x上的"条件风险"

R(ci|x)=N∑j=1λijP(cj|x)

我们的任务时寻找一个判定准则h:\chi \rightarrow y以最小化总体风险

R(h)=Ex[R(h(x)|x)]

对于每个样本x,若h能最小化条件风险R(h(x)|x),则总体风险R(h)也将最小化,这就产生了贝叶斯判定准则,为最小化总体风险,只需在每个样本上选择能使条件风险R(c|x)最小的类别标记,即:

h∗(x)=argmincϵyR(c|x)

称为贝叶斯最优分类器,与之对应的总体风险R(h^*)称为贝叶斯风险。
条件风险简化为

R(c|x)=1−P(c|x)

此时,若最小化分类错误率的贝叶斯最优分类器为

h∗(x)=argmaxcϵyP(c|x)

即选择能使后验概率P(c|x)最大的类别标记。
基于贝叶斯公式,

P(c|x)=P(c)P(x|c)P(x)

其中,P(c)是类"先验"概率,P(x|c)是样本x的相对类标记c的类条件概率或称为“似然”。
类先验概率P(c)表达样本空间中各类样本所占的比例,根据大数定律,可通过各类样本出现的频率估计,对于类条件概率由于涉及x的所有属性的了联合概率,直接计算很困难,需要借助极大似然估计。另外,由于类条件概率难以直接计算,处理时也有简单的zu做属性独立性假设,这就是朴素贝叶斯。
二、朴素贝叶斯相关的统计学知识
我们先看看条件独立公式,如果X和Y相互独立,则有:

P(X,Y)=P(X)P(Y)

接着看条件概率公式:

P(Y|X)=P(X,Y)P(X)

P(X|Y)=P(X,Y)P(Y)

或者说:

P(Y|X)=P(X|Y)P(Y)P(X)

接着看全概率公式:

P(X)=∑kP(X|Y=Yk)P(Yk)其中∑kP(Yk)=1

从上面公式可以得出贝叶斯公式:

P(Yk|X)=P(X|Yk)P(Yk)∑kP(X|Y=Yk)P(Yk)

三、朴素贝叶斯模型
假如我们的分类模型样本是:

(x(1)1,x(1)2,...x(1)n,y1),(x(2)1,x(2)2,...x(2)n,y2),...(x(m)1,x(m)2,...x(m)n,yn)

即我们有m个样本,每个样本有n个特征,特征输出有K个类别,定义为{C_1,C_2,...,C_K}
从样本我们可以学习得到朴素贝叶斯的先验分布P(Y=C_k)(k=1,2,...K),接着学习到条件概率分布P(X=x|Y=C_k) = P(X_1=x_1, X_2=x_2,...X_n=x_n|Y=C_k),然后我们就可以用贝叶斯公式得到X和Y的联合分布 P(X,Y)了。联合分布P(X,Y)定义为:

P(X,Y=Ck)=P(Y=Ck)P(X=x|Y=Ck)=P(Y=Ck)P(X1=x1,X2=x2,...Xn=xn|Y=Ck)

从上面的式子可以看出P(Y=C_k)比较容易通过最大似然法求出,得到的P(Y=C_k)就是类别C_k在训练集里面出现的频数。但是P(X_1=x_1,X_2=x_2,...X_n=x_n|Y=C_k)很难求出,这是一个超级复杂的有n个维度的条件分布。朴素贝叶斯模型在这里做了一个大胆的假设,即X的n个维度之间相互独立,这样就可以得出:

P(X1=x1,X2=x2,...Xn=xn|Y=Ck)=P(X1=x1|Y=Ck)P(X2=x2|Y=Ck)...P(Xn=xn|Y=Ck)

从上式看出,条件分布得到大大简化,但是这也可能带来预测的不准确性。对于特征之间强关联的情况,建议不用贝叶斯分类。但是一般情况下,样本的特征之间独立这个条件的确是弱成立的,尤其是数据量非常大的时候。虽然我们牺牲了准确性,但是得到的好处是模型的条件分布的计算大大简化了,这就是贝叶斯模型的选择。
最后回到我们要解决的问题,我们的问题是给定测试集的一个新样本特征(x_1^{(test)}, x_2^{(test)}, ...x_n^{(test)}),我们如何判断它属于哪个类型?
既然是贝叶斯模型,当然是后验概率最大化来判断分类了。我们只要计算出所有的K个条件概率P(Y=C_k|X=X^{(test)}),然后找出最大的条件概率对应的类别,这就是朴素贝叶斯的预测了。
四、朴素贝叶斯的推断过程
上节我们已经对朴素贝叶斯的模型也预测方法做了一个大概的解释,这里我们对朴素贝叶斯的推断过程做一个完整的诠释过程。
预测的类别 C_{result}是使P(Y=C_k|X=X^{(test)})最大化的类别,数学表达式:

Cresult=argmax⏟CkP(Y=Ck|X=X(test))=argmax⏟CkP(X=X(test)|Y=Ck)P(Y=Ck)/P(X=X(test))

由于对于所有的类别计算P(Y=C_k|X=X^{(test)})时,上式的分母是一样的,都是P(X=X^{(test)}),因此,我们的预测公式可以简化为:

Cresult=argmax⏟CkP(X=X(test)|Y=Ck)P(Y=Ck)

接着我们利用朴素贝叶斯的独立性假设,就可以得到通常意义上的朴素贝叶斯推断公式:

Cresult=argmax⏟CkP(Y=Ck)n∏j=1P(Xj=X(test)j|Y=Ck)

五、朴素贝叶斯的参数估计
在上一节中,我们知道只要求出P(Y=C_k)P(X_j=X_j^{(test)}|Y=C_k)(j=1,2,...n),我们通过比较就可以得到朴素贝叶斯的推断结果。这一节我们就讨论怎么通过训练集计算这两个概率。
对于 P(Y=C_k),比较简单,通过极大似然估计我们很容易得到P(Y=C_k)为样本类别C_k出现的频率,即样本类别C_k出现的次数m_k除以样本总数m。
对于P(X_j=X_j^{(test)}|Y=C_k)(j=1,2,...n),这个取决于我们的先验条件:
a)如果我们的 X_j是离散的值,那么我们可以假设X_j符合多项式分布,这样得到P(X_j=X_j^{(test)}|Y=C_k)是在样本类别 C_k中,X_j^{(test)}出现的频率。即:

P(Xj=X(test)j|Y=Ck)=mkjtestmk

其中m_k为样本类别C_k出现的次数,而m_{kj^{test}}为类别为 C_k的样本中,第j维特征X_j^{(test)}出现的次数。
某些时候,可能某些类别在样本中没有出现,这样可能导致P(X_j=X_j^{(test)}|Y=C_k)为0,这样会影响后验的估计,为了解决这种情况,我们引入了拉普拉斯平滑,即此时有:

P(Xj=X(test)j|Y=Ck)=mkjtest+λmk+Ojλ

其中λ为一个大于0的常数,常常取为1。Q_j为第j个特征的取值个数。
b)如果我们我们的X_j是非常稀疏的离散值,即各个特征出现概率很低,这时我们可以假设X_j符合伯努利分布,即特征X_j出现记为1,不出现记为0。即只要X_j出现即可,我们不关注X_j的次数。这样得到P(X_j=X_j^{(test)}|Y=C_k)是在样本类别C_k中,X_j^{(test)}出现的频率。此时有:

P(Xj=X(test)j|Y=Ck)=P(Xj|Y=Ck)X(test)j+(1−P(Xj|Y=Ck))(1−X(test)j)

其中,X_j^{(test)}取值为0和1。
c)如果我们我们的X_j是连续值,我们通常取X_j的先验概率为正态分布,即在样本类别C_k中,X_j的值符合正态分布。这样P(X_j=X_j^{(test)}|Y=C_k)的概率分布是:

P(Xj=X(test)j|Y=Ck)=1√2πσ2kexp(−(X(test)j−μk)22σ2k)

其中μ_kσ_k^2是正态分布的期望和方差,可以通过极大似然估计求得。μ_k为在样本类别C_k中,所有X_j的平均值。σ_k^2为在样本类别 C_k中,所有X_j的方差。对于一个连续的样本值,带入正态分布的公式,就可以求出概率分布了。
六、朴素贝叶斯算法过程
我们假设训练集为m个样本n个维度,如下:

(x(0)1,x(0)2,...x(0)n,y0),(x(1)1,x(1)2,...x(1)n,y1),...(x(m)1,x(m)2,...x(m)n,yn)

共有K个特征输出类别,分别为{C_1,C_2,...,C_K},每个特征输出类别的样本个数为{m_1,m_2,...,m_K},在第k个类别中,如果是离散特征,则特征 X_j各个类别取值为m_{jl}。其中l取值为1,2,...S_jS_j为特征j不同的取值数。

输出为实例X^{(test)}的分类。

算法流程如下:
1) 如果没有Y的先验概率,则计算Y的K个先验概率:P(Y=C_k) = m_k/m,否则P(Y=C_k)为输入的先验概率。
2) 分别计算第k个类别的第j维特征的第l个个取值条件概率:P(X_j=x_{jl}|Y=C_k)
a)如果是离散值:

P(Xj=xjl|Y=Ck)=mjl+λmk+nλ

λλ 可以取值为1,或者其他大于0的数字。
b)如果是稀疏二项离散值:

P(Xj=xjl|Y=Ck)=P(j|Y=Ck)xjl+(1−P(j|Y=Ck)(1−xjl)

此时l只有两种取值。
c)如果是连续值不需要计算各个l的取值概率,直接求正态分布的参数:

P(Xj=xj|Y=Ck)=1√2πσ2kexp(−(xj−μk)22σ2k)

需要求出mu_k和sigma_k^2,μ_k 为在样本类别C_k中,所有X_j的平均值。\sigma_k^2为在样本类别C_k中,所有X_j的方差。
3)对于实例X^{(test)},分别计算:

P(Y=Ck)n∏j=1P(Xj=x(test)j|Y=Ck)

4)确定实例X^{(test)}的分类C_result:

Cresult=argmax⏟CkP(Y=Ck)n∏j=1P(Xj=X(test)j|Y=Ck)

从上面的计算可以看出,没有复杂的求导和矩阵运算,因此效率很高。
//todo
参考:刘建平Pinard:www.cnblogs.com/pinard/p/60…
周志华《机器学习》