Python计算信息熵实例


Posted in Python onJune 18, 2020

计算信息熵的公式:n是类别数,p(xi)是第i类的概率

Python计算信息熵实例

假设数据集有m行,即m个样本,每一行最后一列为该样本的标签,计算数据集信息熵的代码如下:

from math import log
 
def calcShannonEnt(dataSet):
  numEntries = len(dataSet) # 样本数
  labelCounts = {} # 该数据集每个类别的频数
  for featVec in dataSet: # 对每一行样本
    currentLabel = featVec[-1] # 该样本的标签
    if currentLabel not in labelCounts.keys(): labelCounts[currentLabel] = 0
    labelCounts[currentLabel] += 1 
  shannonEnt = 0.0
  for key in labelCounts:
    prob = float(labelCounts[key])/numEntries # 计算p(xi)
    shannonEnt -= prob * log(prob, 2) # log base 2
  return shannonEnt

补充知识:python 实现信息熵、条件熵、信息增益、基尼系数

我就废话不多说了,大家还是直接看代码吧~

import pandas as pd
import numpy as np
import math
## 计算信息熵
def getEntropy(s):
  # 找到各个不同取值出现的次数
  if not isinstance(s, pd.core.series.Series):
    s = pd.Series(s)
  prt_ary = pd.groupby(s , by = s).count().values / float(len(s))
  return -(np.log2(prt_ary) * prt_ary).sum()
## 计算条件熵: 条件s1下s2的条件熵
def getCondEntropy(s1 , s2):
  d = dict()
  for i in list(range(len(s1))):
    d[s1[i]] = d.get(s1[i] , []) + [s2[i]]
  return sum([getEntropy(d[k]) * len(d[k]) / float(len(s1)) for k in d])

## 计算信息增益
def getEntropyGain(s1, s2):
  return getEntropy(s2) - getCondEntropy(s1, s2)

## 计算增益率
def getEntropyGainRadio(s1, s2):
  return getEntropyGain(s1, s2) / getEntropy(s2)

## 衡量离散值的相关性
import math
def getDiscreteCorr(s1, s2):
  return getEntropyGain(s1,s2) / math.sqrt(getEntropy(s1) * getEntropy(s2))

# ######## 计算概率平方和
def getProbSS(s):
  if not isinstance(s, pd.core.series.Series):
    s = pd.Series(s)
  prt_ary = pd.groupby(s, by = s).count().values / float(len(s))
  return sum(prt_ary ** 2)
######## 计算基尼系数
def getGini(s1, s2):
  d = dict()
  for i in list(range(len(s1))):
    d[s1[i]] = d.get(s1[i] , []) + [s2[i]]
  return 1-sum([getProbSS(d[k]) * len(d[k]) / float(len(s1)) for k in d])
## 对离散型变量计算相关系数,并画出热力图, 返回相关性矩阵
def DiscreteCorr(C_data):
  ## 对离散型变量(C_data)进行相关系数的计算
  C_data_column_names = C_data.columns.tolist()
  ## 存储C_data相关系数的矩阵
  import numpy as np
  dp_corr_mat = np.zeros([len(C_data_column_names) , len(C_data_column_names)])
  for i in range(len(C_data_column_names)):
    for j in range(len(C_data_column_names)):
      # 计算两个属性之间的相关系数
      temp_corr = getDiscreteCorr(C_data.iloc[:,i] , C_data.iloc[:,j])
      dp_corr_mat[i][j] = temp_corr
  # 画出相关系数图
  fig = plt.figure()
  fig.add_subplot(2,2,1)
  sns.heatmap(dp_corr_mat ,vmin= - 1, vmax= 1, cmap= sns.color_palette('RdBu' , n_colors= 128) , xticklabels= C_data_column_names , yticklabels= C_data_column_names)
  return pd.DataFrame(dp_corr_mat)

if __name__ == "__main__":
  s1 = pd.Series(['X1' , 'X1' , 'X2' , 'X2' , 'X2' , 'X2'])
  s2 = pd.Series(['Y1' , 'Y1' , 'Y1' , 'Y2' , 'Y2' , 'Y2'])
  print('CondEntropy:',getCondEntropy(s1, s2))
  print('EntropyGain:' , getEntropyGain(s1, s2))
  print('EntropyGainRadio' , getEntropyGainRadio(s1 , s2))
  print('DiscreteCorr:' , getDiscreteCorr(s1, s1))
  print('Gini' , getGini(s1, s2))

以上这篇Python计算信息熵实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用Python的Twisted框架实现一个简单的服务器
Apr 16 Python
python 接口测试response返回数据对比的方法
Feb 11 Python
Windows下python3.6.4安装教程
Jul 31 Python
python正则表达式匹配不包含某几个字符的字符串方法
Jul 23 Python
Django继承自带user表并重写的例子
Nov 18 Python
浅析python表达式4+0.5值的数据类型
Feb 26 Python
Python开发企业微信机器人每天定时发消息实例
Mar 17 Python
使用pth文件添加Python环境变量方式
May 26 Python
基于keras中的回调函数用法说明
Jun 17 Python
python3.7中安装paddleocr及paddlepaddle包的多种方法
Nov 27 Python
python生成word合同的实例方法
Jan 12 Python
基于Python实现对比Exce的工具
Apr 07 Python
python导入库的具体方法
Jun 18 #Python
如何基于Python代码实现高精度免费OCR工具
Jun 18 #Python
python软件都是免费的吗
Jun 18 #Python
python中return如何写
Jun 18 #Python
python对一个数向上取整的实例方法
Jun 18 #Python
Python基于time模块表示时间常用方法
Jun 18 #Python
numpy 矩阵形状调整:拉伸、变成一位数组的实例
Jun 18 #Python
You might like
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
2014/07/01 PHP
100行PHP代码实现socks5代理服务器
2016/04/28 PHP
PHP框架Laravel中使用UUID实现数据分表操作示例
2018/05/30 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
2018/06/13 PHP
PHPStorm2020.1永久激活及下载更新至2020(推荐)
2020/09/25 PHP
javascript操作cookie的文章(设置,删除cookies)
2010/04/01 Javascript
JavaScript中this的使用详解
2013/11/08 Javascript
js 日期比较相关天数代码
2014/04/02 Javascript
[将免费进行到底]在Amazon的一年免费服务器上安装Node.JS, NPM和OurJS博客
2014/08/18 Javascript
百度地图给map添加右键菜单(判断是否为marker)
2016/03/04 Javascript
JavaScript事件代理和委托详解
2016/04/08 Javascript
BootStrap glyphicons 字体图标实现方法
2016/05/01 Javascript
Vue.js结合bootstrap实现分页控件
2017/03/10 Javascript
关于jQuery.ajax()的jsonp碰上post详解
2017/07/02 jQuery
解决vue router使用 history 模式刷新后404问题
2017/07/19 Javascript
理解nodejs的stream和pipe机制的原理和实现
2017/08/12 NodeJs
es6在react中的应用代码解析
2017/11/08 Javascript
mui框架 页面无法滚动的解决方法(推荐)
2018/01/25 Javascript
[40:17]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第一场
2018/04/06 DOTA
Python教程之全局变量用法
2016/06/27 Python
pandas 数据归一化以及行删除例程的方法
2018/11/10 Python
Python enumerate函数功能与用法示例
2019/03/01 Python
python 实现返回一个列表中出现次数最多的元素方法
2019/06/11 Python
python 求某条线上特定x值或y值的点坐标方法
2019/07/09 Python
PyCharm刷新项目(文件)目录的实现
2020/02/14 Python
在python中求分布函数相关的包实例
2020/04/15 Python
构建高效的python requests长连接池详解
2020/05/02 Python
PyTorch-GPU加速实例
2020/06/23 Python
最新版 Windows10上安装Python 3.8.5的步骤详解
2020/11/28 Python
python用分数表示矩阵的方法实例
2021/01/11 Python
香港太阳眼镜网上商店:SmartBuyGlasses香港
2016/07/22 全球购物
Nuts.com:优质散装,批发坚果、干果和巧克力等
2017/03/21 全球购物
J2EE系统只能是基于web
2015/09/08 面试题
中医药大学毕业生自荐信
2013/11/08 职场文书
2014年大学班级工作总结
2014/11/14 职场文书
关于空气污染危害的感想
2015/08/11 职场文书