最近想想貌似很多坑没填的样子,赶紧出来填个坑......

现在我们需要加入一些有用的东西,以前说的贝叶斯公式看着很强大,但是好像用处不是很大的样子,哪有什么事情是因为一个因素导致的,顶多给小学生做做题。

如果我们想要计算多个因素导致结果发生的概率该怎么办?假设我们是360的,想要为用户的手机加上过滤垃圾短信的功能,我们总不可能用 P(垃圾短信| “您的儿子被警察抓了”) 这样的句子去匹配。

我们把上面的句子带入贝叶斯的条件,好像不对,就是说我们要匹配

P(”您的儿子被警察抓了,请汇款到xxxxx“|垃圾短信)

你在逗我,世界有几个垃圾短信是一模一样的。

我们得换种方法,假设垃圾短信都会使用到固定的词汇 “警察”“赌博”“汇款”。我们假设这几个词之间不存在任何联系,是互相独立的。

就是说 P(警察|赌博)=P(警察) 以赌博这个词作为条件去推警察这个词出现的概率我们得到的还是警察这个词本身出现的概率,这就是各种因素的独立性,也代表你去推你今天心情不好导致学校或者公司爆炸是不会有好结果的。

现在我们知道了独立性的含义那么我们就可以去求当条件互相独立时短信为垃圾短信的概率。

我们分别计算每个词在垃圾短信中出现的概率。

就是说 P(“您的儿子被警察抓了,请汇款到xxxxx”| 垃圾短信) = P(“警察”|垃圾短信)*P(“汇款”|垃圾短信) 。。。。。。。等等。

最后我们将其带入公式,对比正常短信和垃圾短信,就可以得出一个结果,等等,好像有些不对,假设有一个词从没在垃圾短信的训练数据中出现过,但是在正常短信中出现过,那么在计算P(词|垃圾短信)的时候概率不就变成 0 吗,感觉影响心情又影响概率,这样不行,得想个办法。

要不,我们加个1 吧…………

为了让它不为0,我们决定添加一个 数K >0,并且也得给分母加上一个 K*垃圾短信中出现过的词的个数,并且带入计算中。

P(词|垃圾短信) = 词 +1 / 训练数据 + 1* 维度

P(垃圾短信出现的概率) = 垃圾短信的个数+1 / 总短信个数 +2 (我们就两个类别 垃圾 和不是垃圾…………)

这种通过一个大于1的值来修正结果的方式 被称为Laplace平滑,现在我们的公式终于能用了。

现在我写个程序跑跑看看。

def simpleBayes(wordList,dataset,type): 
    bayesResult = 1 
    for i in wordList: 
        if len(i)>0: 
            main =  float(dataset(i)+1)/float(100) 
            bayesResult *= main 
    return bayesResult*0.5

对 垃圾和正常邮件各取100个训练样本。

100个训练样本

啥,参数好像不太对?赶时间嘛。

tips:如果能活着写出下一篇的话就写贝叶斯网络吧。。。。。

[原文地址]

相关内容:

贝叶斯安全应用 (3) 过滤垃圾邮件

贝叶斯安全应用 (2) 信息提取

贝叶斯安全应用 (1)