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 查找文件夹下所有文件 实现代码
Jul 01 Python
Python简单生成随机数的方法示例
Mar 31 Python
Django中间件实现拦截器的方法
Jun 01 Python
pytorch 数据集图片显示方法
Jul 26 Python
python 使用re.search()筛选后 选取部分结果的方法
Nov 28 Python
微信公众号token验证失败解决方案
Jul 22 Python
Python生命游戏实现原理及过程解析(附源代码)
Aug 01 Python
如何基于Python获取图片的物理尺寸
Nov 25 Python
Python+Selenium+phantomjs实现网页模拟登录和截图功能(windows环境)
Dec 11 Python
关于keras中keras.layers.merge的用法说明
May 23 Python
详解使用Python写一个向数据库填充数据的小工具(推荐)
Sep 11 Python
python中字符串的编码与解码详析
Dec 03 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
分析php://output和php://stdout的区别
2018/05/06 PHP
6个常见的 PHP 安全性攻击实例和阻止方法
2020/12/16 PHP
ext实现完整的登录代码
2008/08/08 Javascript
JavaScript中的prototype使用说明
2010/04/13 Javascript
IE6、IE7中获取Button元素的值的bug说明
2011/08/28 Javascript
判断javascript的数据类型(示例代码)
2013/12/11 Javascript
基于jquery的simpleValidate简易验证插件
2014/01/31 Javascript
红米手机抢购的js代码
2014/03/10 Javascript
IE浏览器IFrame对象内存不释放问题解决方法
2014/08/22 Javascript
jQuery多级弹出菜单插件ZoneMenu
2014/12/18 Javascript
基于jquery css3实现点击动画弹出表单源码特效
2015/08/31 Javascript
实例详解jQuery表单验证插件validate
2016/01/18 Javascript
酷! 不同风格页面布局幻灯片特效js实现
2021/02/19 Javascript
Vue.js实现表格动态增加删除的方法(附源码下载)
2017/01/20 Javascript
webpack4 升级迁移的实现
2018/09/12 Javascript
基于vue的验证码组件的示例代码
2019/01/22 Javascript
vue模式history下在iis中配置流程
2019/04/17 Javascript
vue回到顶部监听滚动事件详解
2019/08/02 Javascript
Vue全局loading及错误提示的思路与实现
2019/08/09 Javascript
vue filter 完美时间日期格式的代码
2019/08/14 Javascript
基于JavaScript伪随机正态分布代码实例
2019/11/07 Javascript
python双向链表实现实例代码
2013/11/21 Python
剖析Python的Tornado框架中session支持的实现代码
2015/08/21 Python
Python基于回溯法子集树模板解决全排列问题示例
2017/09/07 Python
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
2018/03/19 Python
python中的global关键字的使用方法
2019/08/20 Python
CSS Grid布局教程之什么是网格布局
2014/12/30 HTML / CSS
DC Shoes澳大利亚官方网上商店:购买DC鞋子
2019/10/25 全球购物
美国家居装饰购物网站:Amanda Lindroth
2020/03/25 全球购物
无工作经验者个人求职信范文
2013/12/22 职场文书
计算机应届毕业生自荐信范文
2014/02/23 职场文书
安全生产会议制度
2015/08/06 职场文书
西部计划志愿者工作总结
2015/08/11 职场文书
盘点2020年适合农村地区创业的项目
2019/10/16 职场文书
《群青的幻想曲》京力秋树角色PV公开
2022/04/08 日漫
Mybatis-Plus 使用 @TableField 自动填充日期
2022/04/26 Java/Android