引言
先前曾经看了一篇文章,一个老外程序员写了一些很牛的Shell脚本,包括晚下班自动给老婆发短信啊,自动冲Coffee啊,自动扫描一个DBA发来的邮件啊, 等等。于是我也想用自己所学来做一点有趣的事情。我的想法如下:
- 首先我写个scrapy脚本来抓取某个网站上的笑话
- 之后写个Shell脚本每天早上6点自动抓取最新的笑话
- 然后用朴素贝叶斯模型来判断当前的笑话是否属于成人笑话
- 如果是成人笑话,用脚本把它自动发给好兄弟的邮箱
- 如果不是成人笑话,用脚本把它自动发给女朋友的邮箱
在这个系列的文章中,你会学到:
- 朴素贝叶斯背后的数学原理
- 算法具体的工作过程(结合实例)
- scikit-learn快速实现算法
这个系列的文章还会涉及到scrapy,pandas,numpy的一些知识,遇到这些知识的时候我会具体解释的。这个系列的文章我会主要详细的介绍上面的第3步实现过程,其余的我会将源码放在github上供大家参考。下面,就让我们享受这个奇妙之旅吧。
朴素贝叶斯概述
众所周知,朴素贝叶斯是一种简单但是非常强大的线性分类器。它在垃圾邮件分类,疾病诊断中都取得了很大的成功。它只所以称为朴素,是因为它假设特征之间是相互独立的,但是在现实生活中,这种假设基本上是不成立的。那么即使是在假设不成立的条件下,它依然表现的很好,尤其是在小规模样本的情况下。但是,如果每个特征之间有很强的关联性和非线性的分类问题会导致朴素贝叶斯模型有很差的分类效果。
朴素贝叶斯背后的数学原理
后验概率(Posterior Probabilities)
为了更好地了解朴素贝叶斯分类器是怎么工作的,了解贝叶斯法则是很必要的。它可以被简单地描述成下面的公式:
我们可以用一个关于老天是否下雨的例子来解释上面的公式。
我们可以看到,如果我们想要在给定现象下,预测某种结果的概率,我们必须知道:1、在给定这种结果下,出现这种现象的概率。2、出现这种结果的概率。3、出现这种现象的概率。
在实际应用中,我们的现象不可能只有一个,比如,在垃圾邮件分类中,甚至可能有几千个词的特征向量。下面,我将引入一些数学上的记号来统一后面的表达:
- ωj表示属于哪个类别,j∈{ 1,2,3,…,m}
- xi表示特征向量中的第i个特征