信息熵计算程序[Python+CSV格式数据集]

news/2024/11/15 16:33:42/文章来源:https://www.cnblogs.com/hello-nullptr/p/18384389

0 前言

  • 为了便于学习决策树信息熵相关知识,笔者编写了一个专门用于计算变量信息熵、条件熵、信息增益、信息增益比的程序,方便提升学习效率。
  • 程序中包含了计算过程的数据和详细信息以及最终计算结果。
  • 编程语言为Python,搭配CSV数据格式使用。

1 数据集

1.1 游玩数据集

根据天气状况判断是否出去玩。

  • 属性id表示每个样本的编号。
  • 属性outlook表示户外天气。sunny晴天,overcast阴天,rainy雨天。
  • 属性temperature表示温度,hot热,mild温暖,cool冷。
  • 属性humidity表示湿度。high高,normal正常。
  • 属性windy表示是否有风。not没有,yes有。
  • 属性play表示是否出去玩。yes出去玩,no不出去玩。

数据集如下图(1-1)所示。
image

点击查看游玩.CSV
id,outlook,temperature,humidity,windy,play
1,sunny,hot,high,not,no
2,sunny,hot,high,yes,no
3,overcast,hot,high,not,yes
4,rainy,mild,high,not,yes
5,rainy,cool,normal,not,yes
6,rainy,cool,normal,yes,no
7,overcast,cool,normal,yes,yes
8,sunny,mild,high,not,no
9,sunny,cool,normal,not,yes
10,rainy,mild,normal,not,yes
11,sunny,mild,normal,yes,yes
12,overcast,mild,high,yes,yes
13,overcast,hot,normal,not,yes
14,rainy,mild,high,yes,no

1.2 西瓜数据集

该数据集来源于西瓜书上,如下图(1-2)所示。
根据西瓜的特征等判断是否是好瓜。
image

点击查看西瓜.CSV
编号,色泽,根蒂,敲声,纹理,脐部,触感,好瓜
1,青绿,蜷缩,浊响,清晰,凹陷,硬滑,是
2,乌黑,蜷缩,沉闷,清晰,凹陷,硬滑,是
3,乌黑,蜷缩,浊响,清晰,凹陷,硬滑,是
4,青绿,蜷缩,沉闷,清晰,凹陷,硬滑,是
5,浅白,蜷缩,浊响,清晰,凹陷,硬滑,是
6,青绿,稍蜷,浊响,清晰,稍凹,软粘,是
7,乌黑,稍蜷,浊响,稍糊,稍凹,软粘,是
8,乌黑,稍蜷,浊响,清晰,稍凹,硬滑,是
9,乌黑,稍蜷,沉闷,稍糊,稍凹,硬滑,否
10,青绿,硬挺,清脆,清晰,平坦,软粘,否
11,浅白,硬挺,清脆,模糊,平坦,硬滑,否
12,浅白,蜷缩,浊响,模糊,平坦,软粘,否
13,青绿,稍蜷,浊响,稍糊,凹陷,硬滑,否
14,浅白,稍蜷,沉闷,稍糊,凹陷,硬滑,否
15,乌黑,稍蜷,浊响,清晰,稍凹,软粘,否
16,浅白,蜷缩,浊响,模糊,平坦,硬滑,否
17,青绿,蜷缩,沉闷,稍糊,稍凹,硬滑,否

1.3 贷款数据集

该数据集来源于统计学习方法,数据如下图(1-3)所示。
根据一个人的家庭经济等条件判断是否要贷款给这个人,类别为是表示同意给此人贷款。反之不同意给此人贷款。
image

点击查看贷款.CSV
id,年龄,有工作,有房子,信贷情况,类别
1,青年,否,否,一般,否
2,青年,否,否,好,否
3,青年,是,否,好,是
4,青年,是,是,一般,是
5,青年,否,否,一般,否
6,中年,否,否,一般,否
7,中年,否,否,好,否
8,中年,是,是,好,是
9,中年,否,是,非常好,是
10,中年,否,是,非常好,是
11,老年,否,是,非常好,是
12,老年,否,是,好,是
13,老年,是,否,好,是
14,老年,是,否,非常好,是
15,老年,否,否,一般,否

2 程序解读

程序函数解读如下图(2-1)所示,从上至下浏览。
image

3 运行结果解读

此处笔者使用了西瓜数据集。
data = pd.read_csv('./Datasets/信息熵/西瓜.csv')
运行结果如下图(2-2)所示。
image

4 程序源代码

点击查看代码
import numpy as np
import pandas as pd#获取信息熵    H(play)
# #data:df   col:play  show:是否信息计算信息
def get_information_entropy(data,col,show=False):#获取col列列名str_col_names = data.columns.valuescol=str_col_names[col]i_cnt=data.shape[0]  #总行数if show==True:print('数据总样本:{}个'.format(i_cnt),end='\t')df_end_uni=np.unique(data[col].values) #最后一列去重 ['no' 'yes']arr_uni_cnt=np.array([],dtype=np.int32) #保存去重后每一个col的个数 [12,12]for s in df_end_uni:df_filter=data[data[col]==s]arr_uni_cnt=np.append(arr_uni_cnt,df_filter.shape[0])if show == True:print('{}=\'{}\'有{}个  '.format(col,s,df_filter.shape[0]),end='')if show == True:print('\nH({})='.format(col),end='')for i in arr_uni_cnt:print('-({}/{})log2({}/{})'.format(i,i_cnt,i,i_cnt),end='')arr_uni_cnt=arr_uni_cnt/i_cntarr_uni_cnt=arr_uni_cnt*np.log2(arr_uni_cnt)f_res=np.sum(arr_uni_cnt*-1)if show == True:print('={:.4f}'.format(f_res),end='\n\n')return f_res#获取data第c1列等于s1条件下c2列等于s2的个数 及 data第c1列等于s1条件下的个数
def counter(data,c1,s1,c2,s2):df_filter1 = data[data[c1] == s1]df_filter2 = df_filter1[df_filter1[c2] == s2]return df_filter2.shape[0],df_filter1.shape[0]def calculater(arr_val):arr_res=np.array([])for a in range(0,len(arr_val),2):v1=0if arr_val[a]==0 or arr_val[a]==arr_val[a+1]:v1=0else:v1=-(arr_val[a]/arr_val[a+1]) * np.log2(arr_val[a]/arr_val[a+1])arr_res=np.append(arr_res,v1)return np.sum(arr_res)#某一列条件熵  H(play|outlook=sunny)
# #  col表示outlook  key表示play   show:是否显示计算信息
def get_conditional_entropy(data,col,key,show=False):i_total=data.shape[0]str_col_names=data.columns.values #['id' 'overlook' 'temperature' 'humidity' 'windy' 'play']df_end_uni = np.unique(data[str_col_names[key]].values)  # 最后一列去重  ['no' 'yes']df_col_uni = np.unique(data[str_col_names[col]].values)  # 某一列去重 ['overcast' 'rainy' 'sunny']str_key=str_col_names[key]dict_single_item={}for a in df_col_uni:dict_single_item[a]=np.array([])for s in df_col_uni: #在outlook=overcast条件下arr_temp=np.array([])for ss in df_end_uni:#play=nocnt,sample=counter(data,str_col_names[col],s,str_col_names[key],ss)if show == True:print('当{}=\'{}\'时,样本有{}个,{}=\'{}\'有{}个'.format(str_col_names[col],s,sample,str_col_names[key],ss,cnt))arr_temp=np.append(arr_temp,[cnt,sample])dict_single_item[s]=arr_tempif show == True:print('H({}|{}=\'{}\')='.format(str_key,str_col_names[col],s),end='')for a in range(0,len(arr_temp),2):print('-({}/{})log2({}/{})'.format(arr_temp[a],arr_temp[a+1],arr_temp[a],arr_temp[a+1]),end='')print('={:.4f}\n'.format(calculater(arr_temp)))if show == True:print('H({}|{})='.format(str_key,str_col_names[col]),end='')i_idx=0i_idx_end=len(dict_single_item)i_sum=0for k in dict_single_item:arr_val=dict_single_item[k]if show == True:print('({}/{})*{:.4f}'.format(arr_val[1],i_total,calculater(arr_val)),end='')i_sum+=(arr_val[1]/i_total)*calculater(arr_val)if show == True:if i_idx<i_idx_end-1:print('+',end='')else:print('={:.4f}'.format(i_sum),end='\n')i_idx+=1return i_sum#获取信息增益 g(D,A)=H(D)-H(D|A)
#data:df    key:D   col:A   show:是否显示计算信息
def get_information_gain(data,key,col,show=False):f_ie=get_information_entropy(data,key,False)f_ce=get_conditional_entropy(data,col,key,False)str_col_names = data.columns.valuesstr_key = str_col_names[key]str_col = str_col_names[col]f_ig=f_ie-f_ceif show == True:print('g({},{})=H({})-H({}|{})={:.4f}-{:.4f}={:.4f}\n'.format(str_key,str_col,str_key,str_key,str_col,f_ie,f_ce,f_ig))return f_ig#获取信息增益比   gr(play,outlook)= g(play,outlook) / Ha(play)
# data:df   key:play    col:outlook     show:是否显示计算信息
def get_information_gain_ratio(data,key,col,show=False):str_col_names = data.columns.valuesstr_key=str_col_names[key]str_col=str_col_names[col]f_ig=get_information_gain(data,key,col,False)f_ie=get_information_entropy(data,key,False)f_igr=f_ig/f_ieif show == True:print('gr({},{})=g({},{}) / H({})={:.4f}/{:.4f}={:.4f}\n'.format(str_key,str_col,str_key,str_col,str_col,f_ig,f_ie,f_igr))return f_igrif __name__ == '__main__':data = pd.read_csv('./Datasets/信息熵/西瓜.csv')i_key = data.shape[1]-1  # 最终判别特征索引     默认最后一列#获取每个特征的信息熵、条件熵、信息增益、信息增益比for i_col in range(1,data.shape[1],1):print('-'*100)f_ie_col=get_information_entropy(data,i_col,True)f_ce_col=get_conditional_entropy(data,i_col,i_key,True)f_ig_col=get_information_gain(data,i_key,i_col,True)f_igr_col=get_information_gain_ratio(data,i_key,i_col,True)

5 结语

如有错误请指正,禁止商用。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【整理】 【Windows系列】Windows安全日志分析实战:关键事件+详解

参考🔗: https://mp.weixin.qq.com/s?__biz=MzI5MjY4MTMyMQ==&mid=2247485189&idx=1&sn=f97aca178ab188d35e3182bf89ddf4dc&chksm=ec7ce403db0b6d151ee60369468e79229d8d3a264edb2967d7bd2ecdcd69e93af2abfb68dd1c&cur_album_id=3541179802739621890&a…

【ROS教程】ROS文件系统和基础架构

@目录1.工作空间目录1.1 package.xml2.启动节点的方式2.1 一次启动一个2.2 一次启动多个3.ROS常用命令3.1 增3.2 查3.3 执行3.3.1 加载环境变量3.3.2 运行节点3.4 查看计算图4.创建功能包4.1 选择工作目录4.2 创建功能包目录4.3 建立功能包1.工作空间目录WorkSpace --- 自定义的…

沉浸式体验吸尘器产品的3D可视化盛宴

在这个科技日新月异的时代,每一个细微之处都蕴含着创新的火花,而家居清洁作为我们日常生活中不可或缺的一环,也正在经历一场前所未有的变革。大家可以想象一下,无需亲临实体店,只需轻点鼠标或滑动屏幕,一款款精心设计的吸尘器便以3D形态跃然眼前,仿佛触手可及。这不仅仅…

Valid注解

文章链接地址:https://blog.csdn.net/m0_58680865/article/details/127817779文章目录前言 一、@Valid注解1、源码解析 2、所属的包 3、参数校验使用注解(1)空校验 (2)Boolean校验 (3)长度校验 (4)日期校验 (5)数值校验 (6)其他校验4、具体使用使用 @Valid 进行参…

【ACMMM2024】Multi-Scale and Detail-Enhanced Segment Anything Model for Salient Object Detection

论文:https://arxiv.org/pdf/2408.04326 代码:https://github.com/BellyBeauty/MDSAM论文的研究动机就是使用SAM来解决显著性检测(SOD)问题,主要有两个改进:提出了Lightweight Multi-Scale Adapter, LMSA来微调SAM 提出了Multi-Level Fusion Module, MLFM 和 Detail Enha…

Amazon Bedrock 实践:零基础创建贪吃蛇游戏

本文探讨了如何利用 Amazon Bedrock 和大型语言模型,快速创建经典的贪吃蛇游戏原型代码。重点展示了利用提示工程,将创新想法高效转化为可运行代码方面的过程。文章还介绍了评估和优化提示词质量的最佳实践。亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有…

题解:P11000 [蓝桥杯 2024 省 Python B] 数字串个数

P1100,纪念这个特别的数字,来水一篇。用 \(1 \sim 9\) 没有任何特殊情况的方法数:\(9^{10000}\)。 排除没有 \(3\) 和 \(7\) 的方法。 \(9^{10000} - 8^{10000} - 8^{10000}\) 加上 \(3\) 和 \(7\) 混一起的方法数。 \(9^{10000} - {(9 - 1)}^{10000} - {(9 - 1)}^{10000} +…

【音视频通话】使用asp.net core 8+vue3 实现高效音视频通话

引言在三年前,写智能小车的时候,当时小车上有一个摄像头需要采集,实现推拉流的操作,技术选型当时第一版用的是nginx的rtmp的推拉流,服务器的配置环境是centos,2H4G3M的一个配置,nginx的rtmp的延迟是20秒,超慢,后来研究了SRS以及ZLMediaKit这两个开源的推拉流服务器,没…

免费、开源、详细完整的unity游戏、游戏源码、教程:人工智能分析和处理对话的美好三维世界(定期更新)

免费、开源、详细完整的unity游戏、游戏源码、教程:人工智能分析和处理对话的美好三维世界。这份unity游戏、游戏源码、教程:完全免费,完全开源,完整详细,通俗易懂,适合初学者入门,定期更新。 我不想和任何人说话,任何人不要跟我说话,不要打扰我,我要安安静静的写。我…

小企业必备:优选局域网文档管理软件推荐

国内外主流的10款局域网文档管理软件对比:1.PingCode;2.Worktile;3.语雀;4.联想Filez企业网盘;5.亿方云;6.黑域基地;7.Joplin;8.MediaWiki;9.TiddlyWiki;10.Zim Wiki。在处理局域网文档时,企业常常面临着文件管理不系统、数据安全性差等问题,这不仅影响团队协作效率…

机器学习之——决策树信息熵计算[附加计算程序]

0 前言本文主要讲述了决策树背后的信息熵的公式含义及计算方式,并列举出多道例题帮助理解。1 信息熵的定义 1.1 信息熵公式笔者使用下图(1-1)直观理解信息熵的含义。信息熵越大,表示该随机变量的不确定性越高。对于均匀分布,信息熵达到最大值。 1.2 证明:对于均匀分布,信息…

phpinclude-labs做题记录

Level 1 file协议payload:?wrappers=/flag Level 2 data协议 去包含data协议中的内容其实相当于进行了一次远程包含,所以data协议的利用条件需要 php.ini 中开启 allow_url_fopen 和 allow_url_include GET: ?wrappers=, 然后 POST:helloctf=system(cat /flag); Level 3 dat…