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

一 贝叶斯分类理论

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

用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])

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

相关推荐
老歌老听老掉牙3 分钟前
符号计算中的表达式等价性验证:数学等价性与计算简化策略分析
python·数学建模·sympy
scan7248 分钟前
向量数据库检索
python
厚德云20 分钟前
全球首款填空式AI绘画提示词工具PromptFill正式发布
人工智能·ai作画·云计算·aigc·ai绘画
yong999020 分钟前
基于MATLAB的随机振动界面设计与功率谱密度分析实现
开发语言·matlab
泰迪智能科技25 分钟前
案例分享|高校实验室建设方向+合作平台+建设成效
人工智能
摸鱼仙人~28 分钟前
一文详解PyTorch DDP
人工智能·pytorch·python
超级种码29 分钟前
Java:JavaAgent技术(java.instrument和java.attach)
java·开发语言·python
胡伯来了31 分钟前
16 Transformers - 使用大语言模型
人工智能·语言模型·自然语言处理
天天向上102431 分钟前
go 配置热更新
开发语言·后端·golang
晨晖21 小时前
顺序查找:c语言
c语言·开发语言·算法