介绍概率和条件概率:
假设一个盒子里装了3个灰球和4个黑球,则黑球的概率是4/7,灰球的概率是3/7,这就是我们学习过的概率。
现将这7个球分别放在A,B两个盒子里边,其中,A盒子里边装2个灰球,2个黑球,B盒子里边装1个灰球,2个黑球,此时,如果我们计算从B中取出灰球的概率,这个就是条件概率。
计算方法:
P(灰|B)=P(灰 and B )/P(B)=1/7 *7/3=1/3
P(灰 and B)=B中灰球个数/两个桶的总数 =1/7
另一种有效计算条件概率的方法称为贝叶斯准则:
P(c|x)P(x)=P(x|c)P(c)
若我们知道P(x|c),求P(c|x),则可以变形为
p(c|x)=P(x|c)P(c)/P(x)
朴素贝叶斯算法主要用于文档的自动分类,文档之间的特征都是假设独立的,一个特征或者单词出现的可能性与它和其他单词相邻没有关系。这也是‘朴素’一词的含义。借鉴别人的博客里边的例子,如果我们不假设特征独立,那我们计算条件概率就容易出现0,这对于我们本身的目的是不符合的,这也是一个大胆的尝试。
(1)准备数据:
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]
return postingList,classVec
创建一个空集,取两个集合的并集,set去掉重复的词
def createVocabList(dataSet):
vocabSet =set([])
for document in dataSet :
vocabSet =vocabSet | set(document)#求两个集合的并集
return list(vocabSet)
对输入的数据进行遍历,如果该词在数据集中存在,那就把值设置为1,得到一个0,1的列表
def setOfWords2Vec(vocabList,inputSet):
returnVec =[0]*len(vocabList) #将所有的数据设置为0
for word in inputSet:
if word in vocabList:#如果输入的词在词表中出现则设置为1
returnVec[vocabList.index(word)]=1
else : print ("the word : %s is not in my Vocabulary !" % word)
return returnVec
(2)算法实现
我们已经将一组单词转化为一组数字,就可以计算概率,公式为
w是向量
也可以写成
我们把单词分类为侮辱类和非侮辱类,分别设置为1和0,则
def trainNB0(trainMatrix,trainCategory):
numTrainDocs= len (trainMatrix)
numWords =len(trainMatrix[0])
pAbusive = sum(trainCategory)/float(numTrainDocs)
p0Num = np.ones(numWords);p1Num=np.ones(numWords)
p0Denom = 2.0;plDenom = 2.0
for i in range(numTrainDocs):
if trainCategory[i]==1:
p1Num+=trainMatrix[i] #该词对应的个数
plDenom += sum(trainMatrix[i]) #该文档的总词数
else :
p0Num+=trainMatrix[i]
p0Denom +=sum(trainMatrix[i])
p1Vect = log(p1Num/plDenom) #取对数解决程序的下溢或计算不正确
p0Vect = log(p0Num/p0Denom)
return p0Vect,p1Vect,pAbusive
def classifyNB(vec2Classify,p0Vec,p1Vec,pClass1):
p1 =sum(vec2Classify*p1Vec)+log(pClass1)
p0 =sum(vec2Classify*p0Vec)+log(1.0-pClass1)
if p1>p0:
return 1
else :
return 0
def testingNB():
listOPosts,listClasses = loadDataSet()
myVocabList = createVocabList(listOPosts)
trainMat = []
for postingDoc in listOPosts:
trainMat.append(setOfWords2Vec(myVocabList,postingDoc))
p0V,p1V,pAb=trainNB0(np.array(trainMat),np.array(listClasses))
testEntry =['love','my','dalmation']
thisDoc = np.array(setOfWords2Vec(myVocabList,testEntry))
print(testEntry,'classified as :',classifyNB(thisDoc,p0V,p1V,pAb))
testEntry = ['stupid','garbage']
thisDoc = np.array(setOfWords2Vec(myVocabList,testEntry))
print(testEntry, 'classified a : ',classifyNB(thisDoc,p0V,p1V,pAb))
testingNB()
这里解释一下:
词集模型:我们将每个词的出现与否作为一个特征,这被描述为词集模型
词袋模型:统计某个词出现的概率,在词袋中,每个单词可以出现多次,词集中,只能出现一次
词袋模型的代码:
def bagOfWords2VecMN(vocabList,inputSet):
returnVec =[0]*len(vocabList)
for word in inputSet:
if word in vocabList
替换
setOfWords2Vec()函数。