【机器学习】周志华西瓜书第七章贝叶斯分类器习题--实现AODE分类器,以西瓜数据集3.0为训练集,对“测1”进行判别。

2023-05-16

from numpy import *
import numpy as np
import pandas as pd

#读取文件格式为xlsx的数据
def dataLoad(filename):
	df = pd.read_excel(fliename, header = None) #这里为获取属性列表将header设置成None
	propLabelSet = df.values[0:1, 1:-1] #属性列表
	dataSet = df.values[1:,1:-1] #样本数据
	labelSet = df.values[1:,-1:] #样本分类结果数据
	return propLabelSet, dataSet, labelSet

# #计算训练样本加上预测样本后,每个属性类别的个数,并保存在一个列表中用于在函数trainNB()中进行拉普拉斯修正
def getPropNum(TTdataSet):
	n = shape(TTdataSet)[1]
	newPropNum = zeros(n)
	for i in range(n):
		propCate = list(set(TTdataSet[:,i]))
		newPropNum[i] = len(propCate)
	return (newPropNum)

#训练朴素贝叶斯,将每个属性标签的后验概率并存储在模型字典里,对测试样本分类时可直接调用
def trainNB(propLabelSet, trainSet, allLabelSet, numDataProp, TTdataSet):
	numTrain, numProp = shape(trainSet)
	prob_c_xi = {}
	D_c_xi = {}
	prob_xj_c_xi = {}
	D_xj_c_xi = {}
	tempCate = allLabelSet.flatten() 
	labelSet = list(set(tempCate))
	for i in range(numProp):
		if type(trainSet[0][i]).__name__ == 'str':
			Ni = numDataProp[i]
			D_c_i_j = {}
			prob_j_c_i = {}
			prop_i_set = list(set(TTdataSet[:,i]))
			#求prob_c_xi的字典,其格式为{'是':{i属性:{j属性类别1:概率, i属性类别2:概率},...},'否':...},三层字典
			#求P(xj|c, xi)的字典,格式为 {i属性:{i属性类别1:{'是':{j属性:{j属性类别1:概率, j属性类别2:概率},...},...},...},...},五层字典
			for itemI in prop_i_set:
				D_c_ij = {}
				prob_c_ij = {}
				for catetem in labelSet:
					D_c_xjj = {}
					prob_c_xjj = {}
					D_c_xii = {}
					prob_c_xii = {}
					for j in range(numProp):
						if type(trainSet[0][j]).__name__ != 'str': continue
						else:
							Ni = numDataProp[j]
							D_cjj = {}
							prob_cjj = {}
							D_cii = {}
							prob_cii = {}
							prop_j_set = list(set(TTdataSet[:,j]))
							for itemJ in prop_j_set:
								numcount = 0								
								numcountj = 0								
								numcountcij = 0
								for n in range(numTrain):
									if (allLabelSet[n] == catetem) and (trainSet[n, j] == itemJ): numcount += 1
									if (allLabelSet[n] == catetem) and (trainSet[n, j] == itemJ) and (j != i): numcountj += 1  #本属性不能作为本属性的超父
									if (allLabelSet[n] == catetem) and (trainSet[n, j] == itemJ) and (trainSet[n, i] == itemI) and (j != i): numcountcij += 1#本属性不能作为本属性的超父

								D_cjj[itemJ] = numcount #累计个数字典
								prob_cjj[itemJ] = (numcount+1)/(numTrain+Ni*len(labelSet)) #计算概率

								D_cii[itemJ] = numcountcij
								prob_cii[itemJ] = float((numcountcij+1)/(numcountj  + Ni))

							D_c_xjj[propLabelSet[0][j]] = D_cjj
							prob_c_xjj[propLabelSet[0][j]] = prob_cjj

							D_c_xii[propLabelSet[0][j]] = D_cii
							prob_c_xii[propLabelSet[0][j]] = prob_cii	

					D_c_xi[catetem] = D_c_xjj
					prob_c_xi[catetem] = prob_c_xjj

					D_c_ij[catetem] = D_c_xii
					prob_c_ij[catetem] = prob_c_xii

				D_c_i_j[itemI] = D_c_ij
				prob_j_c_i[itemI] = prob_c_ij
			D_xj_c_xi[propLabelSet[0][i]] = D_c_i_j
			prob_xj_c_xi[propLabelSet[0][i]] = prob_j_c_i

		#对连续性属性,用的是朴素贝叶斯对连续型属性的处理方式
		else:   
			Y_and_N = {}  #存储每个属性下已知好、坏瓜后此属性的均值或方差的大小
			for result in labelSet:
				exp_and_varroot = {}
				countAll = tempCate.tolist().count(result)
				expec = float(sum([trainSet[k,i] for k in range(numTrain) if allLabelSet[k] == result]))/countAll #求均值
				exp_and_varroot['均值'] = expec
				var = float(sum([float((trainSet[k,i]-expec))**2 for k in range(numTrain) if labelData[k] == result])/countAll) #求方差
				var_root = sqrt(var) #求标准差
				exp_and_varroot['标准差'] = var_root
				Y_and_N[result] = exp_and_varroot
			prob_xj_c_xi[propLabelSet[0][i]] = Y_and_N	

	return prob_c_xi, D_c_xi, prob_xj_c_xi, D_xj_c_xi #最后得到概率和个数的字典

#计算连续型属性的概率
def calContinuiousProb(data, expec, varroot):
	return float((1/(sqrt(2*pi)*varroot))*exp(-(data - expec)**2/(2*varroot**2)))

#对测试数据进行预测
#计算样本分别是好瓜和坏瓜的概率,对每个样本先固定一个属性i,其对应的值为xi,求此时xi下 “P(c,xi)*(分类为好瓜或者坏瓜的情况下每一个j(j!=i)属性下样本属性类别取值为xj的概率的乘积” 的值,遍历样本所有属性i,并求和
def testDataPredict(trainSet, testSet, Proba_xj_c_xi, Proba_c_xi, propLabel, numDataPro, allLabelSet):
	m, n = shape(testSet)
	for k in range(m): #遍历每个测试样本
		p_c_x = {} #为每个样本创建一个字典,用来存储此样本为好瓜、坏瓜的概率 
		tempCate = allLabelSet.flatten() 
		labelSet = list(set(tempCate))
		for itemYorN in labelSet:
			for i in range(n):
				if type(testSet[0][i]).__name__ == 'str':
					count_c_xi = 0.0
					
					count_xj_c_xi = 1.0
					for j in range(n):
						if type(testSet[0][j]).__name__ != 'str' or i == j: continue
						else:
							count_xj_c_xi *= Proba_xj_c_xi[propLabel[0][i]][testSet[k][i]][itemYorN][propLabel[0][j]][testSet[k][j]]
					count_c_xi += Proba_c_xi[itemYorN][propLabel[0][i]][testSet[k][i]] * count_xj_c_xi
				elif type(testSet[0][i]).__name__ != 'str': 
					continue #因为书中未介绍AODE分类器对连续性数据的处理,这里只能跳过
					# count_c_xi +=  calContinuiousProb(testSet[k][i], Proba_xj_c_xi[propLabel[0][i]][itemYorN]['均值'], Proba_xj_c_xi[propLabel[0][i]][itemYorN]['标准差'])

			p_c_x[itemYorN] = count_c_xi

		print(p_c_x)
		if p_c_x['是'] >p_c_x['否']:
			print('测试样本%d是好瓜' %(k))
		else:
			print('测试样本%d是坏瓜' %(k))

if __name__=="__main__": 
	fliename = 'watermelon_4.3.xlsx'
	propLabel, trainData, labelData = dataLoad(fliename)
	df = pd.read_excel('watermelon_4.3.xlsx')
	testData = df.values[:,1:-1]
	TTdata = np.concatenate((trainData,testData))
	numPropData = getPropNum(TTdata)
	dictProb_c_xi, dictD_c_xi, dictProb_xj_c_xi, dictD_xj_c_xi = trainNB(propLabel, trainData, labelData, numPropData, TTdata)
	testDataPredict(trainData, testData, dictProb_xj_c_xi, dictProb_c_xi, propLabel, numPropData, labelData)

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【机器学习】周志华西瓜书第七章贝叶斯分类器习题--实现AODE分类器,以西瓜数据集3.0为训练集,对“测1”进行判别。 的相关文章

  • Java常用类的使用方法小结

    文章目录 前言一 常用类有哪些 xff1f 二 常用类使用方法1 Object类0 xff09 所用的对象1 xff09 getClass方法2 xff09 hasCode方法3 xff09 toString方法4 xff09 equals
  • Java I/O流

    文章目录 前言一 什么是流 xff1f 二 流的分类1 根据流向来分1 xff09 输入流2 xff09 输出流 2 根据单位来分1 xff09 字节流2 xff09 字符流 3 根据功能来分1 xff09 节点流2 xff09 过滤流 三
  • Java 网络编程

    文章目录 前言一 什么是计算机网络 xff1f 二 网络通信的两个重要因素1 通讯双方的地址1 xff09 ip2 xff09 端口号 2 规则 xff1a 网络协议 三 Ip地址1 InetAddress2 Ip的分类1 xff09 ip
  • ScrumMaster的教练职责

    ScrumMaster是Scrum团队的敏捷教练 Ken Rubin说 xff0c 类似于运动团队的教练 xff0c ScrumMaster观察团队使用Scrum的过程 xff0c 帮助团队提高工作绩效 教练不是顾问 xff0c 不提供解决
  • Java多线程

    文章目录 前言一 多线程1 进程 xff0c 线程 xff0c 多线程2 继承Thread类1 xff09 同时下载多个网图通过继承Thread类 3 实现Runnable接口1 xff09 下载多个网图通过实现Runnable接口2 xf
  • MySQL数据库随笔

    提示 xff1a 本文章仅供个人学习使用 xff0c 如有错误请及时私信通知 文章目录 前言一 MySQL的基本操作命令 xff08 1 xff09 连接数据库 xff08 2 xff09 修改用户密码 xff08 3 xff09 刷新权限
  • mybiatis学习笔记

    mybiatis学习笔记参考于尚硅谷mybatis文档 96 提示 xff1a 这如果有错误的地方 xff0c 请联系博主已更正 xff0c 文章目录 mybiatis学习笔记参考于尚硅谷mybatis文档前言一 Mybatits的特性二
  • KVM 介绍及安装

    KVM 安装 KVM KVM 简介 KVM 全称是 Kernel based Virtual Machine 是 Linux 下 x86 硬件平台上的全功能虚拟化解决方案 xff0c 包含一个可加载的内核模块 kvm ko 提供和虚拟化核心
  • 接口(interface)

    目录 一 简介 二 接口的使用 使用interface来定义 在Java中 xff0c 接口和类是两个并列的结构 如何定义接口 xff1a 定义接口中的成员 JDK7以及以前 xff1a 只能定义全局常量和抽象方法 JDK8中 xff1a
  • FileReader && FileWriter && FileInputStream && FileOutputStream

    目录 一 读入数据的基本操作 将day09下的hello txt文件内容读入程序中 xff0c 并输出到控制台 1 步骤 xff1a 2 完整代码 3 异常的处理 xff1a 为了保证流资源一定可以执行关闭操作 xff0c 需要使用try
  • 多表的查询

    目录 一 为什么需要多表查询 xff1f x1f41f 查询一个员工名为 Abel 的人在哪个城市工作 xff1f 二 如何实现多表查询 1 出现笛卡尔积 xff08 交叉连接 xff09 的错误 错误的实现方式 错误的原因 2 多表查询的
  • MySQL数据类型

    目录 一 MySQL中的数据类型 常见数据类型的属性 关于属性 1 创建数据库时指明字符集 2 创建表的时候 xff0c 指明表的字符集 3 创建表 xff0c 指明表中的字段时 xff0c 可以指定字段的字符集 二 整数类型 xff08
  • 批量插入

    目录 一 批量插入数据 JDBC的批量处理语句的方法 二 高效的批量插入 1 举例 xff1a 向goods表中插入20000条数据 goods表的创建 方式一 xff1a 使用Statement 方式二 xff1a 使用PreparedS
  • Gateway新一代网关

    目录 一 概述 1 官网 2 介绍 3 作用 4 微服务架构中网关的位置 5 有Zuul了怎么又出来了gateway 我们为什么选择Gateway xff1f Zuul1 x模型 x1f41f Servlet的生命周期 gateway模型
  • android tensorflow文字识别身份证识别ocr文字识别商用源码

    一 xff0c 文字识别简介 计算机文字识别 xff0c 俗称光学字符识别 xff0c 英文全称是Optical Character Recognition 简称OCR xff0c 它是利用光学技术和计算机技术把印在或写在纸上的文字读取出来
  • idea报错:无法访问org.springframework.web.bind.annotation.RestController和程序包com.sun.org.slf4j.internal不存在

    目录 1 错误具体信息 报错日志 2 原因 3 修改过程 4 程序包com sun org slf4j internal不存在 o 解决 1 错误具体信息 报错日志 INFO INFO maven compiler plugin 3 10
  • Java基础 —— 编程入门

    一 比特 bit 和字节 byte 一个0或者一个1存储为一个比特 bit xff0c 是计算机中最小的存储单位 计算机中是最基本的存储单元是字节 byte 每个字节由8个比特构成 计算机就是一系列的电路开关 每个开关存在两种状态 关 of
  • JDK、JRE、JVM的关系

    参考文章 xff1a 面试官 xff1a JDK JRE JVM 三者什么关系 xff1f 腾讯云开发者社区 腾讯云 tencent com 一 什么是JDK JDK xff1a Java Development Kit的简称 xff0c
  • 问题解决:Mybatis-Plus自增主键超级大!

    1 先瞅瞅是不是自增主键没加注解 xff1f xff08 加了哇 xff0c 没问题哇 xff0c 怎么还那么大呢 xff09 2 奥对 xff0c 看看是不是包导错了 似乎也没问题 再添几条数据试试 xff0c id越来越大 突然想到 x
  • FTP匿名登录

    介绍 从一个服务到另一个服务的目标 凭据可能会丢失在可公开访问的文件夹中的某个位置 xff0c 这将允许我们通过一个远程shell登录 xff0c 该shell不受监控 配置错误的服务可能会泄露信息 xff0c 使我们能够模拟受害者的数字身

随机推荐

  • Unable to start ServletWebServerApplicationContext due to missing ServletWeb解决办法

    当在springboot启动项目的时候报这种错误 xff1a 仔细一看 xff0c 报错原因是因为缺少ServletWebServerFactory的bean 既然是跟Servlet有关 xff0c 那么很可能是在web层面出现了问题 那么
  • 数据库锁概述

    行锁和表锁 主要是针对锁粒度划分的 xff0c 一般分为行锁 表锁 库锁 行锁 xff1a 访问数据库的时候 xff0c 锁定整个行数据 xff0c 防止并发错误 表锁 xff1a 访问数据库的时候 xff0c 锁定整个表数据 xff0c
  • Spring 常用注解

    Spring 常用注解 64 Component xff08 任何层 xff09 64 Controller 64 Service 64 Repository xff08 dao xff09 xff1a 用于实例化对象 64 Autowir
  • MyBatis 传递多个参数的4种方式

    MyBatis 传递多个参数的4种方式 方式1 xff1a 顺序传参 xff08 不推荐 xff09 span class token class name Employee span span class token function s
  • Java中String类的常用方法

    文章目录 Java 中 String 类的常用方法一 String 类的概念二 常用的构造方法三 常用方法1 toString 2 length 3 getBytes 4 toCharArray 5 charAt int index 6 i
  • ASR项目实战-数据

    使用机器学习方法来训练模型 xff0c 使用训练得到的模型来预测语音数据 xff0c 进而得到识别的结果文本 xff0c 这是实现语音识别产品的一般思路 本文着重介绍通用语音识别产品对于数据的诉求 对数据的要求 训练集 相关要求 xff0c
  • 如何写一棵简单的二叉查找树

    二叉查找树 完整代码 xff1a https github com problemin Algorithm blob master src Tree BSTree java 二叉排序树 xff08 Binary Sort Tree xff0
  • Redis常见的数据类型命令

    文章目录 Redis 常见的数据类型及命令一 常见的NoSQL二 Redis 简介三 key 键的一些操作命令四 Redis的五种基本数据结构1 String xff08 字符串 xff09 介绍常用命令1 1 set get1 2 app
  • Redis 的主从复制机制

    文章目录 Redis 的主从复制机制主从复制概述主从复制的作用主从复制环境的搭建主从复制的原理 哨兵模式概述哨兵模式的作用哨兵模式环境的搭建哨兵模式的原理 Cluster 模式 Redis 的主从复制机制 主从复制 概述 主从复制 xff0
  • Nginx 详解

    文章目录 Nginx 详解一 简介二 四大应用场景1 HTTP 服务器2 反向代理3 负载均衡4 动静分离 三 Linux 环境下安装Nginx四 Nginx 服务常用命令五 Nginx 配置文件1 全局块1 1 user1 2 worke
  • RabbitMQ 详解

    文章目录 RabbitMQ 详解一 MQ 简介1 MQ优缺点2 MQ应用场景3 AMQP 和 JMS4 常见的 MQ 产品 二 RabbitMQ 工作原理三 Linux环境安装RabbitMQ1 安装 Erlang2 安装 RabbitMQ
  • AndroidStudio卸载删除干净

    文章目录 前言一 卸载AndroidStudio程序二 删除目录 android三 xff0c 删除AndroidStudio xff0c Sdk目录在这里插入图片描述 这样文件目录就删除干净了 xff0c 接下来的教程是将配置删除 xff
  • 视图绑定ActivityMainBinding

    使用视图绑定 xff0c 可以更轻松的写与视图交互的代码 在模块中启动视图绑定之后 xff0c 系统会为每个模块中的每个XML布局文件生成一个绑定类 绑定类的实例包含对在相应布局中具有ID的所有视图的直接引用 可以代替findViewByI
  • 【FTP服务搭建】使用windows虚拟机搭建ftp服务,并能够使用ftp进行传输文件的操作

    参考了两位大佬写的教程 xff0c 自己实践了一下 xff0c 整理了一下操作步骤 使用机器 xff1a win10虚拟机 win7虚拟机 实验准备 win10下载filezilla下载地址 win10虚拟机关闭防火墙 两台机器可以相互 p
  • 操作系统经典问题——消费者生产者问题

    今日在学习操作系统的过程中遇到了这个问题 xff0c 实在是很苦恼一时间对于这种问题以及老师上课根据这个问题衍生的问题实在是一头雾水 在网络上寻找了一些大佬的讲解之后算是暂时有了点茅塞顿开的感觉 首先第一点什么是生产者 消费者问题 xff1
  • jar包的运行结果和源代码运行结果不一样

    问题 xff1a 我的A模块依赖了B模块 xff0c B模块更新了代码之后 xff0c 把A模块打包成jar包 xff0c 但是运行的时候我的B模块还是我修改之前的样子 报错 原因 xff1a 是因为我的B模块在更新了之后没有把它放到mav
  • Tensorflow数据读取篇之一 ——字节与张量的区别

    前言 字节串 xff08 bytes xff09 类型和张量 xff08 tensor xff09 类型是两种不同的数据类型 xff0c 它们在数据类型 内存分配和计算方式等方面有所不同 一 区别 数据类型 xff1a 字节串是一种特殊的不
  • O3DE社区发布2305.0版本

    O3DE社区发布了23年的第一个版本 xff0c 版本号为2305 0 2305 0版本对应的代码标签 xff0c 见链接 2305 0版本发布说明 xff0c 见链接 直接下载标签2305 0对应的源码 xff0c 命令如下 xff1a
  • 【机器学习】周志华西瓜书第八章集成学习习题8.3--编程实现AdaBoost模型,以不剪枝决策树为基学习器,在西瓜数据集3.0a上训练一个AdaBoost集成,并与教材图8.4进行比较

    xff08 1 xff09 问题理解与分析 编程实现AdaBoost模型 xff0c 不剪枝决策树为基学习器 xff0c 在西瓜数据集3 0a上训练一个AdaBoost集成 xff0c 并与教材图8 4进行比较 xff08 2 xff09
  • 【机器学习】周志华西瓜书第七章贝叶斯分类器习题--实现AODE分类器,以西瓜数据集3.0为训练集,对“测1”进行判别。

    from numpy import import numpy as np import pandas as pd 读取文件格式为xlsx的数据 def dataLoad filename df 61 pd read excel fliena