《机器学习实战》笔记——朴素贝叶斯
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实现