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实现国外赌场热门游戏Craps(双骰子)
Mar 31 Python
python入门教程之识别验证码
Mar 04 Python
在Pycharm中设置默认自动换行的方法
Jan 16 Python
django中ORM模型常用的字段的使用方法
Mar 05 Python
详解python爬虫系列之初识爬虫
Apr 06 Python
Django框架HttpRequest对象用法实例分析
Nov 01 Python
python十进制转二进制的详解
Feb 07 Python
使用celery和Django处理异步任务的流程分析
Feb 19 Python
Scrapy框架介绍之Puppeteer渲染的使用
Jun 19 Python
python,Java,JavaScript实现indexOf
Sep 09 Python
Python 爬取淘宝商品信息栏目的实现
Feb 06 Python
Pytorch实现WGAN用于动漫头像生成
Mar 04 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开发文件系统实例讲解
2006/10/09 PHP
javascript的函数
2007/01/31 Javascript
functional继承模式 摘自javascript:the good parts
2011/06/20 Javascript
js借助ActiveXObject实现创建文件
2013/09/29 Javascript
JavaScript事件委托的技术原理探讨示例
2014/04/17 Javascript
javascript浏览器兼容教程之事件处理
2014/06/09 Javascript
JavaScript动态创建link标签到head里的方法
2014/12/22 Javascript
Jquery实现动态切换图片的方法
2015/05/18 Javascript
JQUERY实现网页右下角固定位置展开关闭特效的方法
2015/07/27 Javascript
分享有关jQuery中animate、slide、fade等动画的连续触发、滞后反复执行的bug
2016/01/10 Javascript
ES6的新特性概览
2016/03/10 Javascript
JavaScript中子对象访问父对象的方式详解
2016/09/01 Javascript
jQuery编写textarea输入字数限制代码
2017/03/23 jQuery
vue项目中使用Hbuilder打包app 设置沉浸式状态栏的方法
2018/10/22 Javascript
JavaScript变量提升和严格模式实例分析
2019/01/27 Javascript
java实现单链表增删改查的实例代码详解
2019/08/30 Javascript
js实现旋转的星空效果
2019/11/01 Javascript
[01:31]完美与DOTA2历程
2014/07/31 DOTA
[00:56]跨越时空加入战场 全新祈求者身心“失落奇艺侍祭”展示
2019/07/20 DOTA
python提示No module named images的解决方法
2014/09/29 Python
在Python中测试访问同一数据的竞争条件的方法
2015/04/23 Python
在Django中使用Sitemap的方法讲解
2015/07/22 Python
django中的HTML控件及参数传递方法
2018/03/20 Python
python实现的按要求生成手机号功能示例
2019/10/08 Python
python工具——Mimesis的简单使用教程
2021/01/16 Python
预订从美国飞往印度的机票:MyTicketsToIndia
2017/05/19 全球购物
国家地理在线商店:Shop National Geographic
2018/06/30 全球购物
Rodd & Gunn澳大利亚官网:新西兰男装品牌
2018/09/25 全球购物
Right-on官方网站:日本知名的休闲服装品牌
2019/07/12 全球购物
波兰办公用品和学校用品在线商店:Dlabiura24.pl
2020/11/18 全球购物
error和exception有什么区别
2012/10/02 面试题
用JAVA实现一种排序,JAVA类实现序列化的方法(二种)
2014/04/23 面试题
学校交通安全责任书
2014/08/25 职场文书
乡镇务虚会发言材料
2014/10/20 职场文书
python函数指定默认值的实例讲解
2021/03/29 Python
Nginx防盗链与服务优化配置的全过程
2022/01/18 Servers