贝叶斯以及朴素贝叶斯
2016-09-12 18:14
85 查看
先给出贝叶斯公式:
P(A|B)=P(A)⋅P(B|A)P(B)
对此公式, 我们可以这么定义:
后验概率=先验概率⋅似然函数标准化常量
则这个公式的解释就是:
先预估一个 “先验概率”(就是实验之前的概率), 然后加入实验结果(就是训练),看这个实验是增强还是削弱了这个 “先验概率”, 由此得到更接近真实的 “后验概率”(实验之后的概率)
再看 贝叶斯如何参与到”分类”这个概念中, 上述公式我们可以化为:
P(类别|特征)=P(类别)⋅P(特征|类别)P(特征)
举一个例子:
含有[购买]的邮件属于[垃圾邮件]的概率=[垃圾邮件]的概率⋅含[购买]的邮件在垃圾邮件中的概率含[购买]的邮件占整体邮件的概率
显然, 后面的是三个参数更好求得, 我们可以用大量数据来训练, 不断修正这三个参数, 然后计算后验概率.
朴素贝叶斯中, 朴素的含义即简单的认为各个特征之间是相互独立的, 则朴素贝叶斯分类器, 可如下表述:
若有多个特征: F1, F2, F3 和分类: C1, C2
P(C1|F1,F2,F3...)=P(F1,F2,F3|C1)⋅P(C1)P(F1,F2,F3)
P(C2|F1,F2,F3...)=P(F1,F2,F3|C2)⋅P(C2)P(F1,F2,F3)
对比两个得出的值, 哪个大则属于哪一类的概率大一些, 同时我们看到都有P(F1,F2,F3) 并且又F1,F2,F3是独立的则
上述值可化为对比P1,P2:
P1=P(F1|C1)⋅P(F2|C1)⋅P(F3|C1)⋅P(C1) P2=P(F1|C2)⋅P(F2|C2)⋅P(F3|C2)⋅P(C2)
注意, 很有可能其中某个P(Fi|Cj)的值是 “零”,即在某一类下没有该特征, 这个时候就要用到 “拉普拉斯平滑”,所有的P(Fi|Cj)都改为(有可能这不是拉不拉死):
进一步解释: 在起步阶段,样本就是很少,为了避免0,1这种极端概率,需要人为做一些数学变换。比如,对过敏来说,每个症状的初始概率都为50%,当来了一个过敏病人,如果出现打喷嚏,那么P(打喷嚏|过敏)的概率就提升一点点,反之如果不打喷嚏,则P(打喷嚏|过敏)的概率就下降一点点。这样使得每一个概率都变得在(0,1)之间平滑变化,对其他的变量也这样处理。
P′(Fi|Cj)=1∗0.5+sum(Fi)⋅P(Fi|Cj)1+sum(Fi)
P(A|B)=P(A)⋅P(B|A)P(B)
对此公式, 我们可以这么定义:
后验概率=先验概率⋅似然函数标准化常量
则这个公式的解释就是:
先预估一个 “先验概率”(就是实验之前的概率), 然后加入实验结果(就是训练),看这个实验是增强还是削弱了这个 “先验概率”, 由此得到更接近真实的 “后验概率”(实验之后的概率)
再看 贝叶斯如何参与到”分类”这个概念中, 上述公式我们可以化为:
P(类别|特征)=P(类别)⋅P(特征|类别)P(特征)
举一个例子:
含有[购买]的邮件属于[垃圾邮件]的概率=[垃圾邮件]的概率⋅含[购买]的邮件在垃圾邮件中的概率含[购买]的邮件占整体邮件的概率
显然, 后面的是三个参数更好求得, 我们可以用大量数据来训练, 不断修正这三个参数, 然后计算后验概率.
朴素贝叶斯中, 朴素的含义即简单的认为各个特征之间是相互独立的, 则朴素贝叶斯分类器, 可如下表述:
若有多个特征: F1, F2, F3 和分类: C1, C2
P(C1|F1,F2,F3...)=P(F1,F2,F3|C1)⋅P(C1)P(F1,F2,F3)
P(C2|F1,F2,F3...)=P(F1,F2,F3|C2)⋅P(C2)P(F1,F2,F3)
对比两个得出的值, 哪个大则属于哪一类的概率大一些, 同时我们看到都有P(F1,F2,F3) 并且又F1,F2,F3是独立的则
上述值可化为对比P1,P2:
P1=P(F1|C1)⋅P(F2|C1)⋅P(F3|C1)⋅P(C1) P2=P(F1|C2)⋅P(F2|C2)⋅P(F3|C2)⋅P(C2)
注意, 很有可能其中某个P(Fi|Cj)的值是 “零”,即在某一类下没有该特征, 这个时候就要用到 “拉普拉斯平滑”,所有的P(Fi|Cj)都改为(有可能这不是拉不拉死):
进一步解释: 在起步阶段,样本就是很少,为了避免0,1这种极端概率,需要人为做一些数学变换。比如,对过敏来说,每个症状的初始概率都为50%,当来了一个过敏病人,如果出现打喷嚏,那么P(打喷嚏|过敏)的概率就提升一点点,反之如果不打喷嚏,则P(打喷嚏|过敏)的概率就下降一点点。这样使得每一个概率都变得在(0,1)之间平滑变化,对其他的变量也这样处理。
P′(Fi|Cj)=1∗0.5+sum(Fi)⋅P(Fi|Cj)1+sum(Fi)
正式定义
实例
# -*- encoding: utf-8 -*- # http://blog.csdn.net/lu597203933/article/details/38445315 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 侮辱性文字 , 0 代表正常言论 return postingList, classVec def createVocabList(dataSet):#创建词汇表 vocaSet = set([]) for doc in dataSet: vocaSet = vocaSet | set(doc) #创建并集 return list(vocaSet) def setOfWords2Vec(vocabList, inputSet): returnVec=[] for doc in inputSet: tmpVec = [0]*len(vocabList) for word in doc: if word in vocabList: tmpVec[vocabList.index(word)]=1 else: print("the word: %s is not in my vacobulary!"%word) returnVec.append(tmpVec) return returnVec def bagOfWords2VecMN(vocabList, inputSet): returnVec = [] for doc in inputSet: tmpVec = [0]*len(vocabList) for word in doc: if word in vocabList: if word in vocabList: tmpVec[vocabList.index(word)]+=1 else: print("the word: %s is not in my vacobulary"%word) returnVec.append(tmpVec) return returnVec def trainNB0(trainMatrix, trainCategory): numTrainDocs = len(trainMatrix) numWords = len(trainMatrix[0]) pAbusive = sum(trainCategory)/float(numTrainDocs) ''' p0Num = zeros(numWords) p1Num = zeros(numWords) ''' 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]) else: p0Num += trainMatrix[i] p0Denom += sum(trainMatrix[i]) p1Vect = p1Num/p1Denom p0Vect = p0Num/p0Denom return p0Vect, p1Vect, pAbusive def classifyNB(vec2Classify, p0Vec, p1Vec, pClass): p1 = sum(vec2Classify*p1Vec)+log(pClass) p0 = sum(vec2Classify*p0Vec)+log(1.0-pClass) if p1>p0: return 1 else: return 0 def testingNB(): listOPosts, listClasses = loadDataSet() myVocabList = createVocabList(listOPosts) trainMat = setOfWords2Vec(myVocabList,listOPosts) p0V, p1V, pAb = trainNB0(array(trainMat),array(listClasses)) result = [] testSet=[['love','my', 'dalmation'],['stupid','garbage']] testVec = setOfWords2Vec(myVocabList, testSet) for test in testVec: tmp_r = classifyNB(test, p0V, p1V, pAb) result.append(tmp_r) for i in range(len(testSet)): print(testSet[i]) print("The class of it is: "+str(result[i])) testingNB()
相关文章推荐
- PGM:贝叶斯网表示之朴素贝叶斯模型naive Bayes
- R语言机器学习1:用案例理解朴素贝叶斯以及R语言的实现——(part1)
- 贝叶斯(朴素贝叶斯,正太贝叶斯)及OpenCV源码分析
- [置顶] 《统计学习方法》 朴素贝叶斯 贝叶斯估计 Python实现
- Atitit 贝叶斯算法的原理以及垃圾邮件分类的原理
- 统计学习方法第四章朴素贝叶斯的贝叶斯估计,例题4.2代码实践
- 贝叶斯(朴素贝叶斯,正太贝叶斯)及OpenCV源码分析
- R语言︱贝叶斯网络语言实现及与朴素贝叶斯区别(笔记)
- CB,朴素贝叶斯和贝叶斯信念网络
- Atitit 贝叶斯算法的原理以及垃圾邮件分类的原理
- 生成模型,判别模型,以及朴素贝叶斯
- 贝叶斯学习,spark mlib 朴素贝叶斯使用
- 关于机器学习中的朴素贝叶斯以及拉普拉斯平滑
- Bayesian Inference and Naive Bayesian Classification: A Brief Introduction - 贝叶斯推断与朴素贝叶斯分类算法简述
- 朴素贝叶斯与贝叶斯信念网络
- Atitti 文本分类 以及 垃圾邮件 判断原理 以及贝叶斯算法的应用解决方案
- 模式识别之贝叶斯---朴素贝叶斯(naive bayes)算法及实现
- Atitti 文本分类 以及 垃圾邮件 判断原理 以及贝叶斯算法的应用解决方案
- 贝叶斯思想以及与最大似然估计、最大后验估计的区别(转)
- 关于ID3 C4.5 以及贝叶斯算法的详细介绍