zoukankan      html  css  js  c++  java
  • 朴素贝叶斯

    朴素贝叶斯

    朴素贝叶斯原理

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

    算法原理

    条件分布

    [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) ]

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

    [egin{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个维度是相互独立的,这样可以得出:

    [egin{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)}))最大化的类别,数表示为

    [egin{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_jlambda} ]

    其中,(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{2pisigma_k^2}}exp(-frac{(X_j^{(test)}-mu_k)^2}{2sigma_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+Klambda}),否则计算(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_jlambda} ]

      • 稀疏二项离散值

        [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{2pisigma_k^2}}exp(-frac{(x_j-mu_k)^2}{2sigma_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{2pisigma_k^2}}exp(-frac{(x_j-mu_k)^2}{2sigma_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+nlambda} ]

    其中(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的归为另一类。

  • 相关阅读:
    elasticsearch7.6.2实战(1)-单机快速部署
    greenplum数据库常用操作
    kafka集群搭建及结合springboot使用
    msyql主从库配置
    文本相似性算法实现(二)-分组及分句热度统计
    一点区块链资料
    使用.Net Core实现的一个图形验证码
    python中的collections.namedtuple
    Linux中的定时任务at、crontab
    es3中使用es6/7的字符串扩展
  • 原文地址:https://www.cnblogs.com/guesswhy/p/12882802.html
Copyright © 2011-2022 走看看