机器学习期末复习 贝叶斯分类器

news2024/12/28 20:28:07

先验概率与后验概率

先验概率:对于某一个概率事件,我们都会有基于自己已有的知识,对于这个概率事件会分别以什么概率出现各种结果会有一个预先的估计,而这个估计并未考虑到任何相关因素。

对于分类数据来说,先验概率就是取某一类的概率。

(基于自己已有的知识->已有的数据)

(预先的估计->统计概率)

假如你考试没及格,老师要求大家拿卷子回家给爸妈签字,假如你考试没及格过10次,你每次都用小本记下来后果:

  • 被胖揍一顿:7次
  • 被简单地数落一下:2次
  • 被温情地鼓励:1次

那么先验概率:

  • 被胖揍一顿:70%
  • 被简单地数落一下:20%
  • 被温情地鼓励:10%

后验概率:在先验概率的基础上加了一层“考虑”:结合我们已有的知识,将与待检验事件(即我们正在估计概率的随机事件)相关的因素也考虑进去后,我们对随机事件的概率的预估。

我看了好几篇博文都不理解,关于后验概率看这篇博文吧

朴素贝叶斯分类器(Naive Bayesian Classifier)

重点:朴素贝叶斯

朴素贝叶斯方法是基于贝叶斯定理的一组有监督学习算法

朴素->所有属性相互独立,就西瓜数据集来说,颜色与敲声没有任何关系。(实际情况下是有联系的,但是为了简化,假设他们没关系)

公式:

 公式中的P(x)可以忽略。

因为这个公式最后求出来的是一个数,比如西瓜数据集,我们最后求出的是P(c=好瓜 | X)=0.4

P(c=坏瓜 | X)=0.8,然后通过比较这两个数的大小来判断测试集是好瓜还是坏瓜。

P(x)在计算P(c=好瓜 | X)和P(c=坏瓜 | X)都有,而且相同。所以去掉P(x)并不影响

P(c=好瓜 | X)和P(c=坏瓜 | X)之间的大小关系。

分类准则:

朴素贝叶斯+拉普拉斯修正实现代码:

"""
    利用打网球数据集PlayTenis构建决策树,该数据集的特性如下:
    属性包括天气(outlook)、温度(temperature)、湿度(humidity)、是否有风(windy),样本个数为14。
    标签为今天是否去打网球(play)。
    具体数据如下:
    NO. Outlook temperature humidity   windy  play
    1   sunny      hot       high      FALSE  no
    2   sunny      hot       high      TRUE   no
    3   overcast   hot       high      FALSE  yes
    4   rainy      mild      high      FALSE  yes
    5   rainy      cool      normal    FALSE  yes
    6   rainy      cool      normal    TRUE   no
    7   overcast   cool      normal    TRUE   yes
    8   sunny      mild      high      FALSE  no
    9   sunny      cool      normal    FALSE  yes
    10  rainy      mild      normal    FALSE  yes
"""

# 读入数据函数  返回正例,反例,总例,数据
def readFile():
    f = open('D:\\PythonProject_Class\\test_Data\\PlayTennis.txt', 'r')
    lk = 10
    preData = [[] for i in range(lk)]
    dict_PlusFeatures = {}  # 保存属性的名称,并为求信息增益做准备,也就是把初值赋值为0
    dict_NegativeFeatures = {}  # 上一个保存的是正例,这个保存的的是反例
    sum_Features = {}

    for i in range(0, 4):  # 把前几行的文字描述跳过
        s = f.readline()

    s = f.readline()  # 读入属性
    #    NO. Outlook temperature humidity   windy  play
    # strip函数是去除这行的开头和结尾的换行符和空格的
    s = s.strip('\n')
    s = s.strip(' ')
    x = s.split(' ')
    # 初始化字典
    for i in range(1, len(x)):  # 从1开始是要跳过NO.
        if x[i] == 'play':
            dict_PlusFeatures[x[i]] = 0
            dict_NegativeFeatures[x[i]] = 0
            sum_Features[x[i]] = 0
        elif x[i] != '':
            dict_PlusFeatures[x[i]] = {}
            dict_NegativeFeatures[x[i]] = {}
            sum_Features[x[i]] = {}

    ls = [i for i in dict_PlusFeatures.keys()]  # 提取字典中的特征名称
    ls.pop(len(ls) - 1)  # 去掉play
    # s=set()不能kidls=[s for i in range(len(ls))],这样列表中的一个集合改变,其他的也会改变
    # kidls = [set() for i in range(len(ls))]  # 保存每个特征的属性值,使用没有重复元素的集合set

    flag = 0  # 用于标记是正例还是反例
    index = 0  # 用于指向 保存所有读入数据的predata 的下标
    for i in range(lk):
        cnt = 0
        s = f.readline()  # 读入属性
        s = s.strip('\n')
        s = s.strip(' ')
        x = s.split(' ')
        if x[len(x) - 1] == 'no':  # 首先处理是正例还是反例,同时统计正反例个数
            flag = -1
            dict_NegativeFeatures['play'] += 1
        elif x[len(x) - 1] == 'yes':
            flag = 1
            dict_PlusFeatures['play'] += 1
        sum_Features['play'] += 1
        for j in range(2, len(x) - 1):  # 跳过编号以及最后的正反例
            if x[j] != '':
                if flag == 1:
                    if x[j] not in dict_PlusFeatures[ls[cnt]].keys():
                        dict_PlusFeatures[ls[cnt]][x[j]] = 1
                    else:
                        dict_PlusFeatures[ls[cnt]][x[j]] += 1
                elif flag == -1:
                    if x[j] not in dict_NegativeFeatures[ls[cnt]].keys():
                        dict_NegativeFeatures[ls[cnt]][x[j]] = 1
                    else:
                        dict_NegativeFeatures[ls[cnt]][x[j]] += 1

                if x[j] not in sum_Features[ls[cnt]].keys():
                    sum_Features[ls[cnt]][x[j]] = 1
                else:
                    sum_Features[ls[cnt]][x[j]] += 1

                # kidls[cnt].add(x[j])
                preData[index].append(x[j])
                cnt += 1
        preData[index].append(x[len(x) - 1])
        index += 1

    for i in dict_PlusFeatures.keys():
        if i != 'play':
            for j in dict_PlusFeatures[i].keys():
                if j not in dict_NegativeFeatures[i].keys():
                    dict_NegativeFeatures[i][j] = 0

    for i in dict_NegativeFeatures.keys():
        if i != 'play':
            for j in dict_NegativeFeatures[i].keys():
                if j not in dict_PlusFeatures[i].keys():
                    dict_PlusFeatures[i][j] = 0

    preData.insert(0, ls)  # 在split中发现需要表头
    preData[0].append('play')
    return dict_PlusFeatures, dict_NegativeFeatures, sum_Features, preData


def method(dict_PlusFeatures, dict_NegativeFeatures, sum_Features, preData):
    dict_PlusFeatures['play'] = dict_PlusFeatures['play'] / sum_Features['play']
    dict_NegativeFeatures['play'] = dict_NegativeFeatures['play'] / sum_Features['play']
    for i in dict_PlusFeatures:
        if i != 'play':
            for j in dict_PlusFeatures[i]:
                dict_PlusFeatures[i][j] = (dict_PlusFeatures[i][j] + 1) / (
                            dict_PlusFeatures['play'] + len(dict_PlusFeatures[i]))
    for i in dict_NegativeFeatures:
        if i != 'play':
            for j in dict_NegativeFeatures[i]:
                dict_NegativeFeatures[i][j] = (dict_NegativeFeatures[i][j] + 1) / (
                            dict_NegativeFeatures['play'] + len(dict_NegativeFeatures[i]))

    for i in range(1, len(preData)):
        ls = [dict_PlusFeatures['play'], dict_NegativeFeatures['play']]
        for j in range(len(preData[0]) - 1):
            ls[0] *= dict_PlusFeatures[preData[0][j]][preData[i][j]]
            ls[1] *= dict_NegativeFeatures[preData[0][j]][preData[i][j]]
        key = ls.index(max(ls))
        if key == 0 and preData[i][-1] == 'yes':
            print("数据{}预测正确".format(i))
        elif key == 1 and preData[i][-1] == 'no':
            print("数据{}预测正确".format(i))
        else:
            print("数据{}预测错误".format(i))


if __name__ == '__main__':
    dict_PlusFeatures, dict_NegativeFeatures, sum_Features, preData = readFile()
    method(dict_PlusFeatures, dict_NegativeFeatures, sum_Features, preData)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/565289.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【lager】日志系统1:允许多个日志源向多个最终用户进行日志记录 windows cmake构建

【xerces】xerces-c-3.2.4 版本的cmake windows vs2022 构建 lager Light-weight Accumulator Gathering Efficiently in Real-time lagerLAGER(实时高效收集的轻量级累加器)是一个可靠的日志系统,旨在允许多个日志源向多个最终用户进行日志记录。该设计文档概述了整个系统的…

Android---APK 瘦身

在 APP 开发过程中,随着业务迭代,apk 体积逐渐变大。项目中累积的无用资源,未压缩的图片资源等,都为 apk 带来了不必要的体积增加。而 APK 的大小会影响应用加载速度、使用的内存量以及消耗的电量。 APK 结构 APK 文件由一个 Zip…

浅析Koa2中控制器

控制器 什么是控制器 拿到路由分配的任务,并执行 路由的功能是根据不同的 url, 来分配不同的任务。 控制器是拿到路由分配的任务并执行,是注册在路由中的中间件。 所以在 koa 中, 控制器也是一个中间件。 为什么要使用控制器 获取HTTP请求参数处理…

article-码垛机器人admas仿真

按照运动学仿真的类似步骤为机器人添加材料、运动副和关节驱动,给机器人手腕末端施加50N最大负载,仿真模型如图5-17。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AXYQVZPq-1684936426972)(data:image/svgxml;utf8, )] 图…

OpenGL之纹理

文章目录 什么是纹理加载与创建纹理stb_image.h加载并生成纹理 纹理环绕方式纹理过滤多级渐远纹理 纹理单元 什么是纹理 我们已经了解到,我们可以为每个顶点添加颜色来增加图形的细节,从而创建出有趣的图像。但是,如果想让图形看起来更真实&a…

unity制作一款塔防游戏

文章目录 介绍寻路系统怪物生成器制作3种初级炮台、3种升级炮台设置炮台属性选择炮台,添加监听事件炮弹追踪攻击敌人拖动鼠标实现相机视角转换鼠标光标放在cube上变色文字动画 介绍 关键技术: 寻路系统 生成怪物算法 粒子系统 line renderer制作追踪射线…

python基本操作1(速通版)

目录 一、input输入函数 二、格式化字符输出 三、函数的基本操作 1.return返回值的问题 2.参数传递 四、运算符 1.关系比较符 2.逻辑运算符 五、if语句 六、随机数 七、循环 1.while语句的基本应用 2.break语句 2.continue语句 3.猜拳游戏 4.三目运算符 6.for…

让input框只输入英文

解决扫码枪在中文输入法时扫码冲突 扫码枪在扫完码时会自动回车,这时如果是中文输入法就会触发输入法联想,再加一个回车,那么input框输入的就成中文了。如果可以控制input框只能输入英文那就好了。css有一个属性(ime-mode&#xf…

ChatGpt论文指令,很全!

ChatGPT狂飙160天,世界已经不是之前的样子。 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 ChatGPT的能力大家肯定都听说过,很多学生应该都亲身体验过。它在自然语言处理方面的出色 除了写代码 写论文也是超…

【计算思维题】少儿编程 蓝桥杯青少组计算思维真题及详细解析第4套

少儿编程 蓝桥杯青少组计算思维真题及详细解析第4套 1、下面哪个图形与其它图形不同 A、 B、 C、 D、 答案:D 考点分析:主要考查小朋友们的观察能力,从给定的图中可以看到前三个选项都是90度直角,最后一个是锐角,所以答案D 2、下列哪个选项是由下图旋转得到的

位运算【算法基础】

目录 知识点: 题目: 模板 关于为什么负数要用补码 知识点: 如果想看整数n的二进制表示中的第k位(从0开始)是几? (1)把第k位右移到个位n>>k (2)看x…

大模型时代,「重识」云知声

在山海大模型发布会现场,黄伟有一句话令人印象深刻,“云知声的过去十年,就是为山海而生。 作者| 皮爷 出品|产业家 “谁能做成中国最好的大模型?”在今年3月一个北京投资人的内部分享会上,有人满怀期待地提出这样…

Java SPI 一 之SPI(Service Provider Interface)进阶 AutoService

​ 一、SPI(Service Provider Interface) 1.1 介绍 SPI(Service Provider Interface),是JDK内置的一种 服务提供发现机制(为某个接口寻找服务实现的机制),可以用来启用框架扩展和替换组件,其…

Admin.NET管理系统(c#+vue3)前后端学习笔记

我的学习笔记 - 9iAdmin.NET 欢迎学习交流(一)前端笔记1.1 关于.env的设置1.2 关于路由模式问题1.3 关于 vue.config.ts1.4 关于 打包(pnpm run build)溢出问题1.5 关于 打包(pnpm run build)后部署到IIS重…

article-六轴码垛机器人admas正逆运动学仿真

基座自由度、大臂摆动自由度、小臂摆动自由度、腕部Y轴摆动自由度、腕部Z轴摆动自由度及其腕部末端X轴旋转自由度 其导入过程为: 机器人三维模型总体有6个部分。打开机器人的SolidWork三维模型,依次另存为6个“Parasolid(x_t)”类型的文件。打开ADAMS/…

【MATLAB第36期】基于MATLAB的QOWOA-LSTM鲸鱼优化算法准反向策略的WOA优化LSTM时间序列预测模型 优势明显,注释详细,绘图丰富

【MATLAB第36期】基于MATLAB的QOWOA-LSTM鲸鱼优化算法准反向策略的QOWOA优化LSTM时间序列预测模型,优势明显,注释详细,绘图丰富 一、代码优势 1.使用优化后的QOWOA算法优化LSTM超参数(学习率,隐藏层节点,…

2020下半年上午题

2020下半年 d a b 小阶向大阶对齐 b b 平均cpi: MIPS: d c 公加验,私解签 加密防止被动攻击,认证防止主动攻击 a 访问控制包括:授权,确定存取权限,实施存取权限 c a c a 先申请先得 b b 著作权包括&…

OpenCV使用SURF和SIFT算法报错解决记录

OpenCV使用SURF和SIFT算法报错解决记录 1.报错代码,使用以下两种写法都会报错 # 创建SIFT和SURF特征提取器 # 写法1 sift cv2.xfeatures2d.SIFT_create() surf cv2.xfeatures2d.SURF_create() # 写法2 sift cv2.SIFT_create() surf cv2.SURF_create()第一种报…

架构整洁之道下篇(实现细节)

目录 1.实现细节 1.1.数据库只是实现细节 1.2.Web是实现细节 1.3.应用程序框架是实现细节 1.4.案例分析:视频销售网站 1.5.拾遗 1.5.1.按层封装 1.5.2.按功能封装 1.5.3.端口和适配器 1.5.4.按组件封装 1.5.5.组织形式和封装的区别 2.总结 1.实现细节 …

13_Uboot移植

目录 查找NXP官方的开发板默认配置文件 编译NXP官方开发板对应的uboot 烧写验证与驱动测试 SD卡和EMMC驱动检查 LCD驱动检查 网络驱动 在U-Boot中添加自己的开发板 添加开发板默认配置文件 添加开发板对应的头文件 添加开发板对应的板级文件夹 修改mx6ull_alientek_…