朴素贝叶斯算法(带例题解释)

本文深入探讨了朴素贝叶斯算法的原理及其在分类任务中的应用,通过具体实例展示了如何利用该算法进行预测,并讨论了算法在面对零概率问题时的改进策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

朴素贝叶斯算法(Naive Bayesian algorithm) 是应用最为广泛的分类算法之一,在垃圾邮件分类等场景展露出了非常优秀的性能。

朴素贝叶斯公式来历

朴素贝叶斯,名字中的朴素二字就代表着该算法对概率事件做了很大的简化,简化内容就是各个要素之间是相互独立的。
比如今天刮风和气温低,两个要素导致了不下雨的结果。实际上刮风可能导致气温低,而且刮风对于天晴的影响会更大,朴素贝叶斯认为刮风和气温之间相互独立,且对于是否下雨这个结果的影响没有轻重之分。用公式来表示这种独立性就是:
在这里插入图片描述
在介绍朴素贝叶斯公式前,先介绍一下条件概率公式。条件概率表示在B已经发生的条件下,A发生概率。
在这里插入图片描述
朴素贝叶斯公式就是条件概率的变形。
假设已有数据为
在这里插入图片描述
其中x为属性值,y为分类结果,共有n个已有数据。每个x有多种属性,以第一组数据为例,上标表示第几个属性值,x的具体表示如下
在这里插入图片描述
假设y的可取值为(c1,c2,…,ck)
则贝叶斯公式表示为
在这里插入图片描述
由公式可以看出,贝叶斯公式就是条件概率的公式。贝叶斯公式的解释很简单:在已有数据的基础上,出现了一个新数据,只有X=(a1,a2,…,am),来预测y的取值。贝叶斯公式就是求在目前X发生的情况下,y取不同值的概率大小进行排序,取最大概率的y值。
其中X有多个属性,朴素贝叶斯假设各个属性之间是独立的,因此
在这里插入图片描述
因此朴素贝叶斯公式可以写成
在这里插入图片描述
此公式的含义就是在目前已知历史数据数据的前提下,出现了一个新的X,求在X已经发生的条件下,y取不同值的概率,然后取使得条件概率最大的y作为预测结果。也就是说寻找y的取值Cn,使得上式最大,用公式表示就是
在这里插入图片描述
这里可以看出,不论求y取任何值Ci的概率,分母都不变,为P(x=X),因此该公式可以简化为:(正因为将P(x=X)省略了,所以我就没有将P(x=X)写成全概率公式的样子)
在这里插入图片描述
其中P(y=Cn)是指y取Cn的值的数量占所有y值数量的百分比;P(xi=ai|y=Cn)表示在y取值为Cn的条件下,xi=ai的条件概率。公式表示如下:(I()函数表示当括号内的条件成立时,记为1。)
在这里插入图片描述
在这里插入图片描述
到这里,朴素贝叶斯的基础原理就完了。顺便提一下生成模型和判别模型吧。大家可以看到,朴素贝叶斯算法在进行判断时,每次都要用到历史数据,在求得概率分布的情况下再对新数据预测,这就是生成模型。什么是判别模型呢,简单的说就是像神经网络算法那种,训练完将各种权重保存起来,有了新数据直接使用权重带入进行计算,最后得出判别结果。这只是顺带提了一句,让读着有个大概的认识,语言并不是很严谨,如果读着想了解更多,请寻找相关的专业介绍生成和判别模型的文章。

举例1

这里使用了《统计学习方法-李航》里的例子。
历史数据为
在这里插入图片描述
x是二维向量,第一维度可取值(1,2,3),第二维度可取值(S,M,L),y可取值(-1,1)。目前有一个新数据x(2,S),使用朴素贝叶斯算法确定y的取值。
解:
目标是比较在数据x(2,S)下,不同y值的条件概率,也就是求P(y=1|x=(2,S))和P(y=-1|x=(2,S))的大小。
在这里插入图片描述
由此公式可知,分母相同,只需要对比分子的大小。
在这里插入图片描述
注意:
P(x1=2|y=1)=3/9数错了,不好意思。图片不方便改,望知悉。

在这里插入图片描述
所以y的取值是-1

原始朴素贝叶斯公式的问题

大家在解例子的时候有没有发现一个问题,假如

在这里插入图片描述
标红框的连乘中有一项为0,也就是说在y取值为Cn的条件下,ai的值没有出现过,所以P(x=X|y=Cn)=0,也就是说y取Cn的可能性为0,与实际不符。很明显这种情况产生了严重的偏差。
为了纠正这种情况产生的偏差,对等式右边的概率计算进行了改进

  1. 先验概率改进计算公式:
    在这里插入图片描述
    式中λ>=0,K是y可取值的总数。当λ=0时,和原来的公式一样,当λ=1时称为拉普拉斯平滑(这个名词的背后历史就不提了,λ尝取的值就是1)。
    不难看出有如下规律
    在这里插入图片描述
    说明Pλ也是一种概率分布,既解决了某些值概率可能为0的问题,又基本符合原来的概率分布。
    2. 条件概率改进计算公式
    在这里插入图片描述
    同样的,λ>=0,Sj表示x第j个维度可取值的总数。同样的对于Pλ(xj=aj|y=Cn)也是一种概率分布,近似代表着改进之前的概率分布。
    有了改进后的先验概率和条件概率的公式,便可以解决了单一条件概率为0时,判断不准确的问题。

举例2

对于例子1,使用拉普拉斯平滑后的概率计算公式来预测。我把题目复制一下,虽然看着累赘,省的回去一直翻着看。
历史数据为
在这里插入图片描述
x是二维向量,第一维度可取值(1,2,3),第二维度可取值(S,M,L),y可取值(-1,1)。目前有一个新数据x(2,S),使用朴素贝叶斯算法确定y的取值。
解:
在这里插入图片描述
在这里插入图片描述
因此可以看出y=-1的概率更大,因此预测结果为-1。这个结果与例子1的结果相同。
本文主要参考了《统计学习方法》这本书,只希望把学习结果能分享给对的人,总结的内容比较浅显简单。

好的,下面给出一个简单的朴素贝叶斯分类算法的实现。 首先,我们需要准备一些训练数据。这里以一个简单的鸢尾花数据集为例,其中包含150个样本,每个样本有4个特征和1个类别标签。我们将其分为70%的训练集和30%的测试集: ```python import numpy as np from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split # 加载数据集 iris = load_iris() X, y = iris.data, iris.target # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) ``` 接下来,我们需要定义朴素贝叶斯分类器的类: ```python class NaiveBayesClassifier: def __init__(self): self.classes = None self.means = None self.stds = None def fit(self, X, y): self.classes = np.unique(y) self.means = np.zeros((len(self.classes), X.shape[1])) self.stds = np.zeros((len(self.classes), X.shape[1])) for i, c in enumerate(self.classes): X_c = X[y == c] self.means[i, :] = X_c.mean(axis=0) self.stds[i, :] = X_c.std(axis=0) def predict(self, X): posteriors = np.zeros((X.shape[0], len(self.classes))) for i, c in enumerate(self.classes): prior = np.log(np.sum(y_train == c) / X.shape[0]) likelihood = np.sum(-0.5 * np.log(2 * np.pi * self.stds[i, :]**2) - 0.5 * ((X - self.means[i, :])**2 / (self.stds[i, :]**2)), axis=1) posterior = prior + likelihood posteriors[:, i] = posterior return self.classes[np.argmax(posteriors, axis=1)] ``` 其中,`fit()`方法用于训练模型,`predict()`方法用于对新的样本进行预测。 在训练过程中,我们需要计算每个类别的均值和标准差。然后,对于一个新的样本,我们可以计算它属于每个类别的概率,选择概率最大的类别作为预测结果。 最后,我们可以使用训练集来训练模型并进行预测: ```python # 初始化模型 nb = NaiveBayesClassifier() # 训练模型 nb.fit(X_train, y_train) # 预测测试集 y_pred = nb.predict(X_test) # 计算准确率 accuracy = np.mean(y_pred == y_test) print('Accuracy:', accuracy) ``` 输出结果如下: ``` Accuracy: 0.9777777777777777 ``` 可以看到,我们的朴素贝叶斯分类器在测试集上的准确率达到了97.8%。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值