【CSDN软件工程师能力认证学习精选】贝叶斯分类器(Python实现+详细完整源码和原理)

CSDN软件工程师能力认证(以下简称C系列认证)是由中国软件开发者网CSDN制定并推出的一个能力认证标准。C系列认证历经近一年的实际线下调研、考察、迭代、测试,并梳理出软件工程师开发过程中所需的各项技术技能,结合企业招聘需求和人才应聘痛点,基于公开、透明、公正的原则,甑别人才时确保真实业务场景、全部上机实操、所有过程留痕、存档不可篡改。

我们每天将都会精选CSDN站内技术文章供大家学习,帮助大家系统化学习IT技术。

 

在概率和统计学领域,贝叶斯理论基于对某一事件证据的认识来预测该事件的发生概率,

由结果推测原因的概率大小

首先,理解这个公式的前提是理解条件概率,因此先复习条件概率。

P(A|B)=P(AB)/P(B)

贝叶斯公式:

 

在机器学习领域,贝叶斯分类器是基于贝叶斯理论并假设各特征相互独立的分类方法,

基本方法是:使用特征向量来表征某个实体,并在该实体上绑定一个标签来代表其所属的类别。

优点:只需要极少数的训练数据,就可以建立起分类所需要的所有参数

抽象而言就是:贝叶斯分类器就是条件概率:给定一个实体,求解这个实体属于某一类的概率,这个实体用

一个长度为n的向量来表示,向量中的每一个元素表示相互独立的特征值的量。

=====================================================================================

以下是对水果分类的python代码实现:

类别较长不长不甜黄色不是黄色总数
香蕉40010035015045050500
橘子03001501503000300
其他水果1001001505050150200
总数5005006503508002001000

python文件结构:都在一个包下(Bayes)

bayes_classfier.py

 

 

#!/usr/bin/env python
# encoding: utf-8
"""
@Company:华中科技大学电气学院聚变与等离子研究所
@version: V1.0
@author: YEXIN
@contact: 1650996069@qq.com 2018--2020
@software: PyCharm
@file: bayes_classfier.py
@time: 2018/8/16 16:49
@Desc:贝叶斯分类器
"""
###贝叶斯分类器源码
 
####训练数据集---->合适参数
datasets = {'banala':{'long':400,'not_long':100,'sweet':350,'not_sweet':150,'yellow':450,'not_yellow':50},
            'orange':{'long':0,'not_long':300,'sweet':150,'not_sweet':150,'yellow':300,'not_yellow':0},
            'other_fruit':{'long':100,'not_long':100,'sweet':150,'not_sweet':50,'yellow':50,'not_yellow':150}
}
 
 
def count_total(data):
    '''计算各种水果的总数
    return {‘banala’:500 ...}'''
    count = {}
    total = 0
    for fruit in data:
        '''因为水果要么甜要么不甜,可以用 这两种特征来统计总数'''
        count[fruit] = data[fruit]['sweet'] + data[fruit]['not_sweet']
        total += count[fruit]
    return count,total
 
#categories,simpleTotal = count_total(datasets)
#print(categories,simpleTotal)
###########################################################
 
def cal_base_rates(data):
    '''计算各种水果的先验概率
    return {‘banala’:0.5 ...}'''
    categories,total = count_total(data)
    cal_base_rates = {}
    for label in categories:
        priori_prob = categories[label]/total
        cal_base_rates[label] = priori_prob
    return cal_base_rates
 
#Prio = cal_base_rates(datasets)
#print(Prio)
############################################################
 
def likelihold_prob(data):
    '''计算各个特征值在已知水果下的概率(likelihood probabilities)
    {'banala':{'long':0.8}...}'''
    count,_ = count_total(data)
    likelihold = {}
    for fruit in data:
        '''创建一个临时的字典,临时存储各个特征值的概率'''
        attr_prob = {}
        for attr in data[fruit]:
            #计算各个特征值在已知水果下的概率
            attr_prob[attr] = data[fruit][attr]/count[fruit]
        likelihold[fruit] = attr_prob
    return likelihold
 
#LikeHold = likelihold_prob(datasets)
#print(LikeHold)
############################################################
 
def evidence_prob(data):
    '''计算特征的概率对分类结果的影响
    return {'long':50%...}'''
    #水果的所有特征
    attrs = list(data['banala'].keys())
    count,total  = count_total(data)
    evidence_prob = {}
 
    #计算各种特征的概率
    for attr in attrs:
        attr_total = 0
        for fruit in data:
            attr_total += data[fruit][attr]
        evidence_prob[attr] = attr_total/total
    return evidence_prob
 
#Evidence_prob = evidence_prob(datasets)
#print(Evidence_prob)
##########################################################
#以上是训练数据用到的函数,即将数据转化为代码计算概率
##########################################################
 
class navie_bayes_classifier:
    '''初始化贝叶斯分类器,实例化时会调用__init__函数'''
    def __init__(self,data=datasets):
        self._data = datasets
        self._labels = [key for key in self._data.keys()]
        self._priori_prob = cal_base_rates(self._data)
        self._likelihold_prob = likelihold_prob(self._data)
        self._evidence_prob = evidence_prob(self._data)
 
    #下面的函数可以直接调用上面类中定义的变量
    def get_label(self,length,sweetness,color):
        '''获取某一组特征值的类别'''
        self._attrs = [length,sweetness,color]
        res = {}
        for label in self._labels:
            prob = self._priori_prob[label]#取某水果占比率
            #print("各个水果的占比率:",prob)
            for attr in self._attrs:
                #单个水果的某个特征概率除以总的某个特征概率 再乘以某水果占比率
                prob*=self._likelihold_prob[label][attr]/self._evidence_prob[attr]
                #print(prob)
            res[label] = prob
 
        #print(res)
        return res
============================================================================================

 

generate_attires.py

 

 

#!/usr/bin/env python
# encoding: utf-8
"""
@Company:华中科技大学电气学院聚变与等离子研究所
@version: V1.0
@author: YEXIN
@contact: 1650996069@qq.com 2018--2020
@software: PyCharm
@file: generate_attires.py
@time: 2018/8/17 13:43
@Desc:产生测试数据集来测试贝叶斯分类器的预测能力
"""
import random
def random_attr(pair):
    #生成0-1之间的随机数
    return pair[random.randint(0,1)]
 
def gen_attrs():
    #特征值的取值集合
    sets = [('long','not_long'),('sweet','not_sweet'),('yellow','not_yellow')]
    test_datasets = []
    for i in range(20):
        #使用map函数来生成一组特征值
        test_datasets.append(list(map(random_attr,sets)))
    return test_datasets
#print(gen_attrs())

 

======================================================================================

classfication.py

 

 

#!/usr/bin/env python
# encoding: utf-8
"""
@Company:华中科技大学电气学院聚变与等离子研究所
@version: V1.0
@author: YEXIN
@contact: 1650996069@qq.com 2018--2020
@software: PyCharm
@file: classfication.py
@time: 2018/8/17 13:55
@Desc:使用贝叶斯分类器对测试结果进行分类
"""
import operator
import bayes_classfier
import generate_attires
def main():
    test_datasets = generate_attires.gen_attrs()
    classfier = bayes_classfier.navie_bayes_classifier()
    for data in test_datasets:
        print("特征值:",end='\t')
        print(data)
        print("预测结果:", end='\t')
        res=classfier.get_label(*data)#表示多参传入
        print(res)#预测属于哪种水果的概率
        print('水果类别:',end='\t')
        #对后验概率排序,输出概率最大的标签
        print(sorted(res.items(),key=operator.itemgetter(1),reverse=True)[0][0])
 
if __name__ == '__main__':
#表示模块既可以被导入(到 Python shell 或者其他模块中),也可以作为脚本来执行。
#当模块被导入时,模块名称是文件名;而当模块作为脚本独立运行时,名称为 __main__。
#让模块既可以导入又可以执行
 
    main()

 

=====================================================================================

结果展示:

特征值:    ['not_long', 'not_sweet', 'not_yellow']
预测结果:    {'banala': 0.08571428571428573, 'orange': 0.0, 'other_fruit': 0.5357142857142858}
水果类别:    other_fruit
特征值:    ['not_long', 'sweet', 'not_yellow']
预测结果:    {'banala': 0.1076923076923077, 'orange': 0.0, 'other_fruit': 0.8653846153846153}
水果类别:    other_fruit
特征值:    ['not_long', 'sweet', 'yellow']
预测结果:    {'banala': 0.24230769230769234, 'orange': 0.5769230769230769, 'other_fruit': 0.07211538461538461}
水果类别:    orange
特征值:    ['not_long', 'sweet', 'yellow']
预测结果:    {'banala': 0.24230769230769234, 'orange': 0.5769230769230769, 'other_fruit': 0.07211538461538461}
水果类别:    orange
特征值:    ['not_long', 'not_sweet', 'not_yellow']
预测结果:    {'banala': 0.08571428571428573, 'orange': 0.0, 'other_fruit': 0.5357142857142858}
水果类别:    other_fruit
特征值:    ['long', 'not_sweet', 'not_yellow']
预测结果:    {'banala': 0.3428571428571429, 'orange': 0.0, 'other_fruit': 0.5357142857142858}
水果类别:    other_fruit
特征值:    ['long', 'not_sweet', 'not_yellow']
预测结果:    {'banala': 0.3428571428571429, 'orange': 0.0, 'other_fruit': 0.5357142857142858}
水果类别:    other_fruit
特征值:    ['long', 'not_sweet', 'not_yellow']
预测结果:    {'banala': 0.3428571428571429, 'orange': 0.0, 'other_fruit': 0.5357142857142858}
水果类别:    other_fruit
特征值:    ['long', 'not_sweet', 'not_yellow']
预测结果:    {'banala': 0.3428571428571429, 'orange': 0.0, 'other_fruit': 0.5357142857142858}
水果类别:    other_fruit
特征值:    ['long', 'not_sweet', 'yellow']
预测结果:    {'banala': 0.7714285714285716, 'orange': 0.0, 'other_fruit': 0.04464285714285715}
水果类别:    banala
特征值:    ['not_long', 'not_sweet', 'yellow']
预测结果:    {'banala': 0.1928571428571429, 'orange': 1.0714285714285714, 'other_fruit': 0.04464285714285715}
水果类别:    orange
特征值:    ['not_long', 'not_sweet', 'yellow']
预测结果:    {'banala': 0.1928571428571429, 'orange': 1.0714285714285714, 'other_fruit': 0.04464285714285715}
水果类别:    orange
特征值:    ['long', 'not_sweet', 'not_yellow']
预测结果:    {'banala': 0.3428571428571429, 'orange': 0.0, 'other_fruit': 0.5357142857142858}
水果类别:    other_fruit
特征值:    ['not_long', 'not_sweet', 'yellow']
预测结果:    {'banala': 0.1928571428571429, 'orange': 1.0714285714285714, 'other_fruit': 0.04464285714285715}
水果类别:    orange
特征值:    ['not_long', 'sweet', 'not_yellow']
预测结果:    {'banala': 0.1076923076923077, 'orange': 0.0, 'other_fruit': 0.8653846153846153}
水果类别:    other_fruit
特征值:    ['long', 'not_sweet', 'yellow']
预测结果:    {'banala': 0.7714285714285716, 'orange': 0.0, 'other_fruit': 0.04464285714285715}
水果类别:    banala
特征值:    ['not_long', 'sweet', 'yellow']
预测结果:    {'banala': 0.24230769230769234, 'orange': 0.5769230769230769, 'other_fruit': 0.07211538461538461}
水果类别:    orange
特征值:    ['long', 'not_sweet', 'not_yellow']
预测结果:    {'banala': 0.3428571428571429, 'orange': 0.0, 'other_fruit': 0.5357142857142858}
水果类别:    other_fruit
特征值:    ['not_long', 'not_sweet', 'yellow']
预测结果:    {'banala': 0.1928571428571429, 'orange': 1.0714285714285714, 'other_fruit': 0.04464285714285715}
水果类别:    orange
特征值:    ['long', 'not_sweet', 'yellow']
预测结果:    {'banala': 0.7714285714285716, 'orange': 0.0, 'other_fruit': 0.04464285714285715}
水果类别:    banala

 

关于CSDN软件工程师能力认证

      CSDN软件工程师能力认证(以下简称C系列认证)是由中国软件开发者网CSDN制定并推出的一个能力认证标准。C系列认证历经近一年的实际线下调研、考察、迭代、测试,并梳理出软件工程师开发过程中所需的各项技术技能,结合企业招聘需求和人才应聘痛点,基于公开、透明、公正的原则,甑别人才时确保真实业务场景、全部上机实操、所有过程留痕、存档不可篡改。C系列认证的宗旨是让一流的技术人才凭真才实学进大厂拿高薪,同时为企业节约大量招聘与培养成本,使命是提升高校大学生的技术能力,为行业提供人才储备,为国家数字化战略贡献力量。

 

了解详情可点击:CSDN软件工程师能力认证介绍

 

本文出处:https://blog.csdn.net/qq_25948717/article/details/81744277?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161413743916780255238616%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=161413743916780255238616&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-81744277.pc_search_result_before_js&utm_term=python贝叶斯&spm=1018.2226.3001.4187

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值