如何优雅的ML(三) 朴素贝叶斯
2014-07-13 19:21
309 查看
朴素贝叶斯是贝叶斯决策理论的一部分,它只做最原始最简单的假设,选择最高概率的假设。
一些概率的基本公式
条件概率公式:
贝叶斯公式:
首先拆分文本为词素,然后从文本中获取特征。对文本的类别进行人工标注,这些标注用于训练程序。
然后创建一个包含在所有文档中出现的不重复词的词表。
接下来是一个过程,给定一篇文档和词表,该文档会被转换为词向量。
将每个单词出现与否作为一个特征称为词集模型,向量的每一元素为1或0。
或记录每个词的出现次数称为词袋模型。当单词重复出现时,它会增加词向量的对应值。
前面将文档转换为了一组数字,接下来要用这些数字来计算概率。
已知一个词是否出现在一篇文档中,也知道该文档所属的类别。
根据贝叶斯公式,p(c_i|w)=p(w|c_i)p(c_i)/p(w),w是词向量,c_i为第i个类别的文档。
p(c_i)通过类别i中文档总数除以总的文档数来求出。
计算p(w|c_i)要利用朴素贝叶斯假设,将w展开作为各个独立的特征,这样求sum{p(wk|c_i)}的值即可。
有了这些数据就可以比较文档属于第i个类别的概率了。
优点:在数据较少情况下仍然有效、可处理多类问题 缺点:对于输入数据的准备方式较为敏感 使用数据类型:标称型数据
一些概率的基本公式
条件概率公式:
贝叶斯公式:
首先拆分文本为词素,然后从文本中获取特征。对文本的类别进行人工标注,这些标注用于训练程序。
然后创建一个包含在所有文档中出现的不重复词的词表。
接下来是一个过程,给定一篇文档和词表,该文档会被转换为词向量。
将每个单词出现与否作为一个特征称为词集模型,向量的每一元素为1或0。
或记录每个词的出现次数称为词袋模型。当单词重复出现时,它会增加词向量的对应值。
前面将文档转换为了一组数字,接下来要用这些数字来计算概率。
已知一个词是否出现在一篇文档中,也知道该文档所属的类别。
根据贝叶斯公式,p(c_i|w)=p(w|c_i)p(c_i)/p(w),w是词向量,c_i为第i个类别的文档。
p(c_i)通过类别i中文档总数除以总的文档数来求出。
计算p(w|c_i)要利用朴素贝叶斯假设,将w展开作为各个独立的特征,这样求sum{p(wk|c_i)}的值即可。
有了这些数据就可以比较文档属于第i个类别的概率了。
# coding=gbk 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 abusive, 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): """ 计算文本中的单词在词汇表是否出现 """ returnVec = [0] * len(vocabList) 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 def trainNB0(trainMatrix, trainCategory): """ 朴素贝叶斯分类器训练函数 """ numTrainDocs = len(trainMatrix) numWords = len(trainMatrix[0]) pAbusive = sum(trainCategory)/float(numTrainDocs) p0Num = ones(numWords) #p0Num = zeros(numWords) p1Num = ones(numWords) #p1Num = zeros(numWords) p0Denom = 2.0 #p0Denom = 0.0 p1Denom = 2.0 #p1Denom = 0.0 for i in range(numTrainDocs): if trainCategory[i]==1: p1Num += trainMatrix[i] p1Denom += sum(trainMatrix[i]) else: p0Num += trainMatrix[i] p0Denom += sum(trainMatrix[i]) p1Vect = log(p1Num/p1Denom) #p1Vect = p1Num/p1Denom p0Vect = log(p0Num/p0Denom) #p0Vect = p0Num/p0Denom return p0Vect, p1Vect, pAbusive def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1): """ 朴素贝叶斯分类函数 """ p1 = sum(vec2Classify * p1Vec) + log(pClass1) p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1) if p1 > p0: return 1 else: return 0 def bagOfWords2VecMN(vocabList, inputSet): """ 朴素贝叶斯词袋模型 """ returnVec = [0] * len(vocabList) for word in inputSet: if word in vocabList: returnVec[vocabList.index(word)] += 1 return returnVec def testingNB(fun = bagOfWords2VecMN): """ 测试分类器 Args: 词袋模型(setOfWords2Vec, bagOfWords2VecMN) """ listOPosts, listClasses = loadDataSet() myVocabList = createVocabList(listOPosts) trainMat = [] for postinDoc in listOPosts: trainMat.append(fun(myVocabList, postinDoc)) p0V, p1V, pAb = trainNB0(array(trainMat), array(listClasses)) testEntry = ['love', 'my', 'dalmation'] thisDoc = array(fun(myVocabList, testEntry)) print testEntry, 'classified as: ', classifyNB(thisDoc, p0V, p1V, pAb) testEntry = ['stupid', 'garbage'] thisDoc = array(fun(myVocabList, testEntry)) print testEntry, 'classified as: ', classifyNB(thisDoc, p0V, p1V, pAb)
相关文章推荐
- 如何优雅的ML(五) 支持向量机
- 如何优雅的ML(四) Logistic 回归
- 如何优雅的ML(一) k-近邻算法
- 如何优雅的ML(二) 决策树
- 如何写优雅的代码(2)——#define?const?还是enum?
- 如何写优雅的代码(1)——灵活使用goto和__try
- 如何写优雅的代码(1)——灵活使用goto和__try:评论反馈
- 如何写优雅的代码(2)——#define?const?还是enum?
- 如何写优雅的代码(序)——自语
- 女人如何优雅地报复男人
- 如何写优雅的代码(4)——简单有效地玩转线程
- 如何成为优雅的女人
- 如何写优雅的代码(3)——合理选择函数形参
- 如何写优雅的代码(5)——远离临界区噩梦
- 如何写优雅的代码(5)--不一样的类用法
- 如何写优雅的代码(4)——简单有效地玩转线程
- 如何写优雅的代码—#define?const?还是enum?
- 如何写优雅的代码(序)——自语
- 如何写优雅的代码(3)——合理选择函数形参
- 如何写优雅的代码(5)--不一样的类用法