理解贝叶斯定理

11

我正在实现一个朴素贝叶斯分类器。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)代表什么?它看起来像某种函数,但是管道符号 ("|") 代表什么等等?

1
绝对是一个 http://mathoverflow.net/ 的问题。 - Ofri Raviv
11
我怀疑那个。MathOverflow是给专业数学家用的,这个问题会立即被关闭。 - Jörg W Mittag
1
请使用mathoverflow.net。我唯一的担忧是这个问题会因为太简单而被关闭。 - Alexey Kalmykov
1
@Jörg W Mittag:你可能是对的。这更像是一个RTFM类型的问题... - Ofri Raviv
10
这个问题在mathoverflow.net上是完全不合适的。 在你至少查看了该网站并了解他们回答哪些问题之前,请停止引导人们到那里去提问。 - Jason Orendorff
8个回答

13
  • Pr(A | B) = 在B已经发生的情况下,A发生的概率
  • Pr(A) = A发生的概率

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

请参见http://en.wikipedia.org/wiki/Naive_Bayes_classifier 以获得完整的示例。


谢谢,我明白了。在任何地方描述这个问题时都假定了一定的数学知识,而这是我所不具备的知识 :-). - benmcredmond

4
我认为他们已经涵盖了基础知识。
Pr(A | B) = Pr(B | A) x Pr(A)/Pr(B)

读作:给定B的情况下A发生的概率等于给定A的情况下B发生的概率乘以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所房屋被抢劫,而有10000所房屋,那么在没有考虑其他证据的情况下,你被抢劫的概率是1/10000。
接下来需要衡量你所看到的证据。当你的问题成立时,你看到该证据的概率与当你的问题不成立时你看到该证据的概率之比即为你看到该证据的概率。例如,当你听到了警报声,你听到该警报响起时表示真实情况的概率除以你听到该警报响起时表示不真实情况的概率。如果你有95%的概率是因为小偷触发了警报,只有1%的概率是因为风吹响了警报,则你的可能性为95.0。
你的总体信念等于可能性*先前的概率。在这种情况下,它是:
((0.95/0.01) * ((10**-4)/(1 - (10**-4))))
# => 0.0095009500950095

我不知道这是否能让事情更加清晰,但通常有一些代码可以跟踪之前的几率,另一些代码可以查看可能性,并且还有一个代码块可以将这些信息组合起来。


4

我已经在Python中实现了它。这很容易理解,因为Bayes定理的所有公式都在单独的函数中:

#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'))

2

Pr(A | B):A的条件概率,即已知B时A发生的概率。

Pr(A):A的先验概率。


1

1

符号“|”表示“给定”。

在给定B的条件下A发生的概率等于在给定A的条件下B发生的概率乘以Pr(A)/Pr(B)。


1

0

管道符号用于表示条件概率。

Pr(A | B) = 在B的条件下A发生的概率

例如: 假设你感觉不舒服,上网搜索症状。互联网告诉你,如果你有这些症状,那么你就得了XYZ病。

在这种情况下: Pr(A | B) 是你想要找出的,即: 在你有某些症状的情况下,你患有XYZ病的概率。

Pr(A) 是患有XYZ病的概率。

Pr(B) 是拥有这些症状的概率。

Pr(B | A) 是你从互联网上找到的,即: 在你患有该疾病的情况下,你出现这些症状的概率。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接