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 相关文章推荐
django接入新浪微博OAuth的方法
Jun 29 Python
浅谈编码,解码,乱码的问题
Dec 30 Python
Python实现合并两个列表的方法分析
May 28 Python
关于python列表增加元素的三种操作方法
Aug 22 Python
python抓取网页内容并进行语音播报的方法
Dec 24 Python
使用matplotlib中scatter方法画散点图
Mar 19 Python
Python3.6实现带有简单界面的有道翻译小程序
Apr 16 Python
Pycharm如何打断点的方法步骤
Jun 13 Python
python实现LRU热点缓存及原理
Oct 29 Python
pytorch 准备、训练和测试自己的图片数据的方法
Jan 10 Python
基于Python和PyYAML读取yaml配置文件数据
Jan 13 Python
Python字符串查找基本操作代码案例
Oct 27 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 CURL模拟GET及POST函数代码
2010/04/25 PHP
php小技巧之过滤ascii控制字符
2014/05/14 PHP
Yii2中Restful API原理实例分析
2016/07/25 PHP
PHP目录操作实例总结
2016/09/27 PHP
Thinkphp 5.0实现微信企业付款到零钱
2018/09/30 PHP
利用javascript查看html源文件
2006/11/08 Javascript
javascript 隔行换色函数代码
2010/10/24 Javascript
javascript textarea光标定位方法(兼容IE和FF)
2011/03/12 Javascript
js/jquery判断浏览器类型的方法小结
2015/05/12 Javascript
JavaScript利用正则表达式替换字符串中的内容
2016/12/12 Javascript
学习 NodeJS 第八天:Socket 通讯实例
2016/12/21 NodeJs
基于layer.js实现收货地址弹框选择然后返回相应的地址信息
2017/05/26 Javascript
vue.js数据绑定的方法(单向、双向和一次性绑定)
2017/07/13 Javascript
javascript数组拍平方法总结
2018/01/20 Javascript
vue 实现小程序或商品秒杀倒计时
2019/04/14 Javascript
vue商城中商品“筛选器”功能的实现代码
2020/07/01 Javascript
python使用正则表达式检测密码强度源码分享
2014/06/11 Python
Python如何为图片添加水印
2016/11/25 Python
Python中%r和%s的详解及区别
2017/03/16 Python
python 统计列表中不同元素的数量方法
2018/06/29 Python
Python数据持久化shelve模块用法分析
2018/06/29 Python
一行代码让 Python 的运行速度提高100倍
2018/10/08 Python
Python命名空间的本质和加载顺序
2018/12/17 Python
python读写csv文件的方法
2019/08/13 Python
Python批量安装卸载1000个apk的方法
2020/04/10 Python
python的launcher用法知识点总结
2020/08/07 Python
CSS3 重置iphone浏览器按钮input,select等表单元素的默认样式
2014/10/11 HTML / CSS
深入研究HTML5实现图片压缩上传功能
2016/03/25 HTML / CSS
ziaja齐叶雅官方海外旗舰店:来自波兰的天然护肤品牌
2017/01/02 全球购物
澳大利亚天然护肤品、化妆品和健康产品一站式商店:Nourished Life
2018/12/02 全球购物
意大利体育用品和运动服网上商店:Maxi Sport
2019/09/14 全球购物
学生旷课检讨书500字
2014/10/28 职场文书
大连星海广场导游词
2015/02/10 职场文书
英语导游欢迎词
2015/09/30 职场文书
祝福语集锦:朋友新店开业祝福语
2019/12/10 职场文书
MySQL 外连接语法之 OUTER JOIN
2022/04/09 MySQL