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中getattr函数使用方法 getattr实现工厂模式
Jan 20 Python
python获取文件版本信息、公司名和产品名的方法
Oct 05 Python
python中安装Scrapy模块依赖包汇总
Jul 02 Python
Django配置celery(非djcelery)执行异步任务和定时任务
Jul 16 Python
Pycharm新建模板默认添加个人信息的实例
Jul 15 Python
python打包成so文件过程解析
Sep 28 Python
python文件读写代码实例
Oct 21 Python
linux环境下安装python虚拟环境及注意事项
Jan 07 Python
解决python图像处理图像赋值后变为白色的问题
Jun 04 Python
Django Form设置文本框为readonly操作
Jul 03 Python
基于Python组装jmx并调用JMeter实现压力测试
Nov 03 Python
python必学知识之文件操作(建议收藏)
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
Yii中CGridView关联表搜索排序方法实例详解
2014/12/03 PHP
PHP输出九九乘法表代码实例
2015/03/27 PHP
php上传功能集后缀名判断和随机命名(强力推荐)
2015/09/10 PHP
总结一些PHP中好用但又容易忽略的小知识
2017/06/02 PHP
Yii框架where查询用法实例分析
2019/10/22 PHP
Javascript 判断客户端浏览器类型代码
2010/03/01 Javascript
javascript实现tabs选项卡切换效果(扩展版)
2013/03/19 Javascript
鼠标移到div,浮层显示明细,弹出层与div的上边距左边距重合(示例代码)
2013/12/14 Javascript
js获取url中指定参数值的示例代码
2013/12/14 Javascript
jquery选择符快速提取web表单数据示例
2014/03/27 Javascript
AngularJS表单编辑提交功能实例
2015/02/13 Javascript
JQuery中绑定事件(bind())和移除事件(unbind())
2015/02/27 Javascript
jquery 插件实现多行文本框[textarea]自动高度
2015/03/04 Javascript
jQuery实现左右切换焦点图
2015/04/03 Javascript
Jquery注册事件实现方法
2015/05/18 Javascript
JavaScript中的原型prototype属性使用详解
2015/06/05 Javascript
JavaScript记录光标在编辑器中位置的实现方法
2016/04/22 Javascript
微信小程序 选择器(时间,日期,地区)实例详解
2016/11/16 Javascript
原生JS实现几个常用DOM操作API实例
2017/01/19 Javascript
详解vue axios中文文档
2017/09/12 Javascript
vue组件中使用iframe元素的示例代码
2017/12/13 Javascript
switchery按钮的使用方法
2017/12/18 Javascript
性能优化篇之Webpack构建速度优化的建议
2019/04/03 Javascript
VSCode写vue项目一键生成.vue模版,修改定义其他模板的方法
2020/04/17 Javascript
Python内置函数bin() oct()等实现进制转换
2012/12/30 Python
python爬虫常用的模块分析
2014/08/29 Python
python连接数据库的方法
2017/10/19 Python
Jupyter中直接显示Matplotlib的图形方法
2018/05/24 Python
Django搭建项目实战与避坑细节详解
2020/12/06 Python
amazeui树节点自动展开折叠面板并选中第一个树节点的实现
2020/08/24 HTML / CSS
纽约手袋品牌:KARA
2018/03/18 全球购物
哈利波特商店:Harry Potter Shop
2018/11/30 全球购物
某个公司的Java笔面试题
2016/03/11 面试题
护理专业学生职业生涯规划范文
2014/03/11 职场文书
小学生期末评语
2014/04/21 职场文书
移交协议书
2014/08/19 职场文书