朴素贝叶斯分类算法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

阅读更多

没有更多推荐了,返回首页