先给出贝叶斯公式:
对此公式, 我们可以这么定义:
则这个公式的解释就是:
先预估一个 “先验概率”(就是实验之前的概率), 然后加入实验结果(就是训练),看这个实验是增强还是削弱了这个 “先验概率”, 由此得到更接近真实的 “后验概率”(实验之后的概率)
再看 贝叶斯如何参与到”分类”这个概念中, 上述公式我们可以化为:
举一个例子:
显然, 后面的是三个参数更好求得, 我们可以用大量数据来训练, 不断修正这三个参数, 然后计算后验概率.
朴素贝叶斯中, 朴素的含义即简单的认为各个特征之间是相互独立的, 则朴素贝叶斯分类器, 可如下表述:
若有多个特征: 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)之间平滑变化,对其他的变量也这样处理。
正式定义
实例
# -*- encoding: utf-8 -*-
# http://blog.youkuaiyun.com/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()
本文介绍了贝叶斯分类器的基本原理,通过示例详细解释了朴素贝叶斯分类器的工作流程,并提供了一个使用Python实现的垃圾邮件过滤案例。
786

被折叠的 条评论
为什么被折叠?



