Python实现计算信息熵的示例代码

 更新时间:2022年12月26日 14:11:02   作者:顾城沐心  
信息熵(information entropy)是信息论的基本概念。描述信息源各可能事件发生的不确定性。本文将通过Python实现信息熵的计算,感兴趣的可以了解一下

一:数据集准备

如博主使用的是:

多层感知机(MLP)实现考勤预测二分类任务(sklearn)对应数据集

导入至工程下

二:信息熵计算

1 导包

from math import log
import pandas as pd

2 读取数据集

dataSet = pd.read_csv('dataSet.csv', header=None).values.tolist()

3 数据统计

numEntries = len(dataSet)  # 数据集大小
    labelCounts = {}
    for featVec in dataSet:  #
        currentLabel = featVec[-1]  # 获取分类标签
        if currentLabel not in labelCounts.keys(): labelCounts[currentLabel] = 0  # 字典值不等于0???
        labelCounts[currentLabel] += 1  # 每个类中数据个数统计

4 信息熵计算

    infoEnt = 0.0
    for key in labelCounts:  # 信息熵计算
        prob = float(labelCounts[key]) / numEntries
        infoEnt -= prob * log(prob, 2)
 
    return infoEnt
    # 返回值 infoEnt 为数据集的信息熵,表示为 float 类型

测试运行,得到 多层感知机(MLP)实现考勤预测二分类任务(sklearn)对应数据集  信息熵为0.5563916622348017

三:完整源码分享

from math import log
import pandas as pd
 
dataSet = pd.read_csv('dataSet.csv', header=None).values.tolist()
 
 
def calcInfoEnt(dataSet):
    numEntries = len(dataSet)  # 数据集大小
    labelCounts = {}
    for featVec in dataSet:  #
        currentLabel = featVec[-1]  # 获取分类标签
        if currentLabel not in labelCounts.keys(): labelCounts[currentLabel] = 0  # 字典值不等于0???
        labelCounts[currentLabel] += 1  # 每个类中数据个数统计
    infoEnt = 0.0
    for key in labelCounts:  # 信息熵计算
        prob = float(labelCounts[key]) / numEntries
        infoEnt -= prob * log(prob, 2)
 
    return infoEnt
    # 返回值 infoEnt 为数据集的信息熵,表示为 float 类型
 
 
if __name__ == '__main__':
    # 输出为当前数据集的信息熵
    print(calcInfoEnt(dataSet))

四:方法补充

熵,在信息论中是用来刻画信息混乱程度的一种度量。熵最早源于热力学,后应广泛用于物理、化学、信息论等领域。1850年,德国物理学家鲁道夫·克劳修斯首次提出熵的概念,用来表示任何一种能量在空间中分布的均匀程度。1948年,Shannon在Bell System Technical Journal上发表文章“A Mathematical Theory of Communication”,将信息熵的概念引入信息论中。本文所说的熵就是Shannon熵,即信息熵,解决了对信息的量化度量问题。

下面是小编为大家收集的计算信息熵的另一种方法,希望对大家有所帮助

import math
#以整型数据为例,给出其信息熵的计算程序。
###########################################
'''统计已知数据中的不同数据及其出现次数'''
###########################################
def StatDataInf( data ):
    dataArrayLen = len( data )
    diffData = [];
    diffDataNum = [];
    dataCpy = data;
    for i in range( dataArrayLen ):
        count = 0;
        j = i
        if( dataCpy[j] != '/' ):
            temp = dataCpy[i]
            diffData.append( temp )
            while( j < dataArrayLen ):
                if( dataCpy[j] == temp ):
                    count = count + 1
                    dataCpy[j] = '/'
                j = j + 1
            diffDataNum.append( count )
    return diffData, diffDataNum
 
###########################################
'''计算已知数据的熵'''
###########################################
def DataEntropy( data, diffData, diffDataNum ):
    dataArrayLen = len( data )
    diffDataArrayLen = len( diffDataNum )
    entropyVal = 0;
    for i in range( diffDataArrayLen ):
        proptyVal = diffDataNum[i] / dataArrayLen
        entropyVal = entropyVal - proptyVal * math.log2( proptyVal )
    return entropyVal
 
def main():
    data = [1, 2, 1, 2, 1, 2, 1, 2, 1, 2 ]
    [diffData, diffDataNum] = StatDataInf( data )
    entropyVal = DataEntropy( data, diffData, diffDataNum )
    print( entropyVal )
    
    data = [1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1 ]
    [diffData, diffDataNum] = StatDataInf( data )
    entropyVal = DataEntropy( data, diffData, diffDataNum )
    print( entropyVal )
    
    data = [1, 2, 3, 4, 2, 1, 2, 4, 3, 2, 3, 4, 1, 1, 1 ]
    [diffData, diffDataNum] = StatDataInf( data )
    entropyVal = DataEntropy( data, diffData, diffDataNum )
    print( entropyVal )
    
    data = [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4 ]
    [diffData, diffDataNum] = StatDataInf( data )
    entropyVal = DataEntropy( data, diffData, diffDataNum )
    print( entropyVal )
    data = [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 1, 2, 3, 4, 5 ]
    [diffData, diffDataNum] = StatDataInf( data )
    entropyVal = DataEntropy( data, diffData, diffDataNum )
    print( entropyVal )
    
if __name__ == '__main__':
    main()
###########################################
#运行结果
1.0
0.9182958340544896
1.965596230357602
2.0
2.3183692540329317

到此这篇关于Python实现计算信息熵的示例代码的文章就介绍到这了,更多相关Python计算信息熵内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • Python3 assert断言实现原理解析

    Python3 assert断言实现原理解析

    这篇文章主要介绍了Python3 assert断言实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • python日志logging模块使用方法分析

    python日志logging模块使用方法分析

    这篇文章主要介绍了python日志logging模块使用方法,结合实例形式较为详细的分析了Python日志logging模块相关API函数与应用技巧,需要的朋友可以参考下
    2019-05-05
  • Python学习笔记之字典,元组,布尔类型和读写文件

    Python学习笔记之字典,元组,布尔类型和读写文件

    这篇文章主要为大家详细介绍了Python的字典,元组,布尔类型和读写文件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • 一文详细介绍Python中的OrderedDict对象

    一文详细介绍Python中的OrderedDict对象

    OrderedDict是Python标准库collections模块的一部分,下面这篇文章主要给大家介绍了关于Python中OrderedDict对象的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-08-08
  • Anaconda(miniconda)入门使用完全指南

    Anaconda(miniconda)入门使用完全指南

    Conda是一个管理版本和Python环境的工具,它使用起来非常容易,下面这篇文章主要给大家介绍了关于Anaconda(miniconda)入门使用的相关资料,文中介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • Python任意字符串转16, 32, 64进制的方法

    Python任意字符串转16, 32, 64进制的方法

    今天小编就为大家分享一篇Python任意字符串转16, 32, 64进制的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • python浅析守护线程与非守护线程的区别与使用

    python浅析守护线程与非守护线程的区别与使用

    守护线程,又称后台线程,它是在后台运行的,如果所有前台线程都死亡,那么后台线程就会自动死亡,本章我们来了解守护线程与非守护线程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-08-08
  • python实现学生信息管理系统源码

    python实现学生信息管理系统源码

    这篇文章主要为大家详细介绍了python实现学生信息管理系统源码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-02-02
  • 对python 中re.sub,replace(),strip()的区别详解

    对python 中re.sub,replace(),strip()的区别详解

    今天小编就为大家分享一篇对python 中re.sub,replace(),strip()的区别详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • python中pandas nlargest()的详细用法小结

    python中pandas nlargest()的详细用法小结

    df.nlargest()是一个DataFrame的方法,用于返回DataFrame中最大的n个值所在的行,通过调用nlargest()方法,我们返回了分数最高的三个行,并按照降序排列,本文结合实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2023-10-10

最新评论