一、全概率公式与贝叶斯公式
下面是是全概率公式和贝叶斯公式的定义(张宇概率九讲)
贝叶斯定理是在事件已经发生后,反过来讨论事件在那个条件下发生的概率。下面以一个例题来讲解全概率公式和贝叶斯公式
二、朴素贝叶斯算法
朴素贝叶斯算法属于生成模型,需要对p(x|y)进行建模,如下图所示:
p(y)称为先验概率,他给出的是属于那一个类别的概率,这个一般比较好计算。p(x|y)是likelihood,就是下面的条件概率,这个不好求。p(y|x)是后验概率。
在计算条件概率时,提出了条件独立假设,因为这个假设,才有了朴素贝叶斯的名字。
正常计算条件概率的时候,应该是下面的式子:
但是,这样计算复杂度太大,X有N个特征,假设每一个特征都有两个取值,则所有的可能性为2^N,这样计算明显太过复杂,于是引入条件独立假设:
这样计算,可能性只有2N种可能,大大简化了计算,虽然在现实生活中这个条件不成立,但是它的效果还不错。这也是这个模型为什么能用的原因吧。
下面是整个朴素贝叶斯的流程图:
下面以例题为例讲解朴素贝叶斯:
三、贝叶斯估计
四、用朴素贝叶斯分类宠物评论是否是含有侮辱性词语
首先创建数据集
def loadDataSet():
"""
创建数据和标签,这是一个用来区分是否有侮辱性文字的例子
1表示言论中有侮辱性字样,0表示言论中没有侮辱性字样
"""
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):
"""
将所有上面数据中出现的单词整合到一个set中,去掉重复的单词
其中|表示的是两个Set取交集
"""
vocabSet = set([])
for document in dataSet:
vocabSet = vocabSet|set(document)
return list(vocabSet)
对于新的数据,需要把数据转换成一个向量
def setOfWords2Vec(vocabList,inputSet):
"""
将InputSet中的单词转化为向量
returnVec是和vocabList一样长的list,如果inputSet中的单词存在voabList中,
则标记为1存入returnVec中
"""
returnVec = [0]*len(vocabList)
for word in inputSet:
if word in vocabList:
returnVec[vocabList.index(word)]=1
else:
print("the word:%s is not in my Vocabulary!"%word)
return returnVec
进行测试
listIPosts,listClasses = loadDataSet()
myVocabList = createVocabList(listIPosts)
创建的词表如下:
将my dog has flea problems help please转换为对应的词向量
setOfWords2Vec(myVocabList,listIPosts[0])
下面是将my dog has flea problems help please转换为对应的特征向量。
下面开始计算用朴素贝叶斯进行分类
def trainNB0(trainMatrix,trainCategory):
numTrainDocs = len(trainMatrix)
numWords = len(trainMatrix[0])
#计算P(Ci)
pAbusive = sum(trainCategory)/float(numTrainDocs)
p0Num = np.ones(numWords)
p1Num = np.ones(numWords)
p0Denom = 2.0
p1Denom = 2.0
计算P(Wi|c=1)和P(Wi|c=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求和就是结果
p1Vect = np.log(p1Num/p1Denom)
p0Vect = np.log(p0Num/p0Denom)
return p0Vect,p1Vect,pAbusive
下面是对它进行预测:
def classifyNB(vec2Classify,p0Vec,p1Vec,pClass1):
p1 = sum(vec2Classify*p1Vec) + np.log(pClass1)
p0 = sum(vec2Classify*p0Vec) + np.log(1.0 - pClass1)
if p1>p0:
return 1
else:
return 0
将所有内容进行整合,进行预测:
def testingNB():
lisOPosts,listClasses = loadDataSet()
myVocabList = createVocabList(lisOPosts)
trainMat = []
for postinDoc in lisOPosts:
trainMat.append(setOfWords2Vec(myVocabList,postinDoc))
p0v,p1v,pAb =trainNB0(np.array(trainMat),np.array(listClasses))
testEntry = ['love','my','dalmation']
thisDoc = np.array(setOfWords2Vec(myVocabList,testEntry))
print(testEntry,'clasified as:',classifyNB(thisDoc,p0v,p1v,pAb))
testEntry = ['stupid','garbage']
thisDoc = np.array(setOfWords2Vec(myVocabList,testEntry))
print(testEntry,'clasified as:',classifyNB(thisDoc,p0v,p1v,pAb))
预测结果为
参考资料:1>李航统计机器学习
2>机器学习实战
3>CS229课程资料