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获取当前时间的方法
Jan 14 Python
python爬虫教程之爬取百度贴吧并下载的示例
Mar 07 Python
python实现多线程暴力破解登陆路由器功能代码分享
Jan 04 Python
Python编程中使用Pillow来处理图像的基础教程
Nov 20 Python
Python实现读取TXT文件数据并存进内置数据库SQLite3的方法
Aug 08 Python
详谈Python高阶函数与函数装饰器(推荐)
Sep 30 Python
python re模块的高级用法详解
Jun 06 Python
Pytorch加载部分预训练模型的参数实例
Aug 18 Python
Python函数的迭代器与生成器的示例代码
Jun 18 Python
Python实现粒子群算法的示例
Feb 14 Python
Django与AJAX实现网页动态数据显示的示例代码
Feb 24 Python
关于pytest结合csv模块实现csv格式的数据驱动问题
May 30 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
深入探讨<br />和 \r\n两者有什么区别??
2013/06/05 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十四)
2014/06/26 PHP
php中getservbyport与getservbyname函数用法实例
2014/11/18 PHP
PHP中把有符号整型转换为无符号整型方法
2015/05/27 PHP
php使用Jpgraph绘制简单X-Y坐标图的方法
2015/06/10 PHP
jQuery Ajax提交表单查询获得数据实例代码
2012/09/19 Javascript
js鼠标点击事件在各个浏览器中的写法及Event对象属性介绍
2013/01/24 Javascript
JQuery的ON()方法支持的所有事件罗列
2015/02/28 Javascript
jQuery选择器源码解读(二):select方法
2015/03/31 Javascript
javascript的几种继承方法介绍
2016/03/22 Javascript
简介EasyUI datagrid editor combogrid搜索框的实现
2016/04/01 Javascript
在windows上用nodejs搭建静态文件服务器的简单方法
2016/08/11 NodeJs
扩展jquery easyui tree的搜索树节点方法(推荐)
2016/10/28 Javascript
JS公共小方法之判断对象是否为domElement的实例
2016/11/25 Javascript
js阻止移动端页面滚动的两种方法
2017/01/25 Javascript
ES6新特性七:数组的扩充详解
2017/04/21 Javascript
JavaScript中undefined和null的区别
2017/05/03 Javascript
bmob js-sdk 在vue中的使用教程
2018/01/21 Javascript
详解vue 不同环境配置不同的打包命令
2019/04/07 Javascript
详解Vue依赖收集引发的问题
2019/04/22 Javascript
JavaScript实现Tab标签页切换的最简便方式(4种)
2020/06/28 Javascript
Python程序员开发中常犯的10个错误
2014/07/07 Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
2019/05/23 Python
python绘制趋势图的示例
2020/09/17 Python
AJAX都有哪些有点和缺点
2012/11/03 面试题
数控机床专业自荐信
2014/05/19 职场文书
2015年员工试用期工作总结
2014/12/12 职场文书
2015年资料员工作总结
2015/04/25 职场文书
企业战略合作意向书
2015/05/08 职场文书
担保书范文
2019/07/09 职场文书
创业计划书之零食店(进口)
2019/09/24 职场文书
Java框架入门之简单介绍SpringBoot框架
2021/06/18 Java/Android
十大最帅动漫男主 碓冰拓海上榜,第一是《灌篮高手》男主角
2022/03/18 日漫
python实现会员管理系统
2022/03/18 Python
Redis特殊数据类型HyperLogLog基数统计算法讲解
2022/06/01 Redis
Python  序列化反序列化和异常处理的问题小结
2022/12/24 Python