easthomeRT 发表于 2019-3-6 16:56:20

深入浅出朴素贝叶斯

很多人对朴素贝叶斯分并不了解或者并不常用,今天让东方瑞通深入浅出的为大家朴素贝叶斯吧我们其实无时无刻不在使用朴素贝叶斯分类算法,只是没有觉察到而已。比如在晚上走在灯光暗淡的路上,前面出现一个人影。可能是男/女的概率分别是50%。但假如能看出其头发为长发时,你可能会猜这个人是女生的概率为90%。这就是朴素贝叶斯算法的简单应用。贝叶斯定理缘起于托马斯.贝叶斯(1702-1761),一位英国长老会牧师和业余数学家。在他去世后发表的论文“论有关机遇问题的求解”中, 贝叶斯定理的现代形式实际上归因于拉普拉斯(1812)。拉普拉斯重新发现了贝叶斯定理,并把它用来解决天体力学、医学甚至法学的问题。但自19世纪中叶起,随着频率学派(在下文有时也称作经典统计)的兴起,概率的贝叶斯解释逐渐被统计学主流所拒绝。现代贝叶斯统计学的复兴肇始于Jeffreys(1939),在1950年代,经过Wald(1950), Savage(1954), Raiffic&Schlaifer(1961), Lindley(1972), De Finetti(1974)等人的努力,贝叶斯统计学逐渐发展壮大,并发展出了贝叶斯统计决策理论这个新分支。特别是到1990年代以后,随着计算方法MCMC在贝叶斯统计领域的广泛应用,解决了贝叶斯统计学长期存在的计算困难的问题,从而推动了贝叶斯统计在理论和应用领域的长足发展。贝叶斯统计学广泛应用于各个学科。就本书的主题而言,从认知学科、政治学到从自然语言处理和社会网络分析,贝叶斯方法都起到了举足轻重的作用朴素贝叶斯分类算法是贝叶斯分类算法中最简单的一种,朴素的意思是条件概率独立性
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)算法思想朴素贝叶斯的思想是这样的:如果一个事物在一些属性条件发生的情况下,事物属于A的概率>属于B的概率,则判定事物属于A
通俗来说比如,你在街上看到一个黑人,我让你猜这哥们哪里来的,你十有八九猜非洲。为什么呢?在你的脑海中,有这么一个判断流程:1、这个人的肤色是黑色 <特征>2、黑色人种是非洲人的概率最高 <条件概率:黑色条件下是非洲人的概率>3、没有其他辅助信息的情况下,最好的判断就是非洲人这就是朴素贝叶斯的思想基础。
再扩展一下,假如在街上看到一个黑人讲英语,那我们是怎么去判断他来自于哪里?提取特征:肤色: 黑语言: 英语黑色人种来自非洲的概率: 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、分解各类先验样本数据中的特征2、计算各类数据中,各特征的条件概率(比如:特征1出现的情况下,属于A类的概率p(A|特征1),属于B类的概率p(B|特征1),属于C类的概率p(C|特征1)......)3、分解待分类数据中的特征(特征1、特征2、特征3、特征4......)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)...........5、结果中的最大值就是该样本所属的类别各大电商上都会有大量的用户评论,比如:

1、衣服质量太差了!!!!颜色根本不纯!!!2、我有一有种上当受骗的感觉!!!!3、质量太差,衣服拿到手感觉像旧货!!!4、上身漂亮,合身,很帅,给卖家点赞5、穿上衣服帅呆了,给点一万个赞6、我在他家买了三件衣服!!!!质量都很差!000110

其中1/2/3/6是差评,4/5是好评现在需要使用朴素贝叶斯分类算法来自动分类其他的评论,比如:

a、这么差的衣服以后再也不买了b、帅,有逼格

算法应用流程1、分解出先验数据中的各特征(即分词,比如“衣服”“质量太差”“差”“不纯”“帅”“漂亮”,“赞”……)2、计算各类别(好评、差评)中,各特征的条件概率(比如 p(“衣服”|差评)、p(“衣服”|好评)、p(“差”|好评) 、p(“差”|差评)……)3、分解出待分类样本的各特征(比如分解a: “差” “衣服” ……)4、计算类别概率P(好评) = p(好评|“差”) *p(好评|“衣服”)*……P(差评) = p(差评|“差”) *p(差评|“衣服”)*……5、显然P(差评)的结果值更大,因此a被判别为“差评”朴素贝叶斯分类算法案例大体计算方法: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(差评)

代码实现:
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 = return postingList, classVec# 创建一个包含在所有文档中出现的不重复词的列表def createVocabList(dataSet):vocabSet = set([])      # 创建一个空集for document in dataSet:vocabSet = vocabSet | set(document)   # 创建两个集合的并集return list(vocabSet)# 将文档词条转换成词向量def setOfWords2Vec(vocabList, inputSet):returnVec = *len(vocabList)      # 创建一个其中所含元素都为0的向量for word in inputSet:if word in vocabList:# returnVec = 1   # index函数在字符串里找到字符第一次出现的位置词集模型returnVec += 1      # 文档的词袋模型    每个单词可以出现多次else: print "the word: %s is not in my Vocabulary!" % wordreturn returnVec
# 朴素贝叶斯分类器训练函数   从词向量计算概率def trainNB0(trainMatrix, trainCategory):numTrainDocs = len(trainMatrix)numWords = len(trainMatrix)pAbusive = sum(trainCategory)/float(numTrainDocs)# p0Num = zeros(numWords); p1Num = zeros(numWords)# p0Denom = 0.0; p1Denom = 0.0p0Num = ones(numWords);   # 避免一个概率值为0,最后的乘积也为0p1Num = ones(numWords);   # 用来统计两类数据中,各词的词频p0Denom = 2.0;# 用于统计0类中的总数p1Denom = 2.0# 用于统计1类中的总数for i in range(numTrainDocs):if trainCategory == 1:p1Num += trainMatrixp1Denom += sum(trainMatrix)else:p0Num += trainMatrixp0Denom += sum(trainMatrix)# p1Vect = p1Num / p1Denom# p0Vect = p0Num / p0Denomp1Vect = 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 1else: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()东方瑞通成立于1998年,总部在北京,分别在上海、广州、天津、武汉、济南、深圳、成都、重庆、杭州和西安建立了直营分部,全国拥有超过40间专业培训教室、40多位专职讲师及180多位签约讲师;作为国内企业级IT高级技术&管理培训的领军机构,为数千家企业客户提供员工外派(公开课)和团体定制培训服务,累计培训专业人才数十万名。


页: [1]
查看完整版本: 深入浅出朴素贝叶斯