65.9K
CodeProject 正在变化。 阅读更多。
Home

通过在 C# 中的实现真正理解朴素贝叶斯算法

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.88/5 (5投票s)

2023年12月11日

CPOL

8分钟阅读

viewsIcon

17388

downloadIcon

127

什么是朴素贝叶斯以及如何实现它?

引言

语言检测是指自动识别和确定给定文本或文档所用语言的过程。这项任务在各种应用中都至关重要,例如自然语言处理、机器翻译和内容过滤。语言检测的目标是分析一段文本,准确确定其所用语言,即使在处理多语言或多样化内容时也是如此。它涉及利用计算技术和算法来识别与不同语言相关的独特模式、语言特征和统计属性。

语言检测的常用方法包括统计方法、机器学习算法和基于规则的系统。统计方法通常涉及分析字符或单词的频率,而机器学习方法则从标记的训练数据中学习,以对给定文本的语言做出预测。

在本文中,我们将利用朴素贝叶斯算法来执行此任务。实际上,主要目标不仅仅是创建一个语言分类器,更重要的是揭示贝叶斯算法的奥秘。我们将发现,尽管它表面上被简单地命名为“朴素”,但它却是一种功能极其强大的算法。

为了阐明某些概念,我们参考了以下书籍。

什么是概率论?

概率论是数学的一个分支,它为建模和量化不确定性或随机性提供了一个框架。它处理随机现象的分析以及在给定事件或实验中发生不同结果的可能性。概率论的主要目标是形式化和数学化地描述控制随机性和不确定性的原理。

在本文中,我们将假定读者已经熟悉概率的概念。虽然我们的文章通常采用整体方法,提供全面的细节,但概率领域的复杂性使得在这种情况下彻底探讨基础理论变得困难。我们鼓励读者参考此 资源 进行快速回顾。

如何利用朴素贝叶斯进行语言检测?

如前所述,语言检测是指自动识别和确定给定文本或文档所用语言的过程。

我们的目标是使用精确的算法实现语言检测器。具体来说,当给定一个特定的文档d时,我们的目标是确定该文档的语言l。更准确地说,我们的目标是获得给定特定文档的每种语言的概率:数学上,我们想要 P(l∣d)。

信息

这个问题是典型的机器学习过程。虽然有常识的人可以迅速识别文档的语言,但计算机(机器)在未经大量训练的情况下无法执行这项看似简单的任务。

什么是朴素贝叶斯算法?

朴素贝叶斯算法是一种基于贝叶斯定理(参见我们的回顾)的概率分类算法。之所以称其为“朴素”,是因为它假设特征之间是独立的(我们稍后会看到)。

使用前面采用的符号,P(l∣d)=P(d∣l)P(l)/P(d)​(贝叶斯定理)。

  • P(d∣l)是给定语言l时文档d的概率。
  • P(l)是语言l的概率。
  • P(d)是文档d的概率。

这有点胡言乱语。这些术语都是什么意思?

如引言所述,计算机需要例子来学习。朴素贝叶斯也不例外,我们必须提供训练集才能使其做出准确的预测。在这种情况下,朴素贝叶斯是监督算法的一个例子,这意味着我们需要提供标记数据。更具体地说,这意味着我们拥有一个文档语料库,我们已经知道其语言,我们将这些提供给语言检测器进行训练——类似于足球运动员在比赛前训练。

在这种情况下,语言概率 P(l) 可以更好地理解为特定语言的文档数量占总文档数量的比例。例如,如果我们的语料库包含 90 篇英语文档和 10 篇法语文档,我们认为下一篇文档是英语的几率为 90%。这种信念通过先验概率形式化。

信息

在实践中,建议每种语言的文档数量大致相等,或者比例不过于悬殊。

那么 P(d|l) 是什么意思?

这样表达,这个概念确实可能看起来很抽象,难以想象。然而,在我们的场景中,文档在计算机眼中本质上是一系列字符,仅此而已。我们有责任从这些字符中提取有意义的见解和有用的属性。例如,我们可以观察文档中每个单词的长度,并创建一个名为“5 字母单词的数量”的属性。同样,我们可以跟踪字母“z”的出现次数,并创建一个名为“文档中‘z’的数量”的属性。我们收集的这些属性被称为特征

因此,我们可以将一个概念性的文档对象转化为一个具有量化特征的数学对象。

d(170)​=(numberof5letterwords=2,numberof′z′=0,...)

信息

特征的选择完全是主观的。虽然选择传统特征是明智的,但添加特定的自定义属性是每个人独特之处。

有了这些符号,我们就有了 P(d|l)=P(5字母单词的数量,‘z’的数量,...|l)

在这个阶段,朴素贝叶斯的假设就起作用了。我们假设在给定语言内特征之间是独立的,这意味着一个特征的存在与否不影响另一个特征的存在与否。这是一个基于语言的条件属性。

P(numberof5letterwords,numberof′z′,...|l)=P(numberof5letterwords|l)P(numberof′z′|l)...P(...|l)

我们最终得到的是单个特征的概率,而不是联合分布。

如何计算这些单个特征的概率?

例如,考虑计算每种语言中 5 字母单词出现概率。在这种情况下,我们需要收集指定语言(例如,英语语料库)的所有文档,确定 5 字母单词的数量,然后将其除以英语语料库中的总单词数进行归一化。然后,这个过程将为其他特征(例如,“z”的数量等)复制。

因此,我们继续计算每个单独特征的概率,使我们能够在贝叶斯公式中计算联合概率。值得注意的是,这些概率是从观察到的数据中得出的,在文献中,这种概率有时被称为证据。

信息

在这个术语中,期望的概率 P(l|d) 被称为后验概率,并且必须记住以下公式:后验 = 先验 x 证据。从哲学上讲,我们的后验信念会根据观察到的数据(证据)和我们的先验信念进行调整。

如何为新文档选择正确的类别?

现在,考虑一个新文档到达,我们需要预测其语言。该过程涉及检查用于训练算法的每个特征,并记录其在每个类别下的概率。

朴素贝叶斯算法计算给定输入特征的每种语言的后验概率。然后,它将概率最高的语言作为预测类别分配。

尽管简单,朴素贝叶斯可以出奇地有效。

Minute,以及 P(d)?

定义文档的概率 P(d) 是一个具有挑战性的任务,但无论如何,它对于所有类别都保持不变(因为它不依赖于特定类别)。在这种情况下,它不影响后验概率,通常被忽略。

仍然有一些细微之处

理论通常很简单,但细节决定成败。在实现算法时,有一些细微之处需要我们考虑。

计算对数概率

概率始终小于 1。当处理许多特征时,计算所有独立概率的乘积可能会导致浮点算术中的下溢。这就是为什么在实践中,会计算对数概率来避免这种复杂性。

贝叶斯公式可以重写(如前所述,P(d) 被忽略)。

logP(l∣d)=logP(d∣l)+logP(l)

由于对数是单调递增函数,因此它不会影响高概率代表最可能选择的事实。然而,它提供了将乘积转换为求和的优点,从而减轻了与下溢相关的问题。

如果一种语言包含未知特征会怎样?

一种语言可能不包含某个特征的出现。在这种情况下,该特征的概率变为 0,取对数可能会导致错误。

为了规避此类问题,建议在训练阶段将每个出现次数加 1。

信息

这项技术在文献中通常被称为拉普拉斯平滑。虽然我们不会深入探讨拉普拉斯平滑的细节,但重要的是确保我们继续计算概率。因此,我们需要将总的可能特征数加到分母上进行校正。

在介绍了朴素贝叶斯算法之后,是时候将其付诸实践了。我们将应用我们刚才描述的理论概念来阐述我们的语言检测器示例。访问以下链接了解详情。

历史

  • 2023 年 12 月 12 日:初始版本
© . All rights reserved.