人工智能-实验三

news2024/12/29 8:35:00

第三次实验

一.实验目的

​ 掌握分类算法的算法思想,包括朴素贝叶斯算法,决策树算法等。编写朴素贝叶斯算法进行分类操作。本实验主要是关于朴素贝叶斯算法的实现,在完成本实验时也复习了课程中学习的决策树分类算法的思想。

二.实验原理

1.条件概率与贝叶斯公式

​ 条件概率是指事件A在另外一个事件B已经发生条件下的发生概率,记为P(A|B)。若只有两个事件A和B,则:
P ( A ∣ B ) = P ( A B ) P ( B ) P(A|B) = \frac{P(AB)}{P(B)} P(AB)=P(B)P(AB)
​ 由条件概率公式可得出贝叶斯公式:
P ( A B ) = P ( A ∣ B ) P ( B ) P ( B ∣ A ) = P ( A B ) P ( A ) = P ( A ∣ B ) P ( B ) P ( A ) P(AB) = P(A|B)P(B)\\ P(B|A) = \frac{P(AB)}{P(A)} = \frac{P(A|B)P(B)}{P(A)} P(AB)=P(AB)P(B)P(BA)=P(A)P(AB)=P(A)P(AB)P(B)
​ 贝叶斯公式常用于已知事件发生,求导致事件发生的各种原因的概率。

2.朴素贝叶斯分类算法

​ 朴素贝叶斯分类算法是基于贝叶斯定理和特征条件独立性假设的分类方法。对于给定的训练集,基于特征条件独立性假设学习输入输出的联合概率分布(先验概率和条件概率分布),学习概率分布后,利用贝叶斯定理求出后验概率最大的输出作为预测结果。

​ 模型训练的过程相当于学习P(Ai|B),其中B是特定的类别,Ai是特征。计算该概率时,假设各个特征之间互不影响,每个特征都是条件独立的。这个假设就是条件独立性假设,可以简化朴素贝叶斯方法,但可能牺牲一定的分类准确性。

​ 模型预测的过程就是根据贝叶斯公式求P(B|Ai)的概率,即在有各个特征的条件下,预测输入属于哪一个分类的概率,属于哪一个分类的概率最大,就预测输入样本的类别是哪一类。根据贝叶斯公式,P(B|Ai)被转换为:
P ( B ∣ A i ) = P ( A i ∣ B ) P ( B ) P ( A i ) P(B|Ai) = \frac{P(Ai|B)P(B)}{P(Ai)} P(BAi)=P(Ai)P(AiB)P(B)
​ 由于对于每个类别,计算公式都有分母P(Ai),因此只需要计算分子并比较大小就可以了,按照条件独立性假设,转换为:
P ( B ) P ( A 1 ∣ B ) P ( A 2 ∣ B ) . . P ( A n ∣ B ) P(B)P(A_1|B)P(A_2|B)..P(A_n|B) P(B)P(A1B)P(A2B)..P(AnB)
​ 而P(Ai|B)就是模型训练时计算得到的条件概率。

3.决策树算法

​ 决策树是一个预测模型,树中每个节点表示某个对象,而每个分叉路径则代表某个可能的属性值,而每个叶节点则对应从根节点到该叶节点所经历的路径表示根据属性值进行决策的一个完整过程。

​ 常见的决策树算法有ID3,C4.5,CART算法。在本课程中重点学习的是ID3算法。ID3算法使用信息增益作为属性的选择标准,确定生成每个节点采用的属性。

​ 信息熵用于衡量数据集的纯度,定义为:

在这里插入图片描述

​ 假设A是样本的一个属性,A有v个取值,将训练数据集划分为V份,每个子集有pi个正例和ni个反例,则条件熵计算如下。
H ( D ∣ A ) = ∑ i = 1 v p i + n i p + n H ( [ p i p i + n i , n i p i + n i ] ) H(D|A) = \sum_{i=1}^v\frac{pi+ni}{p+n}H([\frac{pi}{pi+ni},\frac{ni}{pi+ni}]) H(DA)=i=1vp+npi+niH([pi+nipi,pi+nini])
​ 信息增益是指集合D的信息熵与特征A给定条件下的信息条件熵之差:
G a i n ( D , A ) = H ( D ) − H ( D ∣ A ) Gain(D,A) = H(D)-H(D|A) Gain(D,A)=H(D)H(DA)
​ 构建决策树时,希望选择的决策属性能尽可能的起到分类的作用,即要使分类后集合的纯度尽可能高,即H(D|A)越小越好,因此选择信息增益最大的属性作为当前层次的分类决策。完成当前层次的属性选择后,再计算剩余属性的信息增益,重复上述过程,直到所有属性都被选择或所有样本都已经完成分类,就完成了整颗决策树的构建。而分类的只需要从决策树的根节点开始,根据节点的属性选择左右分支,直到到达叶子节点,就得到了分类结果。

三.实验内容

1.朴素贝叶斯算法

​ 假设A表示类别,B,C,D表示三个特征。根据朴素贝叶斯算法的原理,所求概率为:
P ( A ∣ B C D ) = α P ( A ) P ( B ∣ A ) P ( C ∣ A ) P ( D ∣ A ) P(A|BCD)=αP(A)P(B|A)P(C|A)P(D|A) P(ABCD)=αP(A)P(BA)P(CA)P(DA)
训练

​ 约定朴素贝叶斯算法使用的条件概率计算结果存储结构为:

#类别的先验概率
self.label_prob = {类别:概率} 
#每个类别下特征为某个取值的条件概率
self.condition_prob = {}
#内部结构为:类别(好/坏):{特征编号:{特征取值:条件概率}}

​ 计算需要用到的概率,首先计算各个类别在训练样本中出现了多少个,除总样本数得到P(A):

        #计算label_prob
        cnt = 0
        num = 0
        for item in label:
            num+=1
            if item == 1:
                cnt+=1
        self.label_prob[0] = (num-cnt)/num
        self.label_prob[1] = cnt/num

​ 接下来从初始化两个类别下,保存特征取值概率的字典:

		self.condition_prob[0] = {}
        self.condition_prob[1] = {}
        #初始化每个特征取值的字典
        for item in self.condition_prob:
            for feat in range(len(feature[0])): #len(feature[0])为特征数量
                self.condition_prob[item][feat] = {}

​ 遍历所有样本的特征,并进行每个特征取值的计数:

        i=0         #样本编号
        for data in feature:
            j=0     #特征序号
            for feat in data:
                if(self.condition_prob[0][j].get(feat)==None):
                    self.condition_prob[0][j][feat] = 0
                if(self.condition_prob[1][j].get(feat)==None):
                    self.condition_prob[1][j][feat] = 0
                if label[i]==0:
                    self.condition_prob[0][j][feat] += 1
                else:
                    self.condition_prob[1][j][feat] += 1
                j+=1
            i+=1

​ 最后除以每个类别的样本数量,得到条件概率:

        for feat in range(len(feature[0])):
            for item in self.condition_prob[0][feat]:
                self.condition_prob[0][feat][item] /= (num-cnt)
            for item in self.condition_prob[1][feat]:
                self.condition_prob[1][feat][item] /= cnt

预测

​ 预测的过程只需要按照贝叶斯公式进行计算,由于分类只有两种(好/坏),只需要分别计算:
P ( A g o o d ) = α P ( A b a d ) P ( B ∣ A b a d ) P ( C ∣ A b a d ) P ( D ∣ A b a d ) P ( A b a d ) = α P ( A b a d ) P ( B ∣ A b a d ) P ( C ∣ A b a d ) P ( D ∣ A b a d ) P(A_{good}) = αP(A_{bad})P(B|A_{bad})P(C|A_{bad})P(D|A_{bad}) \\ P(A_{bad}) = αP(A_{bad})P(B|A_{bad})P(C|A_{bad})P(D|A_{bad}) P(Agood)=αP(Abad)P(BAbad)P(CAbad)P(DAbad)P(Abad)=αP(Abad)P(BAbad)P(CAbad)P(DAbad)
​ B,C,D的取值是输入样本的特征值,进行预测计算的过程如下:


    def predict(self, feature):
        '''
        对数据进行预测,返回预测结果
        :param feature:测试数据集所有特征组成的ndarray
        :return:
        '''
        res = []
        for item in feature:
            P_good = self.label_prob[1]
            P_bad = self.label_prob[0]
            feat_idx = 0
            for feat in item:
                P_good *= self.condition_prob[1][feat_idx][feat]
                P_bad *= self.condition_prob[0][feat_idx][feat]
                feat_idx+=1
            if P_good>P_bad:
                res.append(1)
            else:
                res.append(0)
        return res

2.拉普拉斯平滑

​ 如果样本不够多,可能存在某些分类不存在特定特征,这样在利用朴素贝叶斯算法进行分类时,如果出现了这个特征,预测就不合理了。如下例:

在这里插入图片描述

​ 坏瓜类别中,没有纹理特征为模糊的样本,则P(模糊|坏瓜)的概率为0,如果预测的样本中出现了纹理特征为模糊,计算出的概率中,是坏瓜的概率就是0。为此要进行平滑处理,最常用的方法是拉普拉斯平滑。

​ 拉普拉斯平滑指的是,假设N表示训练数据集总共有多少种类别,Ni表示训练数据集中第i列总共有多少种取值。则训练过程中在算类别的概率时分子加1,分母加N,算条件概率时分子加1,分母加Ni。

​ 即P(Ai)修正为:
P ( A i ) = 类别为 A i 的样本数 + 1 样本数 + N P(Ai) = \frac{类别为Ai的样本数+1}{样本数+N} P(Ai)=样本数+N类别为Ai的样本数+1
​ 而P(Bj|Ai)修正为:
P ( B j ∣ A i ) = 类别是 A i 的且特征 B 为 B j 的样本数量 + 1 类别是 A i 的样本数 + N i ( 特征 B 的取值种类数 ) P(Bj|Ai) = \frac{类别是Ai的且特征B为Bj的样本数量+1}{类别是Ai的样本数+Ni(特征B的取值种类数)} P(BjAi)=类别是Ai的样本数+Ni(特征B的取值种类数)类别是Ai的且特征BBj的样本数量+1
​ 修正后的概率和条件概率不会为0,避免了上述不合理的情况。

​ 根据拉普拉斯平滑原理,计算类别概率的过程修改为:

        cnt = 0
        num = 0
        for item in label:
            num+=1
            if item == 1:
                cnt+=1
        types = 2	#类别数
        self.label_prob[0] = (num-cnt)+1/(num+types)
        self.label_prob[1] = cnt+1/(num+types)

​ 存储条件概率的字典初始化不需要修改,仍为:

        self.condition_prob[0] = {}
        self.condition_prob[1] = {}
        #初始化每个特征取值的字典
        for item in self.condition_prob:
            for feat in range(len(feature[0])):
                self.condition_prob[item][feat] = {}

​ 计算条件概率时,调整分子和分母,实现拉普拉斯平滑:

        #记录每个特征的取值
        i=0         #样本编号
        for data in feature:
            j=0     #特征序号
            for feat in data:
                if(self.condition_prob[0][j].get(feat)==None):
                    self.condition_prob[0][j][feat] = 1     #分子加一,初始化为1
                if(self.condition_prob[1][j].get(feat)==None):
                    self.condition_prob[1][j][feat] = 1     #分子加一,初始化为1
                if label[i]==0:
                    self.condition_prob[0][j][feat] += 1
                else:
                    self.condition_prob[1][j][feat] += 1
                j+=1
            i+=1
        #计算条件概率,每个特征取值 除 label为0和1的个数+特征的取值种类数
        for feat in range(len(feature[0])):
            for item in self.condition_prob[0][feat]:
                self.condition_prob[0][feat][item] /= (num-cnt)+len(self.condition_prob[0][feat])
            for item in self.condition_prob[1][feat]:
                self.condition_prob[1][feat][item] /= cnt+len(self.condition_prob[1][feat])

​ 预测的过程不变,仍按照贝叶斯公式计算,取在给定特征下,属于特定类别的概率最大的类别作为分类结果。

3.实验结果

​ 在没有拉普拉斯平滑的情况下,对给定数据预测准确率高于0.8。进行拉普拉斯平滑处理后,对给定数据预测准确率高于0.9。

4.思考题

​ 朴素贝叶斯算法实现比较简单,没有参数,但是条件独立性假设可能牺牲预测的准确性。

​ 决策树算法(ID3)没有剪枝策略,信息增益策略可能对取值数多的特征有所偏好(更能降低熵值),而类似编号的特征会使信息增益接近于1.并且只能处理离散分布的特征。在ID3的基础上,C4.5算法使用信息增益率作为分类属性的选择标准,避免了ID3对特征数目的偏重。并且引入了剪枝策略进行剪枝,将连续特征进行离散化(取相邻两样本的平均值作为划分点,计算各个划分点作为分类点时的信息增益)

​ 对于支持向量机算法和人工神经网络等算法可以通过增加迭代次数或减小学习率来提高模型训练的效果,提高性能。

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

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

相关文章

武汉涉密系统集成资质申报的重点和难点浅析

企业想要申报涉密系统集成资质,首先要确定好申请的级别:涉密系统集成资质分甲级和乙级两个级别,这个一个是看公司体量,另外一个是看公司以后所承接的项目密级级别。级别确定好后还要确定申请哪个类别,涉密系统集成资质…

项目管理专业人员能力评价等级证书(CSPM)的级别介绍

2021年10月,中共中央、国务院发布的《国家标准化发展纲要》明确提出构建多层次从业人员培养培训体系,开展专业人才培养培训和国家质量基础设施综合教育。建立健全人才的职业能力评价和激励机制。由中国标准化协会(CAS)组织开展的项…

使用Go和Gin编写RESTFul API

使用Go和Gin开发RESTFul API 对应的代码仓库地址:gocode 本篇内容介绍如何使用Go和 Gin Web Framework来编写RESTFul API 服务的基础知识。如果你还对Go的基础操作不熟悉的话最好还是先看一下: 入门教程 Gin是一个Go语言的Web开发框架,它简化了构建Web应…

如何实现企业微信扫码登录?

开发内容:实现网页企业微信扫码登录 企业微信提供了OAuth的授权登录方式,可以让从企业微信终端打开的网页获取成员的身份信息,从而免去登录的环节。 企业应用中的URL链接(包括自定义菜单或者消息中的链接)&#xff0c…

新手git使用记录

文章目录 前言一、下载安装git二、使用git1.基本概念2.git初始化设置3.基本操作3.1、拉取远程仓库代码,修改后在提交3.2、新建分支,提交 总结 前言 几年前在学校还学了git怎么使用,毕业后公司用tfs,这东西真的拉,感觉…

将Apple Vision Pro和visionOS与计算机视觉结合使用

在2023年6月5日的WWDC大会上,苹果宣布推出多年来最大规模的硬件和软件组合产品。今年的“One more thing”(“还有一件事”)发布是苹果视觉专业版(Apple Vision Pro),这是一款集成了苹果生态系统的新型空间…

mybatis多数据源的SQL兼容

背景 最近公司要求支持国产数据库达梦,但达梦与PostgreSQL的语法有一些差异,需要做一些兼容操作。 操作步骤 本文采用dynamic-datasource-spring-boot-starter框架处理多数据源,多数据源配置如下spring:datasource:dynamic:primary: dm #设…

华为OD机试真题B卷 Java 实现【进制转换】,附详细解题思路

一、题目描述 写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。 二、输入描述 输入一个十六进制的数值字符串。 三、输出描述 输出该数值的十进制字符串。不同组的测试用例用\n隔开。 四、解题思路 读取输入的十六进制数值字符串&…

Selenium Python教程第2章

2. Selenium 编程入门 2.1 简单用例 如果你已经安装好了selenium,你可以把下面的python代码拷贝到你的编辑器中 from selenium import webdriver from selenium.webdriver.common.keys import Keysdriver webdriver.Firefox() driver.get("http://www.pytho…

AUTOSAR DoIP介绍

DoIP是什么 DoIP全称是Diagnostic Over IP,顾名思义就是基于IP的诊断,即下图所关联的ISO13400规范,也就是说如果大家想了解DoIP可以详细阅读ISO13400。 根据下图(来自于ISO14229-1),我们可以得到以下两点关系: UDS协议(规范是ISO14229)是统一诊断服务,作为应用层协议…

浏览器相关前端开发事项

文章目录 存储浏览器持久化存储(F12->应用->存储)浏览器缓存(F12->内存)浏览器存储管理单位(域名/IP为单位)区别localStorage VS 浏览器缓存localStorage VS cookies 存储 浏览器持久化存储&…

机器视觉陶瓷板表面划痕丝印检测方法

随着陶瓷制品在建筑、电子、医疗等领域的应用越来越广泛,对陶瓷制品的质量要求也越来越高。而陶瓷制品表面的划痕和丝印等缺陷会降低产品的美观度和质量,甚至会影响产品的安全性和使用寿命。传统的陶瓷板检测方式主要依赖人工目视检测,效率低…

FL Stuido21中文版水果编曲软件下载

FL stuido水果编曲软件做舞曲以及电子乐的利器,即便是在IPAD或者电脑端上操作,都非常的简便。界面逻辑非常友好,做rnb也是很可以的东西。可以作半成品的内容,声音采样方面还行,同样需要接口卡支持。钢琴卷帘操作还算便…

华为OD机试真题 Java 实现【字符串序列判定】【2022Q4 100分】,附详细解题思路

一、题目描述 输入两个字符串a和b&#xff0c;都只包含英文小写字母。a长度<100&#xff0c;b长度<500,000。 判定a是否是b的有效子串。 判定规则&#xff1a; a中的每个字符在b中都能找到&#xff08;可以不连续&#xff09;&#xff0c;且a在b中字符的前后顺序与a中…

FTL潜规则:调优,才是算法精华

前言 在存储领域中有一个FTL的概念&#xff0c;这是一种Flash的内存管理算法&#xff0c;属于各个厂商的核心机密&#xff0c;每个厂商的处理方式不同&#xff0c;有的处理简单&#xff0c;有的处理复杂。 FTL&#xff0c;即Flash Translations layer&#xff0c;也就是闪存转…

wayland浅析之EGL、Opengles、GBM

本文针对不同的compositor&#xff0c;浅析eglopenglesgbm搭配使用情况&#xff1b; 文章目录 1. 前言1.1 问题一&#xff1a;是不是调用eglSwapBuffers函数以后图像就直接显示到屏幕上了&#xff1f;1.2 问题二&#xff1a;EGL基本使用流程&#xff0c;EGL搭配GBM上屏显示基本…

JavaSE06_面向对象之封装

JavaSE-06 [面向对象OOP 封装] 第一章 面向对象思想 1.1 面向过程和面向对象 面向过程&#xff1a; 面向过程就是分析出解决问题所需要的步骤&#xff0c;然后用函数把这些步骤一步一步实现&#xff0c;使用的时候一个一个依次调用就可以了面向对象&#xff1a; 面向对象是…

Servlet、JSP

一、web服务器 1.1 常用服务器产品 Tomcat&#xff08;Apache开源&#xff0c;主流的web服务器之一&#xff0c;多用于javaweb项目开发&#xff09; jetty&#xff08;效率高于Tomcat&#xff09; WebLogic&#xff08;Oracl 收费&#xff09; WebSpera&#xff08;IBM&#xf…

cesium学习之旅1:cesium 基本介绍以及 cesium 的 hello world 程序

一&#xff1a;什么是Cesium Cesium 是一个跨平台、跨浏览器的展示三维地球和地图的 javascript 库。Cesium 使用WebGL 来进行硬件加速图形&#xff0c;使用时不需要任何插件支持&#xff0c;但是浏览器必须支持WebGL。Cesium是基于Apache2.0 许可的开源程序。它可以免费的用于…

代码随想录二刷 day16 | 二叉树之104.二叉树的最大深度 559.n叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数

day16 104.二叉树的最大深度559.n叉树的最大深度111.二叉树的最小深度222.完全二叉树的节点个数 104.二叉树的最大深度 题目链接 解题思路&#xff1a;本题中根节点的高度就是最大深度 二叉树节点的深度&#xff1a; 指从根节点到该节点的最长简单路径边的条数或者节点数&…