手推——朴素贝叶斯

如果你对理论推导过程不感兴趣,可以直接逃到三种常用模型及编码实现部分,但我建议你还是看看理论基础部分。

另外,本文的所有代码都可以github获取


1. 朴素贝叶斯的理论基础

朴素贝叶斯算法是基于贝叶斯定理与特征条件独立假设的分类方法。

这里提到的贝叶斯定理特征条件独立假设就是朴素贝叶斯的两个重要的理论基础。

1.1 贝叶斯定理

先看什么是条件概率

P(A|B)表示事件B已经发生的前提下,事件A发生的概率,叫做事件B发生下事件A的条件概率。其基本求解公式为:P(A|B)=P(AB)P(B)P(A|B)=P(AB)P(B)

贝叶斯定理便是基于条件概率,通过P(A|B)来求P(B|A):

P(B|A)=P(A|B)P(B)P(A)P(B|A)=P(A|B)P(B)P(A)

顺便提一下,上式中的分母P(A),可以根据全概率公式分解为:

P(A)=ni=1P(Bi)P(A|Bi)P(A)=∑i=1nP(Bi)P(A|Bi)


1.2 特征条件独立假设

这一部分开始朴素贝叶斯的理论推导,从中你会深刻地理解什么是特征条件独立假设。

给定训练数据集(X,Y),其中每个样本x都包括n维特征,即x=(x1,x2,x3,...,xn)x=(x1,x2,x3,...,xn)

如果现在来了一个新样本x,我们要怎么判断它的类别?从概率的角度来看,这个问题就是给定x,它属于哪个类别的概率最大。那么问题就转化为求解P(y1|x),P(y2|x),...,P(yk|x)P(y1|x),P(y2|x),...,P(yk|x)

P(yk|x)P(yk|x)怎么求解?答案就是贝叶斯定理:

P(yk|x)=P(x|yk)P(yk)P(x)P(yk|x)=P(x|yk)P(yk)P(x)

根据全概率公式,可以进一步地分解上式中的分母:

P(yk|x)=P(x|yk)P(yk)kP(x|yk)P(yk)P(yk|x)=P(x|yk)P(yk)∑kP(x|yk)P(yk) 【公式1】

这里休息两分钟

先不管分母,分子中的P(yk)P(yk)是先验概率,根据训练集就可以简单地计算出来。

而条件概率P(x|yk)=P(x1,x2,...,xn|yk)P(x|yk)=P(x1,x2,...,xn|yk)

这显然不可行。针对这个问题,朴素贝叶斯算法对条件概率分布作出了独立性的假设,通俗地讲就是说假设各个维度的特征x1,x2,...,xnx1,x2,...,xn互相独立,在这个假设的前提上,条件概率可以转化为:

P(x|yk)=P(x1,x2,...,xn|yk)=ni=1P(xi|yk)P(x|yk)=P(x1,x2,...,xn|yk)=∏i=1nP(xi|yk) 【公式2】

这样,参数规模就降到ni=1Sik∑i=1nSik

以上就是针对条件概率所作出的特征条件独立性假设,至此,先验概率P(yk)P(yk)了?

这里思考两分钟

答案是肯定的。我们继续上面关于P(yk|x)P(yk|x)的推导,将【公式2】代入【公式1】得到:

P(yk|x)=P(yk)ni=1P(xi|yk)kP(yk)ni=1P(xi|yk)P(yk|x)=P(yk)∏i=1nP(xi|yk)∑kP(yk)∏i=1nP(xi|yk)

于是朴素贝叶斯分类器可表示为:

f(x)=argmaxykP(yk|x)=argmaxykP(yk)ni=1P(xi|yk)kP(yk)ni=1P(xi|yk)f(x)=argmaxykP(yk|x)=argmaxykP(yk)∏i=1nP(xi|yk)∑kP(yk)∏i=1nP(xi|yk)

因为对所有的ykyk,上式中的分母的值都是一样的(为什么?注意到全加符号就容易理解了),所以可以忽略分母部分,朴素贝叶斯分类器最终表示为:

f(x)=argmaxP(yk)ni=1P(xi|yk)f(x)=argmaxP(yk)∏i=1nP(xi|yk)

关于P(yk)P(yk)的求解,有以下三种常见的模型.


2. 三种常见的模型及编程实现

2.1 多项式模型

当特征是离散的时候,使用多项式模型。多项式模型在计算先验概率P(yk)P(yk)时,会做一些平滑处理,具体公式为:

P(yk)=Nyk+αN+kαP(yk)=Nyk+αN+kα

N是总的样本个数,k是总的类别个数,NykNyk是平滑值。

P(xi|yk)=Nyk,xi+αNyk+nαP(xi|yk)=Nyk,xi+αNyk+nα

NykNyk是平滑值。

α=1α=1时不做平滑。

如果不做平滑,当某一维特征的值xixi,从而导致后验概率为0。加上平滑就可以克服这个问题。


2.1.1 举例

有如下训练数据,15个样本,2维特征X1,X2X1,X2,判断其类别。

这里写图片描述

解答如下:

运用多项式模型,令α=1α=1

  • 计算先验概率

这里写图片描述

  • 计算各种条件概率

这里写图片描述

  • 对于给定的x=(2,S)T
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
朴素贝叶斯算法是一种基于概率统计的分类算法,它的核心思想是利用贝叶斯定理计算出每个类别的后验概率,然后选择具有最大后验概率的类别作为分类结果。在这个过程中,朴素贝叶斯假设每个特征之间相互独立,也就是说,每个特征对于分类的贡献是独立的。 在Python中,我们可以使用scikit-learn库来实现朴素贝叶斯算法。具体步骤如下: 1.准备数据:将数据集划分为训练集和测试集。 2.训练模型:使用训练集来训练朴素贝叶斯模型。 3.测试模型:使用测试集来测试模型的准确率。 下面是一个简单的朴素贝叶斯分类器的实现示例: ``` from sklearn.naive_bayes import GaussianNB from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split # 加载数据集 iris = load_iris() # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=0) # 创建朴素贝叶斯分类器对象 gnb = GaussianNB() # 训练模型 gnb.fit(X_train, y_train) # 预测测试集的结果 y_pred = gnb.predict(X_test) # 计算准确率 accuracy = sum(y_pred == y_test) / len(y_test) print("准确率:", accuracy) ``` 这里使用了iris数据集作为示例数据集进行分类。首先,我们使用`train_test_split`函数将数据集划分为训练集和测试集,然后创建一个`GaussianNB`对象,训练模型并使用测试集来测试模型的准确率。最后,我们计算出准确率并将其打印出来。 完整的代码可以在以下链接中找到: https://github.com/Light-City/NaiveBayesClassifier-Python/blob/master/NaiveBayesClassifier.py

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值