朴素贝叶斯算法解析-机器学习实战(python)
2017-05-22 21:22
363 查看
一、朴素贝叶斯算法详解
朴素贝叶斯算法的关键就是这个朴素贝叶斯公式朴素贝叶斯算法适用于文本分类,最后是要知道,这个文本属于每一个类别的概率,属于哪一个类别的概率最大,就是属于那个类别
所以现在y是类别标签是下面的classVec,x是他的特征属性,就是下面的postingList,
这个公式的精华在于假设每个属性之间是相互独立的所以才有了下面的公式
二 、算法的实际计算
条件概率p(x|y)的计算吗,当他是离散值的时候,很容易就是计算出来的他的概率,也就是p(x|y),x中的每个特征的p(x|y)相加
当特征属性为连续值时,通常假定其值服从高斯分布(也称正态分布)。即:
另一个需要讨论的问题就是当P(a|y)=0的时候,对乘积的影响是相当大的,所以把他们假设了一个最小值,最小值为1或者2,当他们在这个类别不存在的时候,表示为1最小值1或者2.
代码
#coding:utf-8
from numpy import * def loadDataSet():#创建数据集 postingList = [['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'], ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'], ['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'], ['stop', 'posting', 'stupid', 'worthless', 'garbage'], ['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'], ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']] classVec = [0, 1, 0, 1, 0, 1] # 1 is 垃圾邮件, 0 not return postingList, classVec def createVocabList(dataSet):#去掉重复的特征向量,并且放到一个列表里面 vocabSet = set([]) # 传建一个空的数据集 for document in dataSet: vocabSet = vocabSet | set(document) # 集合的并 return list(vocabSet) def setOfWords2Vec(vocabList, inputSet):#转化为数字格式的列表,存在为1,不存在则为0 returnVec = [0] * len(vocabList)#创建全为0的列表 for word in inputSet: if word in vocabList: returnVec[vocabList.index(word)] = 1 else: print "the word: %s is not in my Vocabulary!" % word return returnVec #输出为 [000000100010] def trainNB0(trainMatrix, trainCategory):#训练函数 numTrainDocs = len(trainMatrix)#标签个数 numWords = len(trainMatrix[0])#特征向量的个数 pAbusive = sum(trainCategory) / float(numTrainDocs)#标签为1所占的概率 p0Num = ones(numWords) p1Num = ones(numWords) p0Denom = 2.0 p1Denom = 2.0 for i in range(numTrainDocs): if trainCategory[i] == 1: p1Num += trainMatrix[i]#数值相加 p1Denom += sum(trainMatrix[i])#计算所有词出现的数量,初始值为2 else: p0Num += trainMatrix[i] p0Denom += sum(trainMatrix[i]) p1Vect = log(p1Num / p1Denom) # p(w\c)每个词在这个类别下出现的概率,使用log,下面可以用加法 p0Vect = log(p0Num / p0Denom) return p0Vect, p1Vect, pAbusive def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):#计算p(c\w) p1 = sum(vec2Classify * p1Vec) + log(pClass1)#标签1的概率 p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)#这就是标签0 的概率 if p1 > p0: return 1 else: return 0 def testingNB(): listOPosts, listClasses = loadDataSet() myVocabList = createVocabList(listOPosts) trainMat = [] for postinDoc in listOPosts: trainMat.append(setOfWords2Vec(myVocabList, postinDoc)) p0V, p1V, pAb = trainNB0(array(trainMat), array(listClasses)) testEntry = ['love', 'my', 'dalmation'] thisDoc = array(setOfWords2Vec(myVocabList, testEntry))#输入的特征向量 print testEntry, 'classified as: ', classifyNB(thisDoc, p0V, p1V, pAb) testEntry = ['stupid', 'garbage'] thisDoc = array(setOfWords2Vec(myVocabList, testEntry)) print testEntry, 'classified as: ', classifyNB(thisDoc, p0V, p1V, pAb) def bagOfWords2VecMN(vocabList, inputSet): returnVec = [0] * len(vocabList) for word in inputSet: if word in vocabList: returnVec[vocabList.index(word)] += 1 return returnVec def textParse(bigString): # 读取文件 import re listOfTokens = re.split(r'\W*', bigString) return [tok.lower() for tok in listOfTokens if len(tok) > 2] def spamTest(): docList = [] classList = [] # fullText = [] for i in range(1, 26): wordList = textParse(open('email/spam/%d.txt' % i).read()) docList.append(wordList) # fullText.extend(wordList) classList.append(1) wordList = textParse(open('email/ham/%d.txt' % i).read()) docList.append(wordList) # fullText.extend(wordList) classList.append(0) vocabList = createVocabList(docList) # 去重 trainingSet = range(50); testSet = [] # 建立测试集 for i in range(10): randIndex = int(random.uniform(0, len(trainingSet))) testSet.append(trainingSet[randIndex]) del (trainingSet[randIndex]) trainMat = []; trainClasses = [] for docIndex in trainingSet: # train the classifier (get probs) trainNB0 trainMat.append(bagOfWords2VecMN(vocabList, docList[docIndex]))#转化为向量[001010101] trainClasses.append(classList[docIndex])#标签添加 p0V, p1V, pSpam = trainNB0(array(trainMat), array(trainClasses)) errorCount = 0 for docIndex in testSet: # classify the remaining items wordVector = bagOfWords2VecMN(vocabList, docList[docIndex]) if classifyNB(array(wordVector), p0V, p1V, pSpam) != classList[docIndex]: errorCount += 1 print "classification error", docList[docIndex] print 'the error rate is: ', float(errorCount) / len(testSet)#错误率 if __name__ == "__main__": listOPosts, listClasses = loadDataSet()#创建一个特征向量和对应的标签 myVocabList = createVocabList(listOPosts)#去重且放到一个列表里面 trainMat = [] for postinDoc in listOPosts: trainMat.append(setOfWords2Vec(myVocabList, postinDoc))#全部放到一个列表里面 p0V, p1V, pAb = trainNB0(trainMat, listClasses)#特征向量和它对应的标签 testingNB() spamTest()
相关文章推荐
- 机器学习—— 基于朴素贝叶斯分类算法构建文本分类器的Python实现
- Python机器学习实战笔记之KNN算法
- 机器学习实战——K-近邻算法【1:从文本中解析数据并可视化】
- 机器学习经典算法详解及Python实现---朴素贝叶斯分类及其在文本分类、垃圾邮件检测中的应用
- 机器学习实战(python)——kNN问题解析
- 机器学习实战第二章——KNN算法(源码解析)
- python机器学习实战3:朴素贝叶斯分类器
- 机器学习实战_初识朴素贝叶斯算法_理解其python代码(一)
- 机器学习实战python3 K近邻(KNN)算法实现
- [机器学习实战] k-近邻算法代码解析
- Python机器学习实战--(k-近邻算法)
- python机器学习实战1:实现k-近邻算法
- 【机器学习实战-python3】k-近邻算法
- 机器学习实战_初识朴素贝叶斯算法_理解其python代码(二)
- 机器学习实战之朴素贝叶斯进行文档分类(Python 代码版)
- 步步学习之用python实战机器学习1-kNN (K-NearestNeighbors)算法(a)
- 【机器学习实战-python3】Adaboost元算法提高分类性能
- 机器学习实战之K-近邻算法总结和代码解析
- 机器学习经典算法详解及Python实现---朴素贝叶斯分类及其在文本分类、垃圾邮件检测中的应用
- 机器学习实战笔记 k 近邻算法 函数解析