樸素貝葉斯分類演算法Python程式碼
貝葉斯分類器就是求P(C|F1F2...Fn) = P(F1F2...Fn|C)P(C) / P(F1F2...Fn) 最大值,由於 P(F1F2...Fn) 對於所有的類別都是相同的,可以省略,問題就變成了求 P(F1F2...Fn|C)P(C) 的最大值。
樸素貝葉斯分類器則是更進一步,假設所有特徵都彼此獨立,因此P(F1F2...Fn|C)P(C)= P(F1|C)P(F2|C) ... P(Fn|C)P(C)
樸素貝葉斯演算法進行分類,是根據樸素貝葉斯公式分別計算測試資料為類別0,類別1,類別2...的概率,假如計算得出類別i概率高,就可以說測試資料屬於類別i的概率最大,把測試資料歸到類別i,達到分類的目的。
封裝在類裡,方便以後使用。
import numpy
class Bayes:
def __init__(self):
self.length=-1 #用來判斷是否訓練過
self.labelcount=dict() #字典型別{label:頻數...}
self.vectorcount=dict() #字典型別{label:vector...}
#訓練資料
#dataset是二維列表,格式[[],[]...],每一行是屬於某一個label,labels是一維列表
def fit(self,dataset:list,labels:list):
if(len(dataset)!=len(labels)):
raise ValueError("輸入陣列與類別陣列長度不同")
#訓練資料特徵值長度
self.length=len(dataset[0])
labelsnum=len(labels)
#set去掉重複label
norlabels=set(labels)
for item in norlabels:
thislabel=item
#計算當前類別佔總數的比例
labelcount[]=labels.count(thislabel)/labelsnum
#zip()整合dataset和labels
for vector,label in zip(dataset,labels):
if(label not in vectorcount):
self.vectorcount[label]=[]
#往當前類別下新增向量
self.vectorcount[label].append(vector)
print("訓練結束")
return self
#測試
def btest(self,testdata,labelsset):
if(self.length==-1):
raise ValueError("未進行訓練")
lbdict=dict()
for thislb in labelsset:
p=1
alllabel=self.labelcount[thislb] #當前label佔總label的比例
allvector=self.vectorcount[thislb] #屬於當前label下的所有向量
vnum=len(allvector)
allvector=numpy.array(allvector).T
for index in range(0,len(testdata)): #一個一個計算測試資料的概率
vector=list(allvector[index])
p*=vector.count(testdata[index])/vnum
lbdict[thislb]=p*alllabel
thislabel=sorted(lbdict,key=lamba x:lbdict[x],reverse=True)[0]#按照lbdict[x]排降序
return thislabel