《机器学习实战》笔记——朴素贝叶斯

Posted DianeSoHungry

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《机器学习实战》笔记——朴素贝叶斯相关的知识,希望对你有一定的参考价值。

运用贝叶斯公式(朴素贝叶斯假设每个特征每个特征都是独立的)可以解决的问题有,已知某些特征,用来判断某情况发生的可能性大小,设置可能性最大的情况作为预测值。

是一种监督算法。

广泛应用于垃圾邮件检测等等。

 1 # _*_coding:utf-8_*_
 2 from numpy import *
 3 
 4 # 4-1 词表到向量的转换函数(实验样本)
 5 def loadDataSet():
 6     postingList = [[my, dog, has, flea, problems, help, please],
 7                    [maybe, not, take, him, to, dog, park, stupid],
 8                    [my, dalmation, is, so, cute, I, love, him],
 9                    [stop, posting, stupid, worthless, garbage],
10                    [mr, licks, ate, my, steak, how, to, stop, him],
11                    [quit, buying, worthless, dog, food, stupid]]
12     classVec = [0, 1, 0, 1, 0, 1]  # 1 is abusive, 0 not
13     return postingList, classVec
14 
15 # 返回一个dataSet中所有出现过的词条列表
16 def createVocabList(dataSet):
17     vocabSet = set([])
18     for document in dataSet:
19         vocabSet = vocabSet | set(document) #用于求两个集合的并集
20     return list(vocabSet)
21 
22 # 输入参数为词汇表(vocabSet)和某个文档(inputSet),返回的是元素和词汇表元素一一对应的向量returnVec
23 # vocabSet中的元素在inputSet中出现过则向量中元素为1,反之为0
24 def setOfWords2Vec(vocabList, inputSet):
25     returnVec = [0] * len(vocabList)    # [1,2,3]*3 结果等于[1,2,3,1,2,3,1,2,3]
26     for word in inputSet:
27         if word in vocabList:
28             returnVec[vocabList.index(word)] = 1
29         else:
30             print ("the word: %s is not in my Vocabulary!" % word)    # 为什么有这一步?
31     return returnVec
32 
33 # 4-2 朴素贝叶斯分类器训练函数
34 # 注意:
35 # trainMatrix不是最原始的文档,而是由原始文档列表得到的矩阵,
36 # 矩阵的列分别对应了所有出现过的词,行对应了各个不同的句子
37 # 上面函数的输出returnVec就是trainMatrix其中的一行
38 # trainCategory为该行是否为侮辱性言论。1为是
39 def trainNB0(trainMatrix, trainCategory):   #
40     numTrainDocs = len(trainMatrix) # 有几句话
41     numWords = len(trainMatrix[0])  # 每句话有几个词条
42     pAbusive = sum(trainCategory)/float(numTrainDocs)   # trainCategory中元素为1的表示是侮辱性语言
43     p0Num = zeros(numWords)+0.00000001 # 累计所有非侮辱性言论中,各个词条出现过的次数
44     p1Num = zeros(numWords)+0.00000001 # 累计所有侮辱性言论中,各个词条出现过的次数 加一个极小量是为了避免在侮辱性言论的条件下,某个词条
45                                        # 的概率为0的情况,此时,最终结果也会为0,显然不对。
46     # p0Denom = 0.0   # 书上代码是被我注释掉了,最终是要得到(非)侮辱性言论中所有出现过的词汇的总和(包括重复值),
47     # p1Demon = 0.0   # 不如在最后将(非)侮辱性言论中每个词汇出现过的次数相加。
48     for i in range(numTrainDocs):
49         if trainCategory[i] == 1:
50             p1Num += trainMatrix[i]
51             # p1Demon += sum(trainMatrix[i])
52         else:
53             p0Num += trainMatrix[i]
54             # p0Denom += sum(trainMatrix[i])
55     p1Demon=sum(p1Num)
56     p0Denom=sum(p0Num)
57     # p1Vect = p1Num/p1Demon
58     # p0Vect = p0Num/p0Denom
59     p1Vect = log(p1Num / p1Demon)   # 利用log()函数避免多个概率连乘过小的问题
60     p0Vect = log(p0Num / p0Denom)
61     return p0Vect, p1Vect, pAbusive
62 
63 # 4-3 朴素贝叶斯分类函数
64 # 对于一个测试点,p(ci)几乎不变,p(w|ci)=p(w0|ci)*p(w1|ci)...p(wn|ci)
65 # 而p(w0|ci)的概率又等于pow( ci发生的条件下,下标为0的特征=1的概率, w0发生的次数)
66 
67 def classifyNB(vec2Classify, p0Vec,p1Vec, pClass1):
68     p1 = sum(vec2Classify * p1Vec) + log(pClass1)
69     p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
70     if p1 > p0:
71         return 1
72     else:
73         return 0
74 
75 def testingNB():
76     listOPosts,listClasses = loadDataSet()
77     myVocabList = createVocabList(listOPosts)
78     trainMat = []
79     for postinDoc in listOPosts:
80         trainMat.append(setOfWords2Vec(myVocabList, postinDoc))
81     p0V, p1V, pAb =trainNB0(array(trainMat), array(listClasses))
82     testEntry = [love, my, dalmation]
83     thisDoc = array(setOfWords2Vec(myVocabList,testEntry))
84     print (testEntry, classified as:, classifyNB(thisDoc, p0V, p1V, pAb))
85     testEntry = [stupid,garbage]
86     thisDoc = array(setOfWords2Vec(myVocabList,testEntry))
87     print (testEntry,classified as:,classifyNB(thisDoc,p0V,p1V,pAb))

 

以上是关于《机器学习实战》笔记——朴素贝叶斯的主要内容,如果未能解决你的问题,请参考以下文章

《机器学习实战》笔记——朴素贝叶斯

机器学习—朴素贝叶斯

机器学习实战笔记--朴素贝叶斯

《机器学习实战》基于朴素贝叶斯分类算法构建文本分类器的Python实现

NBC朴素贝叶斯分类器 ————机器学习实战 python代码

机器学习实战—— 朴素贝叶斯代码实现