您的位置:首页 > 其它

贝叶斯以及朴素贝叶斯

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)

正式定义



实例

# -*- 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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: