python实现贝叶斯

#贝叶斯算法的实现 2020.1.14
import numpy
class Bayes:
    def __init__(self):
        self.lenght = -1
        self.labels_count = dict()      #{类别:该类别在总类别中的比例}
        self.vector_count = dict()      #{类别:特征向量}



    def fit (self,dataSet:list,labels:list):

        if(len(dataSet)!=len(labels)):
            raise ValueError("输入的测试数组和类别数组长度不一致")
        self.lenght = dataSet[0]    #测试数据特征值的长度
        labels_num = len(labels)    #总的类别的个数
        differ_label = set(labels)  #类别中不同类别的数量

        for item in differ_label:   #对不同的类别建立比率,即字典,{label:rate}
            this_label = item
            self.label_count[this_label] = labels.count(this_label)/labels_num  #当前类别在在总的类别中出现的次数与总的类别的比率
        #循环结束后,此时的label_count中存放的是每个类别的在总的类别中出现的次数占总类别的个数的比例

        for vector,label in zip(dataSet,labels):    #序列解包
            if(label not in self.vector_count):     #如果当前类别未在字典vector_count中,{类别:特征向量}
                self.vector_count[label] = []       #把当前类别加进去
            self.vector_count[label].append(vector) #在把当前类别的“所有”的特征向量存进字典中,是所有的
        print("训练结束!")
        return self

    def bayes_test (self,Test_data,labels_Set):
        if(self.lenght == 1):
            raise ValueError("未开始训练!")

        #计算testdata分别为各个类别的概率
        lbDict = dict()
        for thislb in labels_Set:   #依次遍历各个类别
            p = 1
            all_label = self.labels_count[thislb]   #把当前类别占总类别的比例取出
            all_vector = self.vector_count[thislb]  #在把当前类别的所有的特征向量取出,此时all_vector为[[特征向量],[特征向量],...[特征向量]]
            v_num = len(all_vector)                 #求出一共有多少个特征向量
            all_vector = numpy.array(all_vector).T  #对当前的list做一个转置

            for index in range(0,len(Test_data)):   #遍历测试机中的每个测试数据
                vector = list(all_vector[index])
                #此时的all_vector为一个二维数组,all_vector[index]表示的是所有特征向量的第index个特征
                #在将这些特征弄成一个特征列表vector
                p*=vector.count(Test_data[index])/v_num     #Test_data[index]表示Test_data的第index个特征,然后该特征在特征列表中出现的比例在乘上p
                lbDict[thislb]=p*all_label
                #此处为全概率公式,将此时求得的结果为Test_data为该标签(thislb)的概率,并把它存到lbDict字典中
        thislabel = sorted(lbDict,key = lambda x:lbDict[x],reverse=True)[0]     #对lbDict的value进行排序,为降序排列,并取最大值
        return thislabel    #返回求得的结果``
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值