三种常用的朴素贝叶斯实现算法——高斯朴素贝叶斯、伯努利朴素贝叶斯、多项式朴素贝叶斯

在sklearn中,提供了若干种朴素贝叶斯的实现算法,不同的朴素贝叶斯算法,主要是对P(xi|y)的分布假设不同,进而采用不同的参数估计方式。我们能够发现,朴素贝叶斯算法,主要就是计算P(xi|y),一旦P(xi|y)确定,最终属于每个类别的概率,自然也就迎刃而解了。
常用的三种朴素贝叶斯为:

  • 高斯朴素贝叶斯
  • 伯努利朴素贝叶斯
  • 多项式朴素贝叶斯

高斯朴素贝叶斯

适用于连续变量,其假定各个特征xi在各个类别y下是服从正态分布的,算法内部使用正态分布的概率密度函数来计算概率如下:
在这里插入图片描述
在这里插入图片描述

import numpy as np
import pandas as pd
from sklearn.naive_bayes import GaussianNB

np.random.seed(0)
x = np.random.randint(0,10,size=(6,2))
y = np.array([0,0,0,1,1,1])
data = pd.DataFrame(np.concatenate([x, y.reshape(-1,1)], axis=1), columns=['x1','x2','y'])
display(data)

gnb = GaussianNB()
gnb.fit(x,y)
#每个类别的先验概率
print('概率:', gnb.class_prior_)
#每个类别样本的数量
print('样本数量:', gnb.class_count_)
#每个类别的标签
print('标签:', gnb.classes_)
#每个特征在每个类别下的均值
print('均值:',gnb.theta_)
#每个特征在每个类别下的方差
print('方差:',gnb.sigma_)

#测试集
x_test = np.array([[6,3]])
print('预测结果:', gnb.predict(x_test))
print('预测结果概率:', gnb.predict_proba(x_test))

在这里插入图片描述

伯努利朴素贝叶斯

设试验E只有两个可能的结果:A与A¯,则称为E为伯努利试验
伯努利朴素贝叶斯,适用于离散变量,其假设各个特征xi在各个类别y下是服从n重伯努利分布(二项分布)的,因为伯努利试验仅有两个结果,因此,算法会首先对特征值进行二值化处理(假设二值化的结果为1与0)。
计算方式如下:
在这里插入图片描述
在训练集中,会进行如下的估计:
在这里插入图片描述
在这里插入图片描述

from sklearn.naive_bayes import BernoulliNB

np.random.seed(0)
x = np.random.randint(-5,5,size=(6,2))
y = np.array([0,0,0,1,1,1])
data = pd.DataFrame(np.concatenate([x,y.reshape(-1,1)], axis=1), columns=['x1','x2','y'])
display(data)

bnb = BernoulliNB()
bnb.fit(x,y)
#每个特征在每个类别下发生(出现)的次数。因为伯努利分布只有两个值。
#我们只需要计算出现的概率P(x=1|y),不出现的概率P(x=0|y)使用1减去P(x=1|y)即可。
print('数值1出现次数:', bnb.feature_count_)
#每个类别样本所占的比重,即P(y)。注意该值为概率取对数之后的结果,
#如果需要查看原有的概率,需要使用指数还原。
print('类别占比p(y):',np.exp(bnb.class_log_prior_))
#每个类别下,每个特征(值为1)所占的比例(概率),即p(x|y)
#该值为概率取对数之后的结果,如果需要查看原有的概率,需要使用指数还原
print('特征概率:',np.exp(bnb.feature_log_prob_))

在这里插入图片描述

多项式朴素贝叶斯

多项式朴素贝叶斯,适用于离散变量,其假设各个特征xi在各个类别y下是服从多项式分布的,故每个特征值不能是负数。
计算如下:
在这里插入图片描述

from sklearn.naive_bayes import MultinomialNB

np.random.seed(0)
x = np.random.randint(0,4,size=(6,2))
y = np.array([0,0,0,1,1,1])
data = pd.DataFrame(np.concatenate([x,y.reshape(-1,1)], axis=1), columns=['x1','x2','y'])
display(data)

mnb = MultinomialNB()
mnb.fit(x,y)
#每个类别的样本数量
print(mnb.class_count_)
#每个特征在每个类别下发生(出现)的次数
print(mnb.feature_count_)
#每个类别下,每个特征所占的比例(概率),即P(x|y)
#该值为概率取对数之后的结果,如果需要查看原有的概率,需要使用指数还原
print(np.exp(mnb.feature_log_prob_))

在这里插入图片描述


版权声明:本文为ws19920726原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。