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编码时应该注意的几个情况
Mar 04 Python
使用Python脚本来控制Windows Azure的简单教程
Apr 16 Python
深入理解 Python 中的多线程 新手必看
Nov 20 Python
matplotlib在python上绘制3D散点图实例详解
Dec 09 Python
教你用一行Python代码实现并行任务(附代码)
Feb 02 Python
pandas表连接 索引上的合并方法
Jun 08 Python
python对象与json相互转换的方法
May 07 Python
基于python实现的百度新歌榜、热歌榜下载器(附代码)
Aug 05 Python
使用Pandas的Series方法绘制图像教程
Dec 04 Python
利用python实现.dcm格式图像转为.jpg格式
Jan 13 Python
Django+Celery实现动态配置定时任务的方法示例
May 26 Python
python创建字典及相关管理操作
Apr 13 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
为什么《星际争霸》是测试人工智能的理想战场
2019/12/03 星际争霸
mod_php、FastCGI、PHP-FPM等PHP运行方式对比
2015/07/02 PHP
PHP+redis实现的悲观锁机制示例
2018/06/12 PHP
Yii框架连表查询操作示例
2019/09/06 PHP
Domino中运用jQuery读取视图内容的方法
2009/10/21 Javascript
javascript下4个跨浏览器必备的函数
2010/03/07 Javascript
jquery 事件对象属性小结
2010/04/27 Javascript
JavaScript对数字的判断与处理实例分析
2015/02/02 Javascript
JavaScript操作cookie类实例
2015/03/31 Javascript
浅谈jQuery中height与width
2015/07/06 Javascript
Bootstrap轮播加上css3动画,炫酷到底!
2015/12/22 Javascript
浅谈Sticky组件的改进实现
2016/03/22 Javascript
Vue开发中整合axios的文件整理
2017/04/29 Javascript
通过说明与示例了解js五种设计模式
2019/06/17 Javascript
layUI实现三级导航菜单效果
2019/07/26 Javascript
关于layui导航栏不展示下拉列表的解决方法
2019/09/25 Javascript
Vue混入mixins滚动触底的方法
2019/11/22 Javascript
JavaScript进阶(一)变量声明提升实例分析
2020/05/09 Javascript
angula中使用iframe点击后不执行变更检测的问题
2020/05/10 Javascript
Python脚本文件打包成可执行文件的方法
2015/06/02 Python
详解django中使用定时任务的方法
2018/09/27 Python
python如何获取列表中每个元素的下标位置
2019/07/01 Python
Django框架创建项目的方法入门教程
2019/11/04 Python
Python中用pyinstaller打包时的图标问题及解决方法
2020/02/17 Python
Pytorch框架实现mnist手写库识别(与tensorflow对比)
2020/07/20 Python
python如何实现DES加密
2020/09/21 Python
用canvas显示验证码的实现
2020/04/10 HTML / CSS
如何开发安全的AJAX应用
2014/03/26 面试题
期末考试动员演讲稿
2014/01/10 职场文书
法学毕业生自我鉴定
2014/01/31 职场文书
离婚协议书标准格式
2014/10/04 职场文书
2014年法院工作总结
2014/11/24 职场文书
幼儿园心得体会范文
2016/01/21 职场文书
乡镇团代会开幕词
2016/03/04 职场文书
python 爬取华为应用市场评论
2021/05/29 Python
Go语言实现Snowflake雪花算法
2021/06/08 Golang