1. 程式人生 > >樸素貝葉斯分類演算法Python程式碼

樸素貝葉斯分類演算法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