2009-12-29 115 views
9

我正在研究一个朴素贝叶斯分类器的实现。理解贝叶斯定理

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

除了相关文件分类的具体例子:Programming Collective Intelligence通过描述贝叶斯定理为介绍这一主题

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

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

在此先感谢。

+1

绝对是一个http://mathoverflow.net/问题。 – 2009-12-29 12:02:07

+10

@Ofri Raviv:我怀疑这一点。 MathOverflow适用于专业数学家,这个问题将立即关闭。 – 2009-12-29 12:06:57

+1

请使用mathoverflow.net。我唯一担心的是,这个问题在那里会过于简单。 – 2009-12-29 12:07:25

回答

11
  • PR(A | B)=给定甲发生的是乙已经发生
  • PR(A)=的情况发生

概率但上面的概率是相对于所述计算的条件概率。你想要的是一个分类器,它使用这个原则来决定某件事物是否属于基于先前概率的类别。

为一个完整的例子

+0

谢谢你,有道理。这里描述的每个地方都有一定的数学知识,我不具备某些知识:-)。 – benofsky 2009-12-29 12:16:57

1

PR(A | B):A的条件概率:即A的概率,因为我们都知道为B

PR(A):的

1

先验概率管道(|)的意思是“给定”。 (A)/ Pr(B)

1

根据你的问题,我可以强烈建议你先阅读一些本科的关于概率论的书。如果没有这个,你将无法在Naive Bayes分类器上正确处理你的任务。

我建议你这本书http://www.athenasc.com/probbook.html或看MIT OpenCourseWare

+0

谢谢,我一定会看看那个。 – benofsky 2009-12-29 12:28:01

0

貌似我写完全按照你做:)

我试图找到一个库(红宝石)使用朴素贝叶斯文档分类同样的事情。 发现了许多图书馆,但每个图书馆都有自己的一套问题。 所以我写了我自己的实现。 维基百科的文章非常混乱,特别是如果你对这类事情不熟悉的话。 对我而言,Paul Graham关于实施垃圾邮件过滤器的文章要好得多。

我已经在这里记录了详细信息:http://arubyguy.com/2011/03/03/bayes-classification-update/ 当我这样做的时候,我也会发布我的实现的完成版本,如果你对Ruby解决方案感兴趣,你可能想看看。

4

我认为他们已经涵盖了基础知识。

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

写着:给定B的概率是一样的给的时间A除以它通常使用时可以测量B的概率和你B的概率划分的概率B的概率正在试图弄清楚B是否让我们相信A。换句话说,我们真的关心A,但是我们可以更直接地衡量B,所以让我们从我们可以测量的东西开始。

让我给你一个派生,这使得编写代码更容易。它来自Judea 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被抢劫的机会,而没有考虑任何其他证据。

下一个是测量你正在查看的证据。当你的问题是真实的时候看到你所看到的证据的概率除以看到你的问题不真实时你看到的证据的概率。假设你听到你的防盗报警器响起。当它应该熄灭时(有人在闹钟开启时打开一个窗口)与不应该关闭的时间(风将闹钟设置为关闭)相比,您多久会发出一次闹钟。如果你有95%的可能性发生了防盗,并有1%的机会发出警报,那么你有95.0的可能性。

您的整体信念只是可能性*先验赔率。在这种情况下,它是:

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

我不知道这使得任何更加清晰,但它往往更容易有一些代码,保持前期差别的轨道,其他代码来看看可能性,还有另外一段代码来结合这些信息。

4

我已经在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')) 
3

我个人觉得这个解释best

0

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

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

在这种情况下: Pr(A | B)是你试图找出,即: 你有XYZ的概率,你有一定的症状。

PR(A)是具有疾病XYZ

PR(B)的概率是有那些症状

的概率

PR(B | A)是您从互联网上发现什么,这是: 出现症状的可能性给你带来疾病。