zl程序教程

您现在的位置是:首页 >  其他

当前栏目

[机器学习] 分类算法朴素贝叶斯算法

2023-04-18 12:39:59 时间

朴素贝叶斯算法是来利用统计学中的条件概率来进行分类的一种算法。贝叶斯定理和特征条件独立假设就是朴素贝叶斯的两个重要理论基础。

贝叶斯定理

贝叶斯定理如下:

因此上述的公式可以变为

朴素贝叶斯计算

P(B)计算公式如下,由公式可知P(B)为标准化常量,因此P(B)在朴素贝叶斯概率计算中可以省略。因为朴素贝叶斯算法是分类算法,通过比较各个情况发生下的概率的大小,来确定最后的分类,去掉P(B)不影响最后结果。

$$P(B)=sum_{i=1}^{n}P(x|D_{i})P(D_{i})$$又因为朴素贝叶斯算法对条件概率分布作出了独立性的假设。即(x_{1},x_{2},...,x_{n})相互独立则

$$P(x|D_{j})=P(x_{1},x_{2},...,x_{n}|D_{j})=prod_{i=1}^{n}P(x_{i}|D_{j})$$因此朴素贝叶斯算法的分类函数(f(x))可以表示为

$$f(x)=P(D_{j}|x)=argmax P(D_{j})prod_{i=1}^{n}P(x_{i}|D_{j})$$关于朴素贝叶斯分类,根据(P(x_{i}|y_{k}),P(y_{k}))的不同计算方法,sklearn库中主要以下三种计算模型:

  1. 高斯朴素贝叶斯,主要基于高斯概率密度公式用于分类拟合
  2. 多项式朴素贝叶斯,主要用于高维度向量分类
  3. 伯努利朴素贝叶斯,主要针对布尔型类型进行分类

高斯朴素贝叶斯计算

当特征X是连续变量的时候,通常假定所有特征取值符合正态分布。用高斯朴素贝叶斯计算概率,即:

$$P(x_{i}|D_{j})=frac{1}{sqrt{2pisigma_{{j,k}}^{2}}}e^{-frac{(x_{i}-mu_{{j,k}})^{2}}{2  sigma_{{j,k}}^{2}}}$$

例如下表为一组人类身体特征统计表:

 

性别身高(英尺)体重(磅)脚掌(英寸)
6 180 12
5.92 190 11
5.58 170 12
5.92 165 10
5 100 6
5.5 150 8
5.42 130 7
5.75 150 9

已知某人身高6英尺,体重130磅,脚掌8英寸,请问该人是男是女。

根据前面的朴素贝叶斯分类公式,有:

f(x)=P(性别)x P(身高,体重,脚掌|性别) = P(性别) x P(身高|性别) x P(体重|性别) x P(脚掌|性别)

 

由于身高、体重、脚掌都是连续变量,不能采用离散变量的方法计算概率。而且由于样本太少,所以也无法分成区间计算。

这时,可以假设男性和女性的身高、体重、脚掌都是正态分布,通过样本计算出均值和方差,也就是得到正态分布的密度函数。有了密度函数,就可以把值代入,算出某一点的密度函数的值。 

比如,男性的身高是均值5.855、方差0.035的正态分布。所以,男性的身高为6英尺的概率的相对值等于1.5789(大于1并没有关系,因为这里是密度函数的值,只用来反映各个值的相对可能性)。

例如:

 

 P(男) x  P(身高=6|男) x P(体重=130|男) x P(脚掌=8|男) 
= 0.5 x 1.57888 x 5.99 x e-6x 0.001311 = 6.1984 x e-9 P(女) x P(身高=6|女) x P(体重=130|女) x P(脚掌=8|女)  = 5.3778 x e-4 

可以看到,女性的概率比男性要高出将近10000倍,所以判断该人为女性。

sklearn中对应的函数为GaussianNB(),代码如下

import numpy as np
from sklearn.naive_bayes import GaussianNB

X = np.array([[6 , 5.92, 5.58, 5.92, 5, 5.5, 5.42, 5.75],
            [180, 190, 170, 165, 100, 150, 130, 150],
            [12, 11, 12, 10, 6, 8, 7, 9]])
X = X.T
y = np.array([-1, -1, -1, -1, 1, 1, 1, 1]) #-1表示男,1表示女

clf = GaussianNB().fit(X, y)

#预测
p = [[6, 130, 8]]
print(clf.predict_proba(p)) #输出各个标签的概率值,取最大的概率值为输出标签
print(clf.predict(p)) #结果为1

函数其他参数改动可参考官网文档:

http://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.GaussianNB.html#sklearn.naive_bayes.GaussianNB

多项式模型

$$P(D_{j})=frac{N_{D_{j}}+alpha}{N+kalpha}$$

N是总样本个数,k是类别D中总的类别个数(j=[1, k]),(N_{D_{j}})为(D_{j})的样本个数,(alpha)为平滑值,(alpha=[0, 1])

$$P(x_{i}|D_{j})=frac{N_{D_{j},x_{i}}+alpha}{N_{D_{j}}+(n_{x_{i}})alpha}$$

(n_{x_{i}})是特征x的维数,(N_{D_{j},x_{i}})是类别为(N_{D_{j}})的样本中,第i维特征的值为(x_{i})的样本个数.

sklearn中对应的函数为MultinomialNB,类似于GaussianNB()。代码如下

clf = MultinomialNB().fit(X, y)

函数其他参数改动可参考官网文档:

http://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.MultinomialNB.html#sklearn.naive_bayes.MultinomialNB

伯努利模型

伯努利模型基于以下公式:

当(x_{i}=1),(P(x_{i}|D_{j})=P(x_{i}=1|D_{j}))

当(x_{i}=0),(P(x_{i}|D_{j})=1-P(x_{i}=1|D_{j}))

其中(x_{i})只能为0或者-1。

sklearn中对应的函数为BernoulliNB,类似于GaussianNB()。代码如下

from sklearn.naive_bayes import BernoulliNB
import numpy as np

X = np.random.randint(2, size=(6, 100))
Y = np.array([1, 2, 3, 4, 4, 5])

clf = BernoulliNB().fit(X, Y)
p = [X[2]]
print(clf.predict(p)) #[3]

函数其他参数改动可参考官网文档:

http://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.BernoulliNB.html#sklearn.naive_bayes.BernoulliNB

参考文献

 

  1. 朴素贝叶斯理论推导与三种常见模型
  2. 朴素贝叶斯的三个常用模型:高斯、多项式、伯努利