[machine learning] 基于概率论的朴素贝叶斯算法
朴素贝叶斯是一种基于概率论的分类方法,基本原理是:用P1(x,y)表示点(x,y)属于类别1的概率,用P2(x,y)表示点(x,y)属于类别2的概率,如果P1>P2,则点(x,y)属于类别1,如果P1<P2,则点(x,y)属于类别2。
朴素贝叶斯的优点是在数据较少的情况下仍然有效,缺点是对数据的准备方式比较敏感,只适用于标称型数据。
“朴素”表示特征之间相互独立。
一。朴素贝叶斯的一般流程
收集数据(任何方法)——准备数据(标称型或布尔型数据)——分析数据——训练算法(计算不同特征的条件概率(注))——测试算法(计算错误率)——使用算法
注:
1. 条件概率公式:p(ci|w)=p(w|ci)*p(ci)/p(w)
其中 p(ci|w) : 已知是文档w,求文档w属于分类ci的概率
p(w|ci) : 已知在分类ci中,求是文档w的概率
p(ci) : 属于分类ci的文档数占总文档数的比例
p(w) : 所有文档中是文档w的概率
2. 在朴素贝叶斯中,因为文档w中的各个特征之间独立,所以p(w|ci)可以展开成p(w0|ci)*p(w1|ci)*.....*p(wn|ci)
二。数据准备:使用python进行文本分类
要使用数据进行贝叶斯分类,首先需要对数据进行处理,首先从原始训练数据中创建词表,python代码如下:
本段代码最后返回一个包含了原始训练数据集中所有单词的一个词表(列表),输入参数是原始训练数据集。
第二步是根据创建的词表,将输入的文档数据转换成包含0和1的向量形式,python代码如下:
本段代码的输入参数是第一步创建的词表和一个文档数据。返回的是一个由0和1组成的向量,长度与词表的长度相当
0表示在词表对应位置的单词在文档数据中没有出现,1表示在词表对应位置的单词在文档数据中出现了
注:上面的代码是词表模型,下面的代码是词袋模型,唯一的区别是词表模型只记录单词有没有出现,而词袋模型还记录单词出现的次数
三。朴素贝叶斯分类器训练函数(计算条件概率)
使用函数trainNB0()来计算P(wi|c0),p(wi|c1)和p(ci),python代码如下:
本段代码最后返回的是两个向量和一个概率:
向量p1Vect即p(wi|c1),其中的每一个元素表示每一个特征出现的概率,即[p(w0|c1),p(w1|c1),.....,p(wn|c1)].
向量p0Vect即p(wi|c0),其中的每一个元素表示每一个特征出现的概率,即[p(w0|c0),p(w1|c0),.....,p(wn|c0)].
四。朴素贝叶斯分类函数(对待分类的文档进行分类)
使用函数classifyNB()来对待分类的文档数据进行分类,python代码如下:
本段代码输入的参数有四个:1.待分类的文档(0和1组成的向量形式) 2.上一段代码计算出的两个向量和一个概率
其中vec2classify是由0和1组成的向量,与piVec相乘不改变每个单词出现的概率
本段代码最后返回的是对待分类文档数据的分类结果。
下面是一个封装了朴素贝叶斯所有操作的便利函数testingNB(),python代码如下:
五。实例:使用朴素贝叶斯过滤垃圾邮件(包括使用朴素贝叶斯进行交叉验证的测试算法(计算错误率))
这一段代码使用到正则表达式,还有需要学习的地方,python代码如下: