Python计算信息熵实例
作者:Mr.Jcak 发布时间:2022-08-17 16:13:39
标签:Python,信息熵
计算信息熵的公式:n是类别数,p(xi)是第i类的概率
假设数据集有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))
来源:https://blog.csdn.net/weixin_38314865/article/details/84073484
0
投稿
猜你喜欢
- 为了能让PHP连接MSSQL,系统需要安装MSSQL,PHP,且在PHP.ini中的配置中,将 ;extension=
- 摘要:如果你学过 C 语言,那么当你初见 Python 时可能会觉得 Python 的赋值方式略有诡异:好像差不多,但又好像哪里有点不太对劲
- optim 的基本使用for do:1. 计算loss2. 清空梯度3. 反传梯度4. 更新参数optim的完整流程cifiron = nn
- ip正则式为:r'(([12][0-9][0-9]|[1-9][0-9]|[1-9])\.){3,3}([12][0-9][0-9]
- 本篇文章主要通过一个简单的例子来实现神经网络。训练数据是随机产生的模拟数据集,解决二分类问题。下面我们首先说一下,训练神经网络的一般过程:1
- 问题Django 报错 [2019-09-16 16:47:27,981] - Broken pipe from ('127.0.0
- Python的命名空间是Python程序猿必须了解的内容,对Python命名空间的学习,将使我们在本质上掌握一些Python中的琐碎的规则。
- #python中的函数定义,使用和传参###------------------- 必要参数 -----------------------
- 背景开工前我就觉得有什么不太对劲,感觉要背锅。这可不,上班第三天就捅锅了。我们有个了不起的后台程序,可以动态加载模块,并以线程方式运行,通过
- FBV:function based view 基于函数的视图.CBV:class based view 基于类的视图.在视图函数创建类,需
- 熬了半个通宵,写出了自己的Google SiteMap文件,在这里给出详细编写教程,愿对大家有所帮助。Google SiteMap的作用及协
- 1.表达式操作符Table 1 算术操作符操作符 语法 含义+ a + b 相加 - a - b 相减 - - a
- 昨天在写“同IP站点查询”工具的时候,需要先用ASP获取查询域名的IP,本来是用WSHSHELL组件,代码如下:<%@LANGUAGE
- 需求:实现ajax请求,在界面上任意地方点击,可以成功传参。创建项目如下所示:settings.py文件的设置,这次我们除了要注册app和设
- 引子Matlab中有一个函数叫做find,可以很方便地寻找数组内特定元素的下标,即:Find indices and values of n
- 1. 背景 Scrapy 是一个通用的爬虫框架,但是不支持分布式,Scrapy-redis是为了更方便地实现Scrapy分布式爬取,而提供了
- 本文研究的主要是python模块之paramiko的相关用法,具体实现代码如下,一起来看看。paramiko模块提供了ssh及sft进行远程
- 环境介绍系统环境:Windows 10Python版本:Python 3.5必备包:无 运行Python脚本:.bat文件在Win
- 微信好友全头像话不多说,直接上代码import itchatimport mathimport PIL.Image as Imageimpo
- 解决golang编译提示dial tcp 172.217.160.113:443: connectex: A connection atte