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计算最小优先级队列代码分享
Dec 18 Python
python类和函数中使用静态变量的方法
May 09 Python
python3实现TCP协议的简单服务器和客户端案例(分享)
Jun 14 Python
Python函数参数匹配模型通用规则keyword-only参数详解
Jun 10 Python
详解python列表(list)的使用技巧及高级操作
Aug 15 Python
pygame实现俄罗斯方块游戏(AI篇2)
Oct 29 Python
Django+python服务器部署与环境部署教程详解
Mar 30 Python
python导入库的具体方法
Jun 18 Python
Scrapy框架介绍之Puppeteer渲染的使用
Jun 19 Python
如何在windows下安装配置python工具Ulipad
Oct 27 Python
关于django python manage.py startapp 应用名出错异常原因解析
Dec 15 Python
Django实现WebSocket在线聊天室功能(channels库)
Sep 25 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编程最快明白》第六讲:Mysql数据库操作
2010/11/01 PHP
phpmyadmin出现Cannot start session without errors问题解决方法
2014/08/14 PHP
ci检测是ajax还是页面post提交数据的方法
2014/11/10 PHP
Laravel+Intervention实现上传图片功能示例
2019/07/09 PHP
thinkphp5使html5实现动态跳转的例子
2019/10/16 PHP
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
2020/04/06 PHP
php生成随机数/生成随机字符串的方法小结【5种方法】
2020/05/27 PHP
jQuery温习篇 强大的JQuery选择器
2010/04/24 Javascript
基于jquery实现的上传图片及图片大小验证、图片预览效果代码
2011/04/12 Javascript
关于extjs treepanel复选框选中父节点与子节点的问题
2013/04/02 Javascript
JS模拟自动点击的简单实例
2013/08/08 Javascript
jQuery表格排序组件-tablesorter使用示例
2014/05/26 Javascript
jQuery实现的自定义滚动条实例详解
2016/09/20 Javascript
用director.js实现前端路由使用实例
2017/01/27 Javascript
详解Vue 实例中的生命周期钩子
2017/03/21 Javascript
深究AngularJS之ui-router详解
2017/06/13 Javascript
在vue中实现简单页面逆传值的方法
2017/11/27 Javascript
JS使用正则表达式获取小括号、中括号及花括号内容的方法示例
2018/06/01 Javascript
jquery实现上传图片功能
2020/06/29 jQuery
node.js爬虫框架node-crawler初体验
2020/10/29 Javascript
对pandas的dataframe绘图并保存的实现方法
2017/08/05 Python
Python文件和流(实例讲解)
2017/09/12 Python
用python处理图片实现图像中的像素访问
2018/05/04 Python
Python实现爬虫从网络上下载文档的实例代码
2018/06/13 Python
常用python爬虫库介绍与简要说明
2020/01/25 Python
Python标准库json模块和pickle模块使用详解
2020/03/10 Python
HTML5打开本地app应用的方法
2016/03/31 HTML / CSS
中学家长会邀请函
2014/02/03 职场文书
2014年社区庆元旦活动方案
2014/03/08 职场文书
幼儿园三八妇女节活动方案
2014/03/11 职场文书
中学校庆方案
2014/03/17 职场文书
篝火晚会策划方案
2014/05/16 职场文书
中学生自我评价范文
2015/03/03 职场文书
Python爬取用户观影数据并分析用户与电影之间的隐藏信息!
2021/06/29 Python
使用CSS连接数据库的方式
2022/02/28 HTML / CSS
Nginx如何限制IP访问只允许特定域名访问
2022/07/23 Servers