第五课贝叶斯垃圾邮件分类代码部门有处逻辑没看懂,请解答

文件spamEmail.py里有这么一部分  
  #计算贝叶斯概率
    def calBayes(self,wordList,spamdict,normdict):
        ps_w=1
        ps_n=1
         
        for word,prob in wordList.items() :
            print(word+"/"+str(prob))
            ps_w*=(prob)
            ps_n*=(1-prob)
        p=ps_w/(ps_w+ps_n)
#         print(str(ps_w)+"////"+str(ps_n))
        return p   
 
我的问题点有三个:
1.其中ps_w相当于P(s|w)对吧?意思是出现该词的前提下邮件为垃圾邮件的概率
2.倒数第四行的ps_n,就不太理解了,是不是应该写为pn_w?出现该词的前提下为正常邮件的概率?
3.倒数第三行p=ps_w/(ps_w+ps_n) ,如果第2点我的推断成立的话,式子变为:
p=ps_w/(ps_w+pn_w)
不太理解p在这到底什么含义了
因为后面定义如果p>0.9就归为垃圾邮件所以,p应该是p(s|w),那这样的话公式为什么是这样的呢?
请老师或其他同学解答,谢谢。

泽南Alpha

赞同来自: 秦曾昌 Annie智敏

这段代码是用来计算联合概率的,这个你应该知道的吧。 其实ps_n是为了写代码的一个临时变量,不用关注... ps_w确实就是p(s|w)   其实这里取的就是p(s|w)最大的一些词,求一个联合概率: p=p(s|w1)*p(s|w2)*p(s|w3)*..   /   p(s|w1)*p(s|w2)*p(s|w3)*...+(1-p(s|w1))*(1-p(s|w2))*(1-p(s|w3)*...) 简单点说就是p1,p2,p3...是已知的,是单个单词的后验概率,但一个邮件无法用单个单词判断是否是垃圾邮件,所以要用一批单词求一个联合概率,公式就是p=p1p2p3.../[p1p2p3... + (1-p1)(1-p2)(1-p3)..]

泽南Alpha

赞同来自: 秦曾昌 Annie智敏

1.其中ps_w相当于P(s|w)对吧?意思是出现该词的前提下邮件为垃圾邮件的概率 答:对 2.倒数第四行的ps_n,就不太理解了,是不是应该写为pn_w?出现该词的前提下为正常邮件的概率? 答:这个是随便命名的,没有含义,只是为1-prob做一个累乘器用 3.倒数第三行p=ps_w/(ps_w+ps_n) ,如果第2点我的推断成立的话,式子变为:p=ps_w/(ps_w+pn_w)。不太理解p在这到底什么含义了 答:p就是联合概率

Annie智敏

赞同来自:

谢谢 泽南Alpha 的解答,理解了,开始把联合概率的公式没有搞明白。

要回复问题请先登录注册