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

这篇具有很好参考价值的文章主要介绍了机器学习-朴素贝叶斯(高斯、多项式、伯努利)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

简介


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

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

  1. 先验概率
    根据经验和分析得到的概率。
  2. 条件概率
    事件B发生的前提下,事件A发生的概率。
  3. 后验概率
    结果发生之后,推测原因的概率。

比如箱子里有4个小球,3个蓝色1个红色,且分别标有数字0和1:
机器学习-朴素贝叶斯(高斯、多项式、伯努利)
那么我们很容易知道先验概率:
P(红)= 1 4 \frac{1}{4} 41,P(蓝)= 3 4 \frac{3}{4} 43
P(0)= 1 2 \frac{1}{2} 21,P(1)= 1 2 \frac{1}{2} 21

相应的条件概率:
P(1|蓝)= 2 3 \frac{2}{3} 32,P(0|蓝)= 1 3 \frac{1}{3} 31
P(1|红)= 0 0 0,P(0|红)= 1 1 1
比如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(AB)=P(B)P(A) P(BA)

带入公式:
P ( 蓝 ∣ 0 ) = P ( 蓝 ) P ( 0 ∣ 蓝 ) P ( 0 ) = 3 4 ⋅ 1 3 1 2 = 1 2 P(蓝|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)=214331=21
P ( 红 ∣ 0 ) = P ( 红 ) P ( 0 ∣ 红 ) P ( 0 ) = 1 4 ⋅ 1 1 2 = 1 2 P(红|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)=21411=21

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

贝叶斯模型


设特征向量 X \bold X X n n n个属性,即 X = { x 1 , x 2 , … , x n } \bold X=\{x_1,x_2,…,x_n\} X={x1,x2,,xn},标签 Y Y Y K K K个类,记为 { C 1 , C 2 , … , C K } \{C_1,C_2,…,C_K\} {C1,C2,,CK},在训练样本中用极大似然法统计频率,从而学习到先验分布 P ( Y = C k ) , ( k = 1 , 2 , . . . , K ) P(Y=C_k),(k=1,2,...,K) P(Y=Ck),(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 ) 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=xY=Ck)=P(X1=x1,X2=x2,,Xn=xnY=Ck)

对于新的测试数据 x \bold x x,利用贝叶斯公式,就可求得属于第 k k k个类别 C k C_k Ck的概率:
P ( Y = C k ∣ X = x ) = P ( Y = C k )   P ( X = x ∣ Y = C k ) 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=CkX=x)=P(X=x)P(Y=Ck) P(X=xY=Ck)

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

朴素贝叶斯


但是上述模型中存在一个头疼的问题: P ( X 1 = x 1 , X 2 = x 2 , … , X n = x n ∣ Y = C k ) P(X_1=x_1,X_2=x_2,\dots,X_n=x_n|Y=C_k) P(X1=x1,X2=x2,,Xn=xnY=Ck)很难求出,比如有50个特征,每个特征只有2个属性,那么特征排列组合得到的计算量都有 2 50 2^{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 = C k ∣ X = x ) = P ( Y = C k ) P ( X = x ) ∏ i = 1 n P ( X i = x i ∣ Y = C k ) 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=CkX=x)=P(X=x)P(Y=Ck)i=1nP(Xi=xiY=Ck)

对于一个测试数据 x \bold x x,计算它在不同类别的概率,由于最后只需要比较大小,取概率最大的类,所以简化掉相同分母,得到表达式:
m a x C k ∈ C   P ( Y = C k ) ∏ P ( X i = x i ∣ Y = C k ) \mathop{max}\limits_{C_k\in C}~P(Y=C_k)\prod P(X_i=x_i|Y=C_k) CkCmax P(Y=Ck)P(Xi=xiY=Ck)

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

高斯朴素贝叶斯


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

使用正态分布的概率密度函数来算概率:
P ( x i ∣ y ) = 1 2 π σ y 2 e x p ( − ( x i − μ y ) 2 2 σ y 2 ) P(x_i|y)=\frac{1}{\sqrt{2\pi\sigma_y^2}}exp(-\frac{(x_i-\mu_y)^2}{2\sigma_y^2}) P(xiy)=2πσy2 1exp(2σy2(xiμy)2)
μ y \mu_y μy表示类别为 y y y的样本中,特征 x i x_i xi的均值;
σ y \sigma_y σy表示类别为 y y y的样本中,特征 x i x_i xi的标准差;

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

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from matplotlib.colors import ListedColormap
from sklearn.datasets import make_blobs
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import classification_report
import seaborn as sns

def 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个类别,方差3
X, y = make_blobs(400, 2, centers=4, cluster_std=3, center_box=(10, 30), random_state=20221026)
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 ( x i ∣ y ) = N y i + α N y + α n P(x_i|y)=\frac{N_{y_i}+\alpha}{N_y+\alpha n} P(xiy)=Ny+αnNyi+α
α \alpha α表示平滑系数;
N y N_y Ny表示属于类别 y y y所有的样本数;
N y i N_{y_i} Nyi表示第 i i i个特征中,属于类别 y y y的样本数;
n n n表示特征数量。

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

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

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from matplotlib.colors import ListedColormap
from sklearn.datasets import make_blobs
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_report
import seaborn as sns

def 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个类别,方差3
X, y = make_blobs(400, 2, centers=4, cluster_std=3, center_box=(10, 30), random_state=20221026)
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 ( x i = 1 ∣ y ) = N y i + α N y + 2 α P ( x i = 0 ∣ y ) = 1 − P ( x i = 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=1y)=Ny+2αNyi+αP(xi=0y)=1P(xi=1y)
α \alpha α表示平滑系数;
N y N_y Ny表示属于类别 y y y所有的样本数;
N y i N_{y_i} Nyi表示第 i i i个特征中,属于类别 y y y的样本数。

使用sklearn库中BernoulliNB()创建伯努利朴素贝叶斯模型。
由于特征属性要二值化处理,前面的数据不利于展示其特长,以文本分类为例介绍(涉及TF-IDF算法可参考我这篇博客)

import matplotlib.pyplot as plt
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import BernoulliNB
from sklearn.metrics import classification_report
import seaborn as sns
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer

news = 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.blog.csdn.net/
来都来了,不评论两句吗👀
如果文章对你有帮助,记得一键三连❤文章来源地址https://www.toymoban.com/news/detail-408909.html

到了这里,关于机器学习-朴素贝叶斯(高斯、多项式、伯努利)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 支持向量机SVM(包括线性核、多项式核、高斯核)python手写实现+代码框架说明

    理论参考《统计学习方法》Chapter.7 支持向量机(SVM) 完整代码见github仓库:https://github.com/wjtgoo/SVM-python 借鉴sklearn的代码构架,整体功能实现在SVM类中,包括各种类属性,以及常用的模型训练函数 SVM.fit(x,y,iterations) ,以及预测函数 SVM.predict(x) , 类输入参数 kernal: 默认:线性

    2023年04月17日
    浏览(82)
  • 机器学习_数据升维_多项式回归代码_保险案例数据说明_补充_均匀分布_标准正太分布---人工智能工作笔记0038

    然后我们再来看一下官网注意上面这个旧的,现在2023-05-26 17:26:31..我去看了新的官网, scikit-learn已经添加了很多新功能,     我们说polynomial多项式回归其实是对数据,进行 升维对吧,从更多角度去看待问题,这样 提高模型的准确度. 其实y=w0x0+w1x1.. 这里就是提高了这个x的个数对吧

    2024年02月06日
    浏览(39)
  • geemap学习笔记052:影像多项式增强

    下面介绍的主要内容是应用 Image.polynomial() 对图像进行多项式增强。 多项式增强后的结果 大家如果有问题需要交流或者有项目需要合作,可以加 Q Q :504156006 详聊,加好友请留言“CSDN”,谢谢。

    2024年01月23日
    浏览(33)
  • 自动驾驶规划模块学习笔记-多项式曲线

    自动驾驶运动规划中会用到各种曲线,主要用于生成车辆变道的轨迹,高速场景中使用的是五次多项式曲线,城市场景中使用的是分段多项式曲线(piecewise),相比多项式,piecewise能够生成更为复杂的路径。另外对于自由空间,可以使用A*搜索出的轨迹再加以cilqr加以平滑,也

    2024年02月05日
    浏览(53)
  • 机器人在笛卡尔空间和关节空间的多项式轨迹规划以及matlab代码(三次、五次、七次)

    三次多项式轨迹规划就是s(t)相对于时间t的变化满足三次多项式变化,其表达式如下:                      如前文所述:t的取值范围是[0,T],s(t)的取值范围是[0,1], 又因为初始速度和末速度都为0,所以: S(t)的一阶导数表达式为: 从而可以计算出对应的系数: 将

    2024年01月17日
    浏览(29)
  • AA@有理系数多项式@整系数多项式@本原多项式@有理多项式可约问题

    有理数域上一元多项式的因式分解. 作为 因式分解定理 的一个特殊情形,我们有结论: 每个次数大等于1的 有理系数多项式 都能 唯一地 分解成 不可约的有理系数多项式 的乘积. 有理数域版本中,从一般数域具体到了\\\" 有理系数 \\\" 我们讨论多项式的时候,都假设多项式是在某个数

    2024年02月16日
    浏览(41)
  • P4725 【模板】多项式对数函数(多项式 ln)

    洛谷P4725 【模板】多项式对数函数(多项式 ln) 题目大意 给你一个 n − 1 n-1 n − 1 次多项式 A ( x ) A(x) A ( x ) ,求一个   m o d   x n bmod x^n mod x n 下的多项式 B ( x ) B(x) B ( x ) ,满足 B ( x ) ≡ ln ⁡ A ( x ) B(x)equiv ln A(x) B ( x ) ≡ ln A ( x ) 。 在   m o d   998244353 bmod 998244353 mo

    2024年02月03日
    浏览(47)
  • 用链表表示多项式,并实现多项式的加法运算

    输入格式: 输入在第一行给出第一个多项式POLYA的系数和指数,并以0,0 结束第一个多项式的输入;在第二行出第一个多项式POLYB的系数和指数,并以0,0 结束第一个多项式的输入。 输出格式: 对每一组输入,在一行中输出POLYA+POLYB和多项式的系数和指数。 输入样例: 输出样例: 本

    2024年02月07日
    浏览(57)
  • MATLAB仿真UR5机器人simulink simscape 自制建模 正向运动学,逆向运动学关节空间轨迹规划 五次多项式轨迹规划

    MATLAB仿真UR5机器人simulink simscape 自制建模  正向运动学,逆向运动学 关节空间轨迹规划 五次多项式轨迹规划 笛卡尔空间轨迹规划 直线插补    还包含机器人工具箱建立的模型对比 MATLAB仿真UR5机器人simulink simscape 自制建模及运动学规划 摘要:本文介绍了利用MATLAB仿真UR5机器

    2024年02月04日
    浏览(52)
  • 基于MATLAB的矩阵性质:行列式,秩,迹,范数,特征多项式与矩阵多项式

    本节主要讨论矩阵的基本概念和性质,结合MATLAB的基础代码,适合新手。 矩阵的 行列式 的数学定义如下: MATLAB调用的格式如下: 求以下矩阵的行列式: 解: MATLAB代码如下: 运行结果: ans =    5.1337e-13 利用解析解的方法计算20✖️20的Hilbert矩阵的行列式,并分析其代码运

    2024年02月05日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包