在前一節中我們已經討論了關於貝葉斯算法的工作原理以及代碼實現,但是它處理的數據是二分類問題,這一節我們就將代碼稍微修改一下使其能夠實現多分類問題。主要有兩個函數需要進行修改一個是trainNB0(),一個是classifyNB()這兩個,接下來我們就來講解一下這兩個函數:
def trainNB0(trainMatrix,trainCategory):
numTrainDocs = len(trainMatrix)
numWords = len(trainMatrix[0])
labeldis = {}
labelnum = {}
Num = {}
Denom = {}
Vect = {}
for n in range(len(trainCategory)):
if trainCategory[n] not in labelnum.keys():
labelnum[trainCategory[n]] = 1
labelnum[trainCategory[n]] += 1
lennum = len(labelnum)
label = labelnum.keys()
for i in range(lennum):
labeldis[label[i]] = labelnum[label[i]]/float(numTrainDocs)
Num[label[i]] = ones(numWords)
Denom[label[i]] = 2.0
for i in range(numTrainDocs):
for n in range(lennum):
if trainCategory[i] == label[n]:
Num[label[n]] += trainMatrix[n]
Denom[label[n]] += sum(trainMatrix[n])
for i in range(lennum):
Vect[label[i]] = log(Num[label[i]]/Denom[label[i]])
return Vect,labeldis
上面就是修改後的函數,這裏新創建了幾個字典變量,labelnum用來存儲各個標籤的個數,用於計算每個標籤出現的頻率,算出來的值存儲在labeldis字典變量中,Num用來存儲向量的和,Denom則用來存儲總詞數。最後的Vect用來存儲概率向量。基本和二分類沒有太大的差別。
def classifyNB(vec2Classify, Vect, labeldis):
val = 0.0
result = ''
label = Vect.keys()
for i in range(len(Vect)):
p = (sum(vec2Classify * Vect[label[i]]) + log(labeldis[label[i]]))
if p > val or i == 0:
val = p
result = str(label[i])
return result
循環遍歷字典計算出概率,選擇出概率最高的向量的標籤返回。