理解贝叶斯定理

Posted

技术标签:

【中文标题】理解贝叶斯定理【英文标题】:Understanding Bayes' Theorem 【发布时间】:2010-12-30 18:21:17 【问题描述】:

我正在实现朴素贝叶斯分类器。 Programming Collective Intelligence 通过描述贝叶斯定理来介绍这个主题:

Pr(A | B) = Pr(B | A) x Pr(A)/Pr(B)

以及与文档分类相关的具体示例:

Pr(Category | Document) = Pr(Document | Category) x Pr(Category) / Pr(Document)

我希望有人可以向我解释这里使用的符号,Pr(A | B)Pr(A) 是什么意思?它看起来像是某种功能,但管道 ("|") 是什么意思,等等?

【问题讨论】:

绝对是mathoverflow.net 问题。 @Ofri Raviv:我对此表示怀疑。 MathOverflow 是针对专业数学家的,这个问题会立即关闭。 请使用 mathoverflow.net。我唯一担心这个问题太简单了。 @Jörg W Mittag:你可能是对的。这更像是一个 RTFM 有点问题...... 这个问题对于 mathoverflow.net 来说是完全不合适的在您至少查看该网站并了解他们在那里回答什么样的问题之前,不要再将人们引导到那里。 【参考方案1】: Pr(A | B) = 鉴于 B 已经发生,A 发生的概率 Pr(A) = A 发生的概率

但以上是关于条件概率的计算。你想要的是一个分类器,它利用这个原理根据之前的概率来决定某物是否属于某个类别。

完整示例请参见http://en.wikipedia.org/wiki/Naive_Bayes_classifier

【讨论】:

谢谢,有道理。到处都是这样描述的,假设了某种数学知识,我没有某种知识:-)。【参考方案2】:

Pr是概率,Pr(A|B)是条件概率。

Check wikipedia for details.

【讨论】:

【参考方案3】:

Pr(A | B):A的条件概率:即A的概率,假设我们只知道B

Pr(A) : A 的先验概率

【讨论】:

【参考方案4】:

竖线(|)的意思是“给定的”。 A给定B的概率等于B给定A的概率x Pr(A)/Pr(B)

【讨论】:

【参考方案5】:

根据您的问题,我强烈建议您首先阅读一些有关概率论的本科书籍。没有这个,你将无法在朴素贝叶斯分类器上正确推进你的任务。

我会向您推荐这本书http://www.athenasc.com/probbook.html 或查看MIT OpenCourseWare。

【讨论】:

【参考方案6】:

我认为他们已经为您提供了基础知识。

Pr(A | B) = Pr(B | A) x Pr(A)/Pr(B)

阅读:A给定B的概率等于B给定A的概率乘以A的概率除以B的概率。通常在您可以测量B的概率并试图计算时使用如果 B 导致我们相信 A。或者,换句话说,我们真的关心 A,但我们可以更直接地衡量 B,所以让我们从我们可以衡量的开始。

让我给你一个推导,使编写代码更容易。它来自Judea Pearl。我对此有点挣扎,但在我意识到 Pearl 如何帮助我们将理论转化为代码之后,我的灯亮了。

之前的赔率:

O(H) = P(H) / 1 - P(H)

似然比:

L(e|H) = P(e|H) / P(e|¬H)

倒数赔率:

O(H|e) = L(e|H)O(H)

在英语中,我们说您对某事感兴趣的几率(H 代表假设)只是您发现某事为真的次数除以您发现某事不属实的次数。所以,假设每天有一万间房子被抢劫。这意味着您有 1/10,000 的机会被抢劫,而无需考虑任何其他证据。

下一个是衡量您正在查看的证据。当你的问题是真的时看到你看到的证据的概率除以当你的问题不是真的时看到你看到的证据的概率是多少。假设您听到防盗警报响起。当它应该响起时(有人在闹钟响起时打开窗户)与不应该响起的时候(风把闹钟关掉),你多久收到一次闹钟。如果你有 95% 的机会让窃贼触发警报,而有 1% 的机会让其他东西触发警报,那么你的可能性为 95.0。

您的总体信念只是可能性 * 先验几率。在这种情况下是:

((0.95/0.01) * ((10**-4)/(1 - (10**-4))))
# => 0.0095009500950095

我不知道这是否使它更清楚,但是拥有一些跟踪先前赔率的代码、查看可能性的其他代码以及组合这些信息的更多代码往往更容易.

【讨论】:

【参考方案7】:

我已经用 Python 实现了它。这很容易理解,因为贝叶斯定理的所有公式都在不同的函数中:

#Bayes Theorem

def get_outcomes(sample_space, f_name='', e_name=''):
    outcomes = 0
    for e_k, e_v in sample_space.items():
        if f_name=='' or f_name==e_k:
            for se_k, se_v in e_v.items():
                if e_name!='' and se_k == e_name:
                    outcomes+=se_v
                elif e_name=='':
                    outcomes+=se_v
    return outcomes

def p(sample_space, f_name):
    return get_outcomes(sample_space, f_name) / get_outcomes(sample_space, '', '')

def p_inters(sample_space, f_name, e_name):
    return get_outcomes(sample_space, f_name, e_name) / get_outcomes(sample_space, '', '')

def p_conditional(sample_space, f_name, e_name):
    return p_inters(sample_space, f_name, e_name) / p(sample_space, f_name)

def bayes(sample_space, f, given_e):
    sum = 0;
    for e_k, e_v in sample_space.items():
        sum+=p(sample_space, e_k) * p_conditional(sample_space, e_k, given_e)
    return p(sample_space, f) * p_conditional(sample_space, f, given_e) / sum

sample_space = 'UK':'Boy':10, 'Girl':20,
                'FR':'Boy':10, 'Girl':10,
                'CA':'Boy':10, 'Girl':30

print('Probability of being from FR:', p(sample_space, 'FR'))
print('Probability to be French Boy:', p_inters(sample_space, 'FR', 'Boy'))
print('Probability of being a Boy given a person is from FR:', p_conditional(sample_space, 'FR', 'Boy'))
print('Probability to be from France given person is Boy:', bayes(sample_space, 'FR', 'Boy'))

sample_space = 'Grow' :'Up':160, 'Down':40,
                'Slows':'Up':30, 'Down':70

print('Probability economy is growing when stock is Up:', bayes(sample_space, 'Grow', 'Up'))

【讨论】:

【参考方案8】:

管道用于表示条件概率。 Pr(A | B) = A给定B的概率

示例: 假设您感觉不舒服,并且您在网上浏览症状。互联网告诉你,如果你有这些症状,那么你就有了 XYZ 病。

在这种情况下: Pr(A | B) 是您要找出的内容,即: 鉴于您有某些症状,您出现 XYZ 的概率。

Pr(A) 是患 XYZ 疾病的概率

Pr(B) 是出现这些症状的概率

Pr(B | A) 是你从网上查到的,即: 鉴于您患有这种疾病,出现症状的可能性。

【讨论】:

以上是关于理解贝叶斯定理的主要内容,如果未能解决你的问题,请参考以下文章

朴素贝叶斯的理解

贝叶斯定理简单理解

贝叶斯定理简单理解

朴素贝叶斯分类算法:对贝叶斯公式的理解

了解一下丨朴素贝叶斯算法

朴素贝叶斯算法原理