1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 机器学习-朴素贝叶斯(高斯 多项式 伯努利)

机器学习-朴素贝叶斯(高斯 多项式 伯努利)

时间:2019-04-12 20:58:57

相关推荐

机器学习-朴素贝叶斯(高斯 多项式 伯努利)

文章目录

简介贝叶斯模型朴素贝叶斯高斯朴素贝叶斯多项式朴素贝叶斯伯努利朴素贝叶斯小结

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

简介

贝叶斯分类器主要思想是基于贝叶斯定理,是机器学习中重要的分类算法,适用于高维度的大数据集,速度快,准确率高,一个经典的应用场景是识别垃圾邮件。

首先需要知道一些概率论的知识:

先验概率

根据经验和分析得到的概率。条件概率

事件B发生的前提下,事件A发生的概率。后验概率

结果发生之后,推测原因的概率。

比如箱子里有4个小球,3个蓝色1个红色,且分别标有数字0和1:

那么我们很容易知道先验概率:

P(红)=14\frac{1}{4}41​,P(蓝)=34\frac{3}{4}43​

P(0)=12\frac{1}{2}21​,P(1)=12\frac{1}{2}21​

相应的条件概率:

P(1|蓝)=23\frac{2}{3}32​,P(0|蓝)=13\frac{1}{3}31​

P(1|红)=000,P(0|红)=111

比如P(1|蓝)表示抽中蓝色球的前提下,数字是1的概率。也就是3个蓝球中有两个为1。

往往困难的是后验概率的计算,比如知道结果是数字0,那导致结果(数字0)的条件(颜色)概率怎么计算?即P(蓝|0)和P(红|0)。

虽然这个例子的后验概率也能一眼看出,那假设不知道,又如何通过先验概率和条件概率进行求解呢?这就是贝叶斯定理解决的问题。

贝叶斯公式如下:

P(A∣B)=P(A)P(B∣A)P(B)P(A|B)=\frac{P(A)~P(B|A)}{P(B)}P(A∣B)=P(B)P(A)P(B∣A)​

带入公式:

P(蓝∣0)=P(蓝)P(0∣蓝)P(0)=34⋅1312=12P(蓝|0)=\frac{P(蓝)P(0|蓝)}{P(0)}=\frac{\frac{3}{4}·\frac{1}{3}}{\frac{1}{2}}=\frac{1}{2}P(蓝∣0)=P(0)P(蓝)P(0∣蓝)​=21​43​⋅31​​=21​

P(红∣0)=P(红)P(0∣红)P(0)=14⋅112=12P(红|0)=\frac{P(红)P(0|红)}{P(0)}=\frac{\frac{1}{4}·1}{\frac{1}{2}}=\frac{1}{2}P(红∣0)=P(0)P(红)P(0∣红)​=21​41​⋅1​=21​

对应验证图中两个数字0的球中,1个蓝色,1个红色。

贝叶斯模型

设特征向量X\bold XX有nnn个属性,即X={x1,x2,…,xn}\bold X=\{x_1,x_2,…,x_n\}X={x1​,x2​,…,xn​},标签YYY有KKK个类,记为{C1,C2,…,CK}\{C_1,C_2,…,C_K\}{C1​,C2​,…,CK​},在训练样本中用极大似然法统计频率,从而学习到先验分布P(Y=Ck),(k=1,2,...,K)P(Y=C_k),(k=1,2,...,K)P(Y=Ck​),(k=1,2,...,K),同样也可以学习到条件分布P(X=x∣Y=Ck)=P(X1=x1,X2=x2,…,Xn=xn∣Y=Ck)P(\bold X=\bold x|Y=C_k)=P(X_1=x_1,X_2=x_2,\dots,X_n=x_n|Y=C_k)P(X=x∣Y=Ck​)=P(X1​=x1​,X2​=x2​,…,Xn​=xn​∣Y=Ck​)。

对于新的测试数据x\bold xx,利用贝叶斯公式,就可求得属于第kkk个类别CkC_kCk​的概率:

P(Y=Ck∣X=x)=P(Y=Ck)P(X=x∣Y=Ck)P(X=x)P(Y=C_k|\bold X=\bold x)=\frac{P(Y=C_k)~P(\bold X=\bold x|Y=C_k)}{P(\bold X=\bold x)}P(Y=Ck​∣X=x)=P(X=x)P(Y=Ck​)P(X=x∣Y=Ck​)​

最后比较属于各个类别的概率P(Y=Ck∣X=x),(k=1,2,…,K)P(Y=C_k|\bold X=\bold x),(k=1,2,\dots,K)P(Y=Ck​∣X=x),(k=1,2,…,K),将概率最大的作为预测类别。

朴素贝叶斯

但是上述模型中存在一个头疼的问题:P(X1=x1,X2=x2,…,Xn=xn∣Y=Ck)P(X_1=x_1,X_2=x_2,\dots,X_n=x_n|Y=C_k)P(X1​=x1​,X2​=x2​,…,Xn​=xn​∣Y=Ck​)很难求出,比如有50个特征,每个特征只有2个属性,那么特征排列组合得到的计算量都有2502^{50}250这么大。

为此朴素贝叶斯(naive bayes)采用了“属性条件独立性假设”,也就是考虑特征属性的取值互不干扰,是独立的。如果X和Y是相互独立的,那么由条件独立公式:P(X,Y)=P(X)P(Y)P(X,Y)=P(X)P(Y)P(X,Y)=P(X)P(Y),得到朴素贝叶斯模型:

P(Y=Ck∣X=x)=P(Y=Ck)P(X=x)∏i=1nP(Xi=xi∣Y=Ck)P(Y=C_k|\bold X=\bold x)=\frac{P(Y=C_k)}{P(\bold X=\bold x)}\prod_{i=1}^nP(X_i=x_i|Y=C_k)P(Y=Ck​∣X=x)=P(X=x)P(Y=Ck​)​i=1∏n​P(Xi​=xi​∣Y=Ck​)

对于一个测试数据x\bold xx,计算它在不同类别的概率,由于最后只需要比较大小,取概率最大的类,所以简化掉相同分母,得到表达式:

maxCk∈CP(Y=Ck)∏P(Xi=xi∣Y=Ck)\mathop{max}\limits_{C_k\in C}~P(Y=C_k)\prod P(X_i=x_i|Y=C_k)Ck​∈Cmax​P(Y=Ck​)∏P(Xi​=xi​∣Y=Ck​)

最后,在计算先验概率时,需要考虑不同的分布假设,比如离散值和连续值的参数求解是不一样的。包括高斯朴素贝叶斯、多项式朴素贝叶斯和伯努利朴素贝叶斯三种。

高斯朴素贝叶斯

高斯朴素贝叶斯的特征变量是连续型变量,样本符合高斯分布或正态分布。如人的身高。

使用正态分布的概率密度函数来算概率:

P(xi∣y)=12πσy2exp(−(xi−μy)22σy2)P(x_i|y)=\frac{1}{\sqrt{2\pi\sigma_y^2}}exp(-\frac{(x_i-\mu_y)^2}{2\sigma_y^2})P(xi​∣y)=2πσy2​​1​exp(−2σy2​(xi​−μy​)2​)

μy\mu_yμy​表示类别为yyy的样本中,特征xix_ixi​的均值;

σy\sigma_yσy​表示类别为yyy的样本中,特征xix_ixi​的标准差;

使用sklearn库中GaussianNB()创建高斯朴素贝叶斯模型:

import matplotlib.pyplot as pltimport numpy as npimport pandas as pdfrom matplotlib.colors import ListedColormapfrom sklearn.datasets import make_blobsfrom sklearn.model_selection import train_test_splitfrom sklearn.naive_bayes import GaussianNBfrom sklearn.metrics import classification_reportimport seaborn as snsdef plot_boundary(model, axis): # 画边界x0, x1 = np.meshgrid(np.linspace(axis[0], axis[1], int((axis[1] - axis[0]) * 100)).reshape(-1, 1),np.linspace(axis[2], axis[3], int((axis[3] - axis[2]) * 100)).reshape(-1, 1),)X_new = np.c_[x0.ravel(), x1.ravel()]y_predict = model.predict(X_new)zz = y_predict.reshape(x0.shape)custom_cmap = ListedColormap(['#A1FFA1', '#FFE9C5', '#FFB3E2', '#C6C6C6'])plt.contourf(x0, x1, zz, cmap=custom_cmap)# 创建数据:400个样本,2个特征,4个类别,方差3X, y = make_blobs(400, 2, centers=4, cluster_std=3, center_box=(10, 30), random_state=1026)x_train, x_test, y_train, y_test = train_test_split(X, y) # 划分训练集测试集gnb = GaussianNB() # 高斯朴素贝叶斯gnb.fit(x_train, y_train) # 训练y_pred = gnb.predict(x_test) # 测试# 结果和相关参数print('先验概率:', gnb.class_prior_)print('标签:', gnb.classes_)print('均值:', gnb.theta_)print('方差:', gnb.sigma_)print('预测概率:', gnb.predict_proba(x_test))# 评估print(classification_report(y_test, y_pred))# 可视化plot_boundary(gnb, axis=[4, 31, 4, 36]) # 边界plt.scatter(X[:, 0], X[:, 1], c=y, cmap='Accent') # 数据点#cm = pd.crosstab(y_pred, y_test) # 混淆矩阵#sns.heatmap(data=cm, annot=True, cmap='GnBu', fmt='d')#plt.xlabel('Real')#plt.ylabel('Predict')plt.show()

多项式朴素贝叶斯

多项式朴素贝叶斯的特征变量是离散型变量,样本符合多项分布。如掷色子。

特征值不能是负数。

P(xi∣y)=Nyi+αNy+αnP(x_i|y)=\frac{N_{y_i}+\alpha}{N_y+\alpha n}P(xi​∣y)=Ny​+αnNyi​​+α​

α\alphaα表示平滑系数;

NyN_yNy​表示属于类别yyy所有的样本数;

NyiN_{y_i}Nyi​​表示第iii个特征中,属于类别yyy的样本数;

nnn表示特征数量。

插播反爬信息)博主CSDN地址:https://wzlodq./

使用sklearn库中MultinomialNB()创建多项式朴素贝叶斯模型:

import matplotlib.pyplot as pltimport numpy as npimport pandas as pdfrom matplotlib.colors import ListedColormapfrom sklearn.datasets import make_blobsfrom sklearn.model_selection import train_test_splitfrom sklearn.naive_bayes import MultinomialNBfrom sklearn.metrics import classification_reportimport seaborn as snsdef plot_boundary(model, axis): # 画边界x0, x1 = np.meshgrid(np.linspace(axis[0], axis[1], int((axis[1] - axis[0]) * 100)).reshape(-1, 1),np.linspace(axis[2], axis[3], int((axis[3] - axis[2]) * 100)).reshape(-1, 1),)X_new = np.c_[x0.ravel(), x1.ravel()]y_predict = model.predict(X_new)zz = y_predict.reshape(x0.shape)custom_cmap = ListedColormap(['#A1FFA1', '#FFE9C5', '#FFB3E2', '#C6C6C6'])plt.contourf(x0, x1, zz, cmap=custom_cmap)# 创建数据:400个样本,2个特征,4个类别,方差3X, y = make_blobs(400, 2, centers=4, cluster_std=3, center_box=(10, 30), random_state=1026)x_train, x_test, y_train, y_test = train_test_split(X, y) # 划分训练集测试集mnb = MultinomialNB() # 多项式朴素贝叶斯mnb.fit(x_train, y_train) # 训练y_pred = mnb.predict(x_test) # 测试# 结果和相关参数print('标签:', mnb.classes_)print('预测概率:', mnb.predict_proba(x_test))# 评估print(classification_report(y_test, y_pred))# 可视化plot_boundary(mnb, axis=[4, 31, 4, 36]) # 边界plt.scatter(X[:, 0], X[:, 1], c=y, cmap='Accent') # 数据点#cm = pd.crosstab(y_pred, y_test) # 混淆矩阵#sns.heatmap(data=cm, annot=True, cmap='GnBu', fmt='d')#plt.xlabel('Real')#plt.ylabel('Predict')plt.show()

伯努利朴素贝叶斯

伯努利朴素贝叶斯的特征变量是布尔型变量,样本符合二项分布或0-1分布。如抛硬币、特征词是否在文本中出现。

特征值只有两个结果0和1,如果不是的话,需要进行二值化处理。

P(xi=1∣y)=Nyi+αNy+2αP(xi=0∣y)=1−P(xi=1∣y)P(x_i=1|y)=\frac{N_{y_i}+\alpha}{N_y+2\alpha}\\P(x_i=0|y)=1-P(x_i=1|y)P(xi​=1∣y)=Ny​+2αNyi​​+α​P(xi​=0∣y)=1−P(xi​=1∣y)

α\alphaα表示平滑系数;

NyN_yNy​表示属于类别yyy所有的样本数;

NyiN_{y_i}Nyi​​表示第iii个特征中,属于类别yyy的样本数。

使用sklearn库中BernoulliNB()创建伯努利朴素贝叶斯模型。

由于特征属性要二值化处理,前面的数据不利于展示其特长,以文本分类为例介绍(涉及TF-IDF算法可参考我这篇博客)

import matplotlib.pyplot as pltimport pandas as pdfrom sklearn.model_selection import train_test_splitfrom sklearn.naive_bayes import BernoulliNBfrom sklearn.metrics import classification_reportimport seaborn as snsfrom sklearn.datasets import fetch_20newsgroupsfrom sklearn.feature_extraction.text import TfidfVectorizernews = fetch_20newsgroups() # 读数据x_train, x_test, y_train, y_test = train_test_split(news.data, news.target,) # 划分训练集测试集transfer = TfidfVectorizer() # TF-IDF抽取文本特征x_train = transfer.fit_transform(x_train)x_test = transfer.transform(x_test)print("抽取特征:\n", transfer.get_feature_names_out())bnb = BernoulliNB() # 伯努利朴素贝叶斯bnb.fit(x_train, y_train) # 训练y_pred = bnb.predict(x_test) # 测试# 结果和相关参数print('标签:', bnb.classes_)print('预测概率:', bnb.predict_proba(x_test))# 评估print(classification_report(y_test, y_pred))# 可视化cm = pd.crosstab(y_pred, y_test) # 混淆矩阵sns.heatmap(data=cm, annot=True, cmap='GnBu', fmt='d')plt.xlabel('Real')plt.ylabel('Predict')plt.title('Bernoulli Naive Bayes')plt.show()

也可以用多项式朴素贝叶斯,都是离散值。

小结

高斯NB用于连续值;多项式NB用于离散的多值;伯努利NB用于离散的二值。

贝叶斯分类器先对联合概率P(X|Y)建模,然后再由此得到P(Y|X),属于「生成式模型」。而通过训练属性X直接建模P(Y|X)的模型成为「判别式模型」,如支持向量机、决策树、感知机等都是判别式模型。

本文介绍了贝叶斯分类器中最常用的朴素贝叶斯,更多的,还有半朴素贝叶斯、贝叶斯网等,感兴趣可深究。

原创不易,请勿转载本不富裕的访问量雪上加霜

博主首页:https://wzlodq./

来都来了,不评论两句吗👀

如果文章对你有帮助,记得一键三连❤

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。