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 相关文章推荐
可用于监控 mysql Master Slave 状态的python代码
Feb 10 Python
介绍Python中的fabs()方法的使用
May 14 Python
Python基于PycURL实现POST的方法
Jul 25 Python
Python实现的下载网页源码功能示例
Jun 13 Python
Python scikit-learn 做线性回归的示例代码
Nov 01 Python
Python实现全排列的打印
Aug 18 Python
Python二进制文件读取并转换为浮点数详解
Jun 25 Python
wxPython修改文本框颜色过程解析
Feb 14 Python
Python编程快速上手——强口令检测算法案例分析
Feb 29 Python
python GUI库图形界面开发之PyQt5树形结构控件QTreeWidget详细使用方法与实例
Mar 02 Python
如何用 Python 制作 GitHub 消息助手
Feb 20 Python
用Python仅20行代码编写一个简单的端口扫描器
Apr 08 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&java(二)
2006/10/09 PHP
PHP批量生成缩略图的代码
2008/07/19 PHP
php 中英文语言转换类
2011/09/07 PHP
解析PHP工厂模式的好处
2013/06/18 PHP
php下载excel无法打开的解决方法
2013/12/24 PHP
PHP获取短链接跳转后的真实地址和响应头信息的方法
2014/07/25 PHP
php 数据结构之链表队列
2017/10/17 PHP
js鼠标点击事件在各个浏览器中的写法及Event对象属性介绍
2013/01/24 Javascript
NodeJS Web应用监听sock文件实例
2015/02/18 NodeJs
JavaScript 轮播图和自定义滚动条配合鼠标滚轮分享代码贴
2016/10/28 Javascript
Vue.js实现无限加载与分页功能开发
2016/11/03 Javascript
NodeJS整合银联网关支付(DEMO)
2016/11/09 NodeJs
EditPlus 正则表达式 实战(3)
2016/12/15 Javascript
jquery dataTable 获取某行数据
2017/05/05 jQuery
Vue通过input筛选数据
2020/10/26 Javascript
mongoose中利用populate处理嵌套的方法
2017/05/26 Javascript
vue实现单选和多选功能
2017/08/11 Javascript
Vue 2.0学习笔记之Vue中的computed属性
2017/10/16 Javascript
微信小程序视图容器(swiper)组件创建轮播图
2020/06/19 Javascript
Vue 实例事件简单示例
2019/09/19 Javascript
vue实现节点增删改功能
2019/09/26 Javascript
使用Python程序抓取新浪在国内的所有IP的教程
2015/05/04 Python
pycharm安装图文教程
2017/05/02 Python
Django在win10下的安装并创建工程
2017/11/20 Python
使用Python实现从各个子文件夹中复制指定文件的方法
2018/10/25 Python
Django项目中实现使用qq第三方登录功能
2019/08/13 Python
Django如何实现上传图片功能
2019/08/16 Python
Python中SQLite如何使用
2020/05/27 Python
python用tkinter实现一个gui的翻译工具
2020/10/26 Python
美国玛丽莎收藏奢华时尚商店:Marissa Collections
2016/11/21 全球购物
IMPORT的选项IGNORE有什么作用?缺省是什么设置?
2015/09/17 面试题
某同学的自我鉴定范文
2013/12/26 职场文书
最新茶叶店创业计划书
2014/01/14 职场文书
网络营销策划方案
2014/06/04 职场文书
我在伊朗长大观后感
2015/06/16 职场文书
详细聊聊MySQL中慢SQL优化的方向
2021/08/30 MySQL