朴素贝叶斯

朴素贝叶斯

朴素贝叶斯原理

朴素贝叶斯:条件分布+条件独立+全概率

算法原理

条件分布

\[P(Y|X)=\frac{P(X,Y)}{P(X)} \]

贝叶斯可以概括为:先验概率+数据=后验概率。

如果X和Y相互独立,那么

\[P(X,Y)=P(X)P(Y) \]

条件概率表示为:

\[P(Y|X)=\frac{P(X,Y)}{P(X)}\\ P(X|Y)=\frac{P(X,Y)}{P(Y)} \]

或者写为

\[P(Y|X)=\frac{P(X|Y)P(Y)}{P(X)} \]

全概率公式表示为

\[P(X)=\sum_kP(X|Y=Y_k)P(Y_k)\qquad其中\sum_kP(Y_k)=1 \]

从以上公式推导得到

\[P(Y_k|X)=\frac{P(X|Y_k)P(Y_k)}{\sum_kP(X|Y=Y_k)P(Y_k)} \]

朴素贝叶斯模型

假设有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) \]

使用贝叶斯公式和,求得联合分布为

\[\begin{split} P(X,Y=C_k)&=P(Y=C_k)P(X=x|Y=C_K)\\ &=P(Y=C_k)P(X_1=x_1,X_2=x_2,...,X_n=x_n|Y=C_k) \end{split} \]

从上式可以看出\(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个维度是相互独立的,这样可以得出:

\[\begin{split} P(X_1=x_1,X_2=x_2,...,X_n=x_n|Y=C_k)=&P(X_1=x_1|Y=C_k)P(X_2=x_2|Y=C_k)\\&...P(X_n=x_n|Y=C_k) \end{split} \]

从上式可以看出,条件概率极大简化,但如果两个维度不独立,建议不要使用朴素贝叶斯模型。

预测时,只要计算出\(P(Y=C_k|X=X^{(test)})\)然后找出概率最大的类别即可。

推导过程

我们预测\(C_{result}\)是使\(P(Y=C_k|X=X^{(test)})\)最大化的类别,数表示为

\[\begin{split} C_{result}&=\underbrace{argmax}_{C_k}P(Y=C_k|X=X^{(test)})\\ &=\frac{\underbrace{argmax}_{C_k}P(X=X^{(test)}|Y=C_k)P(Y=C_k)}{P(X=X^{(test)})} \end{split} \]

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

\[C_{result}=\underbrace{argmax}_{C_k}P(X=X^{(test)}|Y=C_k)P(Y=C_k) \]

接着,我们使用条件独立性假设,可以得到:

\[C_{result}=\underbrace{argmax}_{C_k}P(Y=C_k)\prod_{j=1}^nP(X_j=X_j^{(test)}|Y=C_k) \]

这就是朴素贝叶斯公式。

参数估计

由上可知,只要求出\(P(Y=C_k)\)\(P(X_j=X_j^{(test)}|Y=C_k)(j=1,2,...,n)\)就可以得到贝叶斯结果。\(P(Y=C_k)\)可以通过样本类别是出现的次数除以总数得到,即计算样本类别的频率。对于\(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)(j=1,2,...,n)\)是在样本类别\(C_k\)中,特征\(X_j^{(test)}\)出现的频率,即:

\[P(X_j=X_j^{(test)}|Y=C_k)=\frac{m_{kj^{test}}}{m_k} \]

其中\(m_k\)为样本类别\(C_k\)总特征计数,而\(m_{kj^{test}}\)为类别为\(C_k\)的样本中,第j维度特征\(X_j^{(test)}\)出现的计数。

为解决某些特征未出现导致计数为0的情况,加入拉普拉斯平滑,从而有:

\[P(X_j=X_j^{(test)}|Y=C_k)=\frac{m_{kj^{test}}+\lambda}{m_k+O_j\lambda} \]

其中,\(\lambda\)为大于0的常数,\(O_j\)为第j个特征取值个数。

b)如果我们的特征\(X_j\)是非常稀疏的离散值,即各个特征出现频率概率很低,我们可以假设\(X_j\)符合伯努利分布,即特征\(X_j\)出现记为1,不出现记为0,此时有

\[P(X_j=X_j^{(test)}|Y=C_k)=P(X_j=1|Y=C_k)X_j^{(test)}+(1-P(X_j=1|Y=C_k))(1-X_j^{(test)}) \]

其中,\(X_j^{(test)}\)取值为0和1。

c)如果\(X_j\)是连续值,我们常取\(X_j\)的先验概率为正态分布,即在样本类别\(C_k\)中,\(X_j\)的值符合正态分布,这样的概率分布是:

\[P(X_j=X_j^{(test)}|Y=C_k)=\frac{1}{\sqrt{2\pi\sigma_k^2}}\exp(-\frac{(X_j^{(test)}-\mu_k)^2}{2\sigma_k^2}) \]

其中,\(\mu_k\)\(\sigma_k^2\)是正态分布的期望和方差,可以通过极大自然估计求得。\(\mu_k\)为在样本类别\(C_k\)中,所有\(X_j\)的平均值。\(\sigma_k^2\)为样本类别\(C_k\)中,所有\(X_j\)的方差。对于一个连续的样本值,带入正态分布就可以求出概率了。

朴素贝叶斯算法过程

假设有m个样本,每个样本有n个维度,共有K个分类,分类\(C_1,C_2,...,C_k\),每个特征输出类别样本个数为\(m_1,m_2,...,m_k\),在第k个类别中,如果是离散的则特征\(X_j\)各类别取值为\(m_{kjl}\),其中取值为\(1,2,...,S_j\)为特征j不同的取值数。

输入实例\(X^{(test)}\)的分类过程如下:

  1. 计算先验概率

    如果没有Y的先验概率,则计算Y的K个先验概率:\(P(Y=C_k)=\frac{m_k+\lambda}{m+K\lambda}\),否则计算\(P(Y=C_k)\)为输入的先验概率

  2. 分别计算第k个类别的第j维度的第l个取值的条件概率\(P(X_j=x_{jl}|Y=C_k)\)

    使用在上面参数估计时,分三种情况计算\(P(X_j=X_j^{(test)}|Y=C_k)\)

    • 离散值

      \[P(X_j=x_{jl}|Y=C_k)=\frac{m_{kjl}+\lambda}{m_k+S_j\lambda} \]

    • 稀疏二项离散值

      \[P(X_j=x_{jl}|Y=C_k)=P(j|Y=C_k)x_{jl}+(1-P(j|Y=C_k))(1-x_{jl}) \]

    • 连续值

      \[P(X_j=x_j|Y=C_k)=\frac{1}{\sqrt{2\pi\sigma_k^2}}\exp(-\frac{(x_j-\mu_k)^2}{2\sigma_k^2}) \]

  3. 对于实例\(X^{(test)}\)分别计算:

    \[P(Y=C_k)\prod_{j=1}^{n}P(X_j=x_j^{(test)}|Y=C_k) \]

    这里是根据独立性假设得来的,假设各维度相互独立,则概率等于各维度概率乘积。前面用到了条件概率公式或者贝叶斯公式,将\(P(X=x|Y=C_k)\)转化为求\(P(Y=C_k|X=x)P(Y=C_k)\)来解决问题。

  4. 确定实例\(X^{(test)}\)分类\(C_{result}\)

    \[C_{result}=\underbrace{argmax}_{C_k}P(Y=C_k)\prod_{j=1}^nP(X_j=X_j^{(test)}|Y=C_k) \]

朴素贝叶斯算法小结

  1. 主要优点

    1)有稳定的分类效率

    2)可以对数据分批计算

    3)对数据缺失不敏感,常用于文本分类

  2. 主要缺点

    1)强假设:各属性之间相互独立

    2)需要先验概率

    3)分类信赖于先验概率,有一定的错误

    4)对输入数据表达形式敏感

朴素贝叶斯使用

主要类库

scikit-learn主要有三个类GaussianNB、MultinomialNB、BernoulliNB,分虽对就先验概率为高斯、多项式和伯努利分布的朴素贝叶斯分布。

GaussianNB

高斯分布即正态分布的表达式如下:

\[P(X_j=x_j|Y=C_k)=\frac{1}{\sqrt{2\pi\sigma_k^2}}\exp(-\frac{(x_j-\mu_k)^2}{2\sigma_k^2}) \]

GaussianNB参数只有一个,即先验概率priors,对应Y的各个类别先验概率\(P(Y=C_k)\),默认不给出,默认使用\(P(Y=C_k)=\frac{m_k}{m}\),其中\(m_k\)为输出第k类别的训练集样本数。

使用fit训练模型,预测模型有三个函数,分别为predict、predict_log_proba和predict_proba。

predict:直接给出预测类别

predict_proba:给出在各类别上预测的概率

predict_log_proba:将概率转化为对数

from sklearn.naive_bayes import GaussianNB

clf = GaussianNB()
clf.fit(X, Y)
clf.predict(test)
clf.predict_proba(test)
clf.predict_log_proba(test)

MultinomialNB

多项式分布先验概率表示如下:

\[P(X_j=x_{jl}|Y=C_k)=\frac{m_{jl}+\lambda}{m_k+n\lambda} \]

其中\(P(X_j=x_{jl}|Y=C_k)\)是第k个类别的第j维特征的第l个取值条件概率,\(m_k\)是训练集第k类样本个数,\(\lambda\)是大于0的常数。使用时参数如下:

1)\(\lambda\)拉普拉斯平滑常数,默认值为1,如需要调优,选择1附近的值。

2)class_prior是否考虑先验概率,如果是false则认为所有样本类别输出都有相同的先验概率

3)如class_prior为true,是输入先验概率

函数使用方法,与GaussianNB相同。

BernoulliNB

伯努利分布,先验概率表示为:

\[P(X_j=x_{jl}|Y=C_k)=P(j|Y=C_k)x_{jl}+(1-P(j|Y=C_k))(1-x_{jl}) \]

前3个参数与MultinomialNB相同,增加的一个是binarize,用来处理二项式分布,如不输入则诊断每个数据特征都是二元的,否则,小于binarize的会归为一类,大于binarize的归为另一类。

posted @ 2020-05-13 15:46  hi_heisen  阅读(226)  评论(0编辑  收藏  举报