logo资料库

朴素贝叶斯分类算法原理与Python实现与使用方法案例.pdf

第1页 / 共3页
第2页 / 共3页
第3页 / 共3页
资料共3页,全文预览结束
朴素贝叶斯分类算法原理与Python实现与使用方法案例 朴素贝叶斯分类算法原理与 实现与使用方法案例 主要介绍了朴素贝叶斯分类算法原理与Python实现与使用方法,结合具体实例形式分析了朴素贝叶斯分类算法的概念、原理、实现流程与相关操作技巧,需要的朋友可 以参考下 本文实例讲述了朴素贝叶斯分类算法原理与Python实现与使用方法。分享给大家供大家参考,具体如下: 朴素贝叶斯分类算法 朴素贝叶斯分类算法 1、朴素贝叶斯分类算法原理 、朴素贝叶斯分类算法原理 1.1、概述、概述 贝叶斯分类算法 贝叶斯分类算法是一大类分类算法的总称 贝叶斯分类算法以样本可能属于某类的概率来作为分类依据 样本可能属于某类的概率来作为分类依据 朴素贝叶斯分类算法 朴素贝叶斯分类算法是贝叶斯分类算法中最简单的一种 注:朴素的意思是条件概率独立性 P(A|x1x2x3x4)=p(A|x1)*p(A|x2)p(A|x3)p(A|x4)则为条件概率独立 P(xy|z)=p(xyz)/p(z)=p(xz)/p(z)*p(yz)/p(z) 1.2、算法思想 、算法思想 朴素贝叶斯的思想思想是这样的: 如果一个事物在一些属性条件发生的情况下,事物属于A的概率>属于B的概率,则判定事物属于A 通俗来说比如,你在街上看到一个黑人,我让你猜这哥们哪里来的,你十有八九猜非洲。为什么呢? 在你的脑海中,有这么一个判断流程: ①、这个人的肤色是黑色 <特征> ②、黑色人种是非洲人的概率最高 <条件概率:黑色条件下是非洲人的概率> ③、没有其他辅助信息的情况下,最好的判断就是非洲人 这就是朴素贝叶斯的思想基础。 再扩展一下,假如在街上看到一个黑人讲英语,那我们是怎么去判断他来自于哪里? 提取特征: 提取特征: 肤色: 黑 语言: 英语 黑色人种来自非洲的概率: 80% 黑色人种来自于美国的概率:20% 讲英语的人来自于非洲的概率:10% 讲英语的人来自于美国的概率:90% 在我们的自然思维方式中,就会这样判断: 这个人来自非洲的概率:80% * 10% = 0.08 这个人来自美国的概率:20% * 90% =0.18 我们的判断结果就是:此人来自美国! 其蕴含的数学原理如下: 其蕴含的数学原理如下: p(A|xy)=p(Axy)/p(xy)=p(Axy)/p(x)p(y)=p(A)/p(x)*p(A)/p(y)* p(xy)/p(xy)=p(A|x)p(A|y) P(类别类别 | 特征特征)=P(特征特征 | 类别类别)*P(类别类别) / P(特征特征) 1.3、算法步骤 、算法步骤 ①、分解各类先验样本数据中的特征 ②、计算各类数据中,各特征的条件概率 (比如:特征1出现的情况下,属于A类的概率p(A|特征1),属于B类的概率p(B|特征1),属于C类的概率p(C|特征1)......) ③、分解待分类数据中的特征(特征1、特征2、特征3、特征4......) ④、计算各特征的各条件概率的乘积,如下所示: 判断为A类的概率:p(A|特征1)*p(A|特征2)*p(A|特征3)*p(A|特征4)..... 判断为B类的概率:p(B|特征1)*p(B|特征2)*p(B|特征3)*p(B|特征4)..... 判断为C类的概率:p(C|特征1)*p(C|特征2)*p(C|特征3)*p(C|特征4)..... ...... ⑤、结果中的最大值就是该样本所属的类别 1.4、算法应用举例 、算法应用举例 大众点评、淘宝等电商上都会有大量的用户评论,比如: 1、衣服质量太差了!!!!颜色根本不纯!!! 0 2、我有一有种上当受骗的感觉!!!! 0 0 3、质量太差,衣服拿到手感觉像旧货!!! 1 4、上身漂亮,合身,很帅,给卖家点赞 5、穿上衣服帅呆了,给点一万个赞 1 6、我在他家买了三件衣服!!!!质量都很差! 0 其中1/2/3/6是差评,4/5是好评 现在需要使用朴素贝叶斯分类算法来自动分类其他的评论,比如: a、这么差的衣服以后再也不买了 b、帅,有逼格 …… 1.5、算法应用流程 、算法应用流程
①、分解出先验数据中的各特征 (即分词,比如“衣服”“质量太差”“差”“不纯”“帅”“漂亮”,“赞”……) ②、计算各类别(好评、差评)中,各特征的条件概率 (比如 p(“衣服”|差评)、p(“衣服”|好评)、p(“差”|好评) 、p(“差”|差评)……) ③、分解出待分类样本的各特征 (比如分解a: “差” “衣服” ……) ④、计算类别概率 P(好评) = p(好评|“差”) *p(好评|“衣服”)*…… P(差评) = p(差评|“差”) *p(差评|“衣服”)*…… ⑤、显然P(差评)的结果值更大,因此a被判别为“差评” 1.6、朴素贝叶斯分类算法案例 、朴素贝叶斯分类算法案例 大体计算方法: 大体计算方法: P(好评 | 单词1,单词2,单词3) = P(单词1,单词2,单词3 | 好评) * P(好评) / P(单词1,单词2,单词3) 因为分母都相同,所以只用比较分子即可--->P(单词1,单词2,单词3 | 好评) P(好评) 每个单词之间都是相互独立的---->P(单词1 | 好评)P(单词2 | 好评)P(单词3 | 好评)*P(好评) P(单词1 | 好评) = 单词1在样本好评中出现的总次数/样本好评句子中总的单词数 P(好评) = 样本好评的条数/样本的总条数 同理:同理: P(差评 | 单词1,单词2,单词3) = P(单词1,单词2,单词3 | 差评) * P(差评) / P(单词1,单词2,单词3) 因为分母都相同,所以只用比较分子即可--->P(单词1,单词2,单词3 | 差评) P(差评) 每个单词之间都是相互独立的---->P(单词1 | 差评)P(单词2 | 差评)P(单词3 | 差评)*P(差评) 2、、 Python案例案例 #!/usr/bin/python # coding=utf-8 from numpy import * # 过滤网站的恶意留言 侮辱性:1 非侮辱性:0 # 创建一个实验样本 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] 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) # 创建一个其中所含元素都为0的向量 for word in inputSet: if word in vocabList: # returnVec[vocabList.index(word)] = 1 # index函数在字符串里找到字符第一次出现的位置 词集模型 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 = zeros(numWords); p1Num = zeros(numWords) # p0Denom = 0.0; p1Denom = 0.0 p0Num = ones(numWords); # 避免一个概率值为0,最后的乘积也为0 p1Num = ones(numWords); # 用来统计两类数据中,各词的词频 p0Denom = 2.0; # 用于统计0类中的总数 p1Denom = 2.0 # 用于统计1类中的总数 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 = p1Num / p1Denom # p0Vect = p0Num / p0Denom p1Vect = log(p1Num / p1Denom) # 在类1中,每个次的发生概率 p0Vect = log(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 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) # 调用测试方法---------------------------------------------------------------------- testingNB() 运行结果:
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python数学运算技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇 总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》 希望本文所述对大家Python程序设计有所帮助。
分享到:
收藏