机器学习(六)朴素贝叶斯分类

一 贝叶斯分类理论

有一个数据集,有两类数据租车给,数据分布如下:

用p1(x,y)表示数据点(x,y)属于类别1,也就是红色表示的类别的概率;

用p2(x,y)表示数据点(x,y)属于类别2,也就是蓝色表示的类别概率;

那么对于新数据点(x,y),可以用下面的规则来判断它的类别:

如果p1(x,y)>p2(x,y),那么类别为1

如果p1(x,y)<p2(x,y),那么类别为2

可以看出来,我们会选择高概率对应的类别,贝叶斯决策理论的核心就是选择最高概率的决策。

二 条件概率

条件概率是指事件A在另外一个事件B已经发生条件下的发生概率,也就是P(A|B)。

事件A发生的概率就是P(A∩B)除以P(B)。

𝑃(𝐴|𝐵)=𝑃(𝐴∩𝐵)/𝑃(𝐵),因此,𝑃(𝐴∩𝐵)=𝑃(𝐴|𝐵)𝑃(𝐵)

𝑃(𝐴∩𝐵)=𝑃(𝐵|𝐴)𝑃(𝐴),即𝑃(𝐴|𝐵)=𝑃(B|A)𝑃(𝐴)/𝑃(𝐵)

这就是条件概率的计算公式。

三 全概率公式

假定样本空间s,是两个事件A和A'的和。

那么事件B可以划分为两个部分。

即:𝑃(𝐵)=𝑃(𝐵∩𝐴)+𝑃(𝐵∩𝐴′)

在上面的推导当中,我们已知𝑃(𝐵∩𝐴)=𝑃(𝐵|𝐴)𝑃(𝐴)

所以𝑃(𝐵)=𝑃(𝐵|𝐴)𝑃(𝐴)+𝑃(𝐵|𝐴′)𝑃(𝐴′)

这就是全概率公式。

含义就是,如果A和A'构成样本空间的一个划分,那么B的改了,就等于A和A'的概率分别乘以B对这两个事件的条件概率之和。

那么条件概率可以变换为:

四 贝叶斯推断

条件概率变形:

P(A)称为"先验概率"(Prior probability),即在B事件发生之前,我们对A事件概率的一个判断。

P(A|B)称为"后验概率"(Posterior probability),即在B事件发生之后,我们对A事件概率的重新评估。

P(B|A)/P(B)称为"可能性函数"(Likelyhood),调整因子,使得预估概率更接近真实概率。

】条件概率可以理解:后验概率 = 先验概率x调整因子

这就是贝叶斯推断的含义。我们先预估一个"先验概率",然后加入实验结果,看这个实验到底是增强还是削弱了"先验概率",由此得到更接近事实的"后验概率"。

五 朴素贝叶斯推断

贝叶斯和朴素贝叶斯的概念是不同的,区别就在于"朴素"二字。朴素贝叶斯对条件概率分布做了条件独立性的假设。

比如下面的公式,假设有n个特征:

根据贝叶斯定理,后验概率 P(a|X) 可以表示为:

其中:

P(X|a) 是给定类别 ( a ) 下观测到特征向量 X=(x_1, x_2, ..., x_n) 的概率;

P(a) 是类别 a 的先验概率;

P(X) 是观测到特征向量 X 的边缘概率,通常作为归一化常数处理。

朴素贝叶斯分类器的关键假设是特征之间的条件独立性,即给定类别 a ,特征 x_i 和 x_j (其中相互独立。)

因此,我们可以将联合概率 P(X|a) 分解为各个特征的概率乘积:

将这个条件独立性假设应用于贝叶斯公式,我们得到:

通过计算每种可能类别的条件概率和先验概率,选择具有最高概率的类别作为预测结果。

六 拉普拉斯平滑系数

因为某些事件或者特征可能从未出现,会导致它们的概率被估计为0。

在实际应用中,即使某个事件或特征没有出现在训练集,也不排除其在以后的样本出现。

而我们的拉普拉斯平滑技术可以避免这种零概率陷阱。

一般我们的α取值为1,m为总的特征的数量。

即使某个特征在训练集指令从未出现,它的概率也不会被估计为0,而是会被赋予一个很小但是非0的值,从而避免了模型在面对新数据时可能出现的过拟合或预测错误。

七 API

复制代码
sklearn.naive_bayes.MultinomialNB()estimator.fit(x_train, y_train)y_predict = estimator.predict(x_test)

代码实例:

复制代码
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
# 1)获取数据
news =load_iris()
# 2)划分数据集
x_train, x_test, y_train, y_test = train_test_split(news.data, news.target)
# 3)特征工程:不用做标准化
# 4)朴素贝叶斯算法预估器流程
estimator = MultinomialNB()
estimator.fit(x_train, y_train)
# 5)模型评估
score = estimator.score(x_test, y_test)
print("准确率为:\n", score)
# 6)预测
index=estimator.predict([[2,2,3,1]])
print("预测:\n",index,news.target_names,news.target_names[index])

补充:贝叶斯实现葡萄酒分类

相关推荐
z20348315204 分钟前
我与C++的故事
开发语言·c++·c++40周年
骄傲的心别枯萎7 分钟前
RV1126 NO.45:RV1126+OPENCV在视频中添加LOGO图像
人工智能·opencv·计算机视觉·音视频·rv1126
这儿有一堆花10 分钟前
向工程神经网络对二进制加法的巧妙解决方案
人工智能·深度学习·神经网络
撬动未来的支点13 分钟前
【AI】拆解神经网络“技术高墙”:一条基于“根本原理-补丁理论-AI部署”哲学的学习路径
人工智能·神经网络
盘古开天166622 分钟前
从零开始:如何搭建你的第一个简单的Flask网站
后端·python·flask
wuwu_q35 分钟前
用通俗易懂 + Android 开发实战的方式讲解 Kotlin Flow 中的 filter 操作符
android·开发语言·kotlin
dxnb2243 分钟前
【Datawhale25年11月组队学习:hello-agents+Task1学习笔记】
人工智能·学习
二进制星轨1 小时前
Transofrmer架构详解与PyTorch实现(附代码讲解)
人工智能·pytorch·python
想唱rap1 小时前
Linux开发工具(4)
linux·运维·服务器·开发语言·算法