首页 > 编程语言 >信息熵计算程序[Python+CSV格式数据集]

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

时间:2024-08-28 13:47:25浏览次数:11  
标签:arr Python cnt 信息熵 uni yes CSV data col

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.values
    col=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_cnt
    arr_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=0
        if arr_val[a]==0 or arr_val[a]==arr_val[a+1]:
            v1=0
        else:
            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=no
            cnt,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_temp
        if 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=0
    i_idx_end=len(dict_single_item)
    i_sum=0
    for 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+=1
    return 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.values
    str_key = str_col_names[key]
    str_col = str_col_names[col]
    f_ig=f_ie-f_ce
    if 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.values
    str_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_ie
    if 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_igr

if __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 结语

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

标签:arr,Python,cnt,信息熵,uni,yes,CSV,data,col
From: https://www.cnblogs.com/hello-nullptr/p/18384389

相关文章

  • 分享一个基于Python的程序员薪资数据分析可视化与岗位推荐系统flask爬虫毕设(源码、调
    ......
  • 机器学习之——决策树信息熵计算[附加计算程序]
    0前言本文主要讲述了决策树背后的信息熵的公式含义及计算方式,并列举出多道例题帮助理解。1信息熵的定义1.1信息熵公式笔者使用下图(1-1)直观理解信息熵的含义。信息熵越大,表示该随机变量的不确定性越高。对于均匀分布,信息熵达到最大值。1.2证明:对于均匀分布,信息熵最......
  • Python中的分布式框架Ray的安装与使用
    技术背景假设我们在一个局域网内有多台工作站(不是服务器),那么有没有一个简单的方案可以实现一个小集群,提交分布式的任务呢?Ray为我们提供了一个很好的解决方案,允许你通过conda和Python灵活的构建集群环境,并提交分布式的任务。其基本架构为:那么本文简单的介绍一下Ray的安装与基......
  • 适用于多语言的VScode配置教程:同一文件夹内支持C++, JAVA, Python
    前言VScode作为一款强大的文本编辑器,只要配置恰当,便可以同时在一个环境内编译多种语言的文件。本文简要给出一种同时支持C++,Python,Java的配置方式(windows平台)。配置格式1.创建工作区并建立如图的文件夹及文件结构其中包括vscode的配置文件夹.vscode,以及其他三个代码文件......
  • 安装python教程详解-(Linux和Windows11安装python)
    一、Linux编译安装Python3.12.5python官网地址:WelcometoPython.org1.1安装python环境1.1.1安装开发工具包和依赖#yum-ygroupinstall"DevelopmentTools" #yum-yinstallgcczlibzlib-devellibffilibffi-develreadline-developenssl-developenssl11ope......
  • 在低显存GPU上运行PixArt-Σ/Flux.1图像生成:Python简短教程
    由PixArt-Σ在本地生成,所需显存不超过8Gb。图像生成工具的热度从未如此高涨,而且它们也变得越来越强大。像PixArtSigma和Flux.1这样的模型处于领先地位,这得益于它们的开源权重模型和宽松的许可协议。这种设置允许进行创造性的尝试,包括在不共享计算机外部数据的情况下训练LoRA......
  • Python系列(10)- Python 多线程
    多线程(Multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的系统包括对称多处理机、多核心处理器、芯片级多处理或同时多线程处理器。在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。多线程是并行化......
  • Python酷库之旅-第三方库Pandas(104)
    目录一、用法精讲451、pandas.DataFrame.pow方法451-1、语法451-2、参数451-3、功能451-4、返回值451-5、说明451-6、用法451-6-1、数据准备451-6-2、代码示例451-6-3、结果输出452、pandas.DataFrame.dot方法452-1、语法452-2、参数452-3、功能452-4、返回值......
  • Python画笔案例-017 绘制画H图
    1、绘制画H图通过python的turtle库绘制一个画H图的图案,如下图:2、实现代码 绘制一个画H图图案,以下实现的代码直接按移动,左转,右转的方式实现,大家可以尝试把本程序改成递归图,要点为在下面的dot命令修改。相信你一定能完成。:"""画H图.py"""importturtle......
  • yum依赖python2环境-"No module named urlgrabber"
    1.python3安装perl环境以及IPC/cmd.pm模块,由于环境中安装了pyhon2和python3导致模块引入冲突。makepython3时一直报错没有Module_tktinter,重新安装tk后python3还是import失败 2.检查发现python2可以引入,并且再进行安装模块时,使用的是python,而系统python指向python2 3.修改......