朴素贝叶斯法也是常用的机器学习的算法,但是刚接触的时候各种概率公式,各种懵逼。
只能去翻看概率论与数理统计的书,然后再返回来看朴素贝叶斯,基本上能看懂。
朴素贝叶斯的推导过程在各种机器学习书上都能找到,朴素贝叶斯的分类器可表示成:
那么这个公式该怎么用呢,我来说说我的理解:
1.先计算出各个类的在总的样本中的概率
2.再计算出各个特征的不同取值在各个类的条件下的概率
3.然后根据预测样本套用上面的公式,取概率较大的那一类。
看这个例子:
第一步:
第二步:
第三步:
下面是用python3实现的朴素贝叶斯法:(主要参考机器学习实战)
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):
vocabSet = set([])
for document in dataSet:
vocabSet = vocabSet | set(document) #去掉document中重复的元素,并合并成列表
return list(vocabSet)
def setOfWords2Vec(vocabList, inputSet):
returnVec = [0]*len(vocabList)#创建一个0列表
for word in inputSet:#遍历列表
if word in vocabList:
returnVec[vocabList.index(word)] = 1#把word在vocablist中的位置在teturnVec中用1呈现
else:
print(“the word: %s is not in my Vocabulary!” % word)
return returnVec
此上是介绍如何把一组词转换为一组数字 #
接下来使用数字来计算概率
def trainNB0(trainMatrix,trainCategory):#参数是文档矩阵和每篇文档类别标签所构成的向量
numTrainDocs = len(trainMatrix)#获得文档的组数
numWords = len(trainMatrix[0])#获得文档矩阵第一组文档的长度
pAbusive = sum(trainCategory)/float(numTrainDocs)#侮辱性文字所占的概率
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 = p1Denom+ sum(trainMatrix[i])#词的总数相加
# print(p1Num)
# print(p1Denom)
else:
p0Num += trainMatrix[i]
p0Denom += sum(trainMatrix[i])#同上
# print(p0Num)
# print(p0Denom)
p1Vect = log(p1Num/p1Denom)
p0Vect = log(p0Num/p0Denom)
return p0Vect,p1Vect,pAbusive #返回侮辱性文字的概率,和 侮辱性文字和非侮辱性文字各个词的概率
listOposts,listClasses = loadDataSet()
myVocabList = createVocabList(listOposts)
print(len(myVocabList))
traninMat = []
for postinDoc in listOposts:
traninMat.append(setOfWords2Vec(myVocabList,postinDoc))
p0V,p1V,PAb, = trainNB0(traninMat,listClasses)
print(p0V,p1V,PAb)
每天学习一点点,进步一点点。