熵值法原理及Python实现的示例详解
作者:侯小啾 发布时间:2021-06-19 20:31:33
熵值法也称熵权法,是学术研究,及实际应用中的一种常用且有效的编制指标的方法。
1.简单理解 信息熵
机器学习中的决策树算法是对信息熵的一种典型的应用。
在信息论中,使用 熵 (Entropy)来描述随机变量分布的不确定性。
假设对随机变量X,其可能的取值有x1,x2,...,xn 。即有n种可能发生的结果。其对应发生的概率依次为p1,p2,...,pn,则事件pi对应的信息熵为:
信息熵中log的底数通常为2,理论上可以使用不同的底数。
如何理解信息熵呢,假设已知今天是周日,则对于“明天是周几”这件事,只有一种可能的结果:是周一,且p=1。则“明天是周几”的信息熵H(X)为−1×log1=0,取信息熵的最小值0。表示“明天是周几”这个话题的不确定性很低,明天周几很确定。
再比如抛一枚硬币,则结果为正面和反面的概率都是0.5。则信息熵为log2,相比“明天周几”这件事的信息熵稍大些了。
假设某事情有100中可能的结果,每种结果发生的概率为0.01。则H(X)=log100,对于等概率均匀分布的事件,不确定的结果种类越多,则熵越大。
2.编制指标 (学术情景应用)
迁移到编制指标的情形,通过下边一个简单的示例理解熵权法在学术研究中的应用。
以陈浩,刘媛华的论文《数字经济促进制造业高质量发展了吗?——基于省级面板数据和机器学习模型的实证分析》中部分内容展示为例:
对于离散型的随机变量,某指标在样本中出现的频率即可视为概率P,进而求出每个指标的熵值。
而对于上图中的连续型的随机变量,则在处理思想上与离散型随机变量有所不同。
通常可以先对数据做标准化处理,假设X指标中的第i个样本的标准化处理结果为Zi:(注意对正向指标和负)
则指标X中的第i个样本的权重为:
上边说到,指标的熵值计算公式为:
为了方便求变异系数,这里计算熵值的时候常常在该公式的基础上再乘以一个常数K,即
其中K=1/ln(n) ,n是样本的个数。易知,乘以常数后计算出的熵值,通常范围都是在区间[0,1]内的。
举个例子,假设一共有十个样本,且十个样本的连续型X指标数值非常相近,甚至完全一致。
对数的底数取10,则每个样本的权重都有接近或等于1/10。
通过公式
计算出的熵值则为1,然后引入一个新的指标“差异系数”来刻画数据之间的差异性大小(即使用1减去熵值得到所谓“差异系数”,不要跟变异系数混淆),第j个指标的差异系数dj=1−Hj(H_j为第j个指标的熵值)
计算可知差异系数为0。则说明该指标在数值上不存在任何差异(雀食如此)。
随着数据本身数值上的差距的提升,指标的熵值会逐步减小,差异系数逐渐增大。这样说相信很容易理解了。
指标的熵值越小(差异系数越大),则该指标在最终要编制的指标中所占的权重则越大。
具体的权重计算公式为:
即某指标差异系数占所有指标差异系数和的比重。
上图的情景中,作者首先对二级指标进行衡量,然后使用熵权法,求出每个二级指标的熵值,进而求出权重,分别计算出四个一级指标;
然后再对四个一级指标再次使用熵权法计算权重,进而得到最终指标:制造业高质量发展水平。
3.python实现
3.1 数据准备
为方便读者测试,这边手动生成一段数据作为示例。
将指标1,指标2,指标3,指标4,合并编制为一个“综合指标”。
import pandas as pd
import numpy as np
# 1. 初始数据 假设指标4是负向指标,其余三个为正向指标
df1 = pd.DataFrame({'指标1': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'指标2': [2, 4, 6, 8, 10, 2, 4, 6, 8, 10],
'指标3': [1, 2, 1, 3, 2, 1, 3, 2, 3, 1],
'指标4': [3, 1, 2, 3, 5, 8, 7, 8, 8, 9]
})
print(df1)
数据为DataFrame格式,效果展示如下:
3.2 数据预处理
然后是数据预处理部分,这里定义一个泛用性较强的标准化处理函数,
该函数对于正向指标和负向指标(越大越好的指标和越小越好的指标),可以分别进行不同的处理。
(处理逻辑通过代码可以很容易看出)
同时该函数也可以兼容只进行其中一种处理的情景。
# 2.数据预处理 定义标准化处理函数
def Standardization(data,cols1=None, cols2=None):
"""
:param data:目标数据
:param cols1: 需要处理的正向指标列名列表,类型为列表或None [col1, col2, col3]
:param cols2: 需要处理的负向指标列名列表,类型为列表或None [col1, col2, col3]
:return: 输出处理结果
"""
if cols1 == None and cols2 == None:
return data
elif cols1 != None and cols2 == None:
return (data[cols1] - data[cols1].min())/(data[cols1].max()-data[cols1].min())
elif cols1 == None and cols2 != None:
return (data[cols2].max - data[cols2])/(data[cols2].max()-data[cols2].min())
else:
a = (data[cols1] - data[cols1].min())/(data[cols1].max()-data[cols1].min())
b = (data[cols2].max() - data[cols2])/(data[cols2].max()-data[cols2].min())
return pd.concat([a, b], axis=1)
调用函数,进行标准化处理:
df2 = Standardization(df1, cols1=['指标1', "指标2", "指标3"], cols2=['指标4'])
print(df2)
处理结果如下:
3.3 熵值、权重计算
然后定义一个通过熵值计算权重,及样本评分的函数。
def Weightfun(data):
"""
:param data: 预处理好的数据
:return: 输出权重。
"""
K = 1/np.log(len(data))
e = -K*np.sum(data*np.log(data))
d = 1-e
w = d/d.sum()
return w
该函数的返回值有两个,w是权重,score是评分
调用函数,计算出各个指标的权重:
w = Weightfun(df2)
print(w)
各个指标权重如下图所示:
3.4 编制综合评价指标
直接将DataFrame格式的数据与求出的权重相乘,并求和,即得到通过熵值法编制出的综合指标,代码及结果如下图所示:
df3= df2 * w
df3['综合指标'] = df3.sum(axis=1)
来源:https://blog.csdn.net/weixin_48964486/article/details/128851622


猜你喜欢
- 需求:查询进行中的活动数据进行中一共有以下几种情况:1.开始时间为空,结束时间为空, 此结果数据将永远为进行中的数据2.开始时间为空,结束时
- 本文为大家分享了Java基于MySQL实现学生管理系统,供大家参考,具体内容如下因为实验室要交作业然后就做了一个学生管理系统,贴个代码纪念一
- 基于Python中求和函数sum的用法详解今天在看《集体编程智慧》这本书的时候,看到一段Python代码,当时是百思不得其解,总觉得是书中排
- 这篇文章主要介绍了python next()和iter()函数原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学
- 问题某些无聊的脚本小子在Web页面表单中填入了“pýtĥöñ”这样的文本,我们
- 1、权限赋予 说明:mysql部署在服务器A上,内网上主机B通过客户端工具连接服务器A以进行数据库操作,需要服务器A赋予主机B操作mysql
- 问: 如果数据表中有时间字段,现在要迁移到其他时区的服务器上,该如何处理呢?答:在高版本的mysqldump中,新增了一个选项:--tz-u
- 如果独自放着jQuery做事,它绝对做得很好,但jQuery充许与其他库共存在,有些事就防不胜防了。看下面代码data :func
- 前言python类与实例的方法的调用中觉得云里雾里,思考之后将自己的想法记录下,一来加深自己理解,巩固自己记忆,而来帮助一些想要学习pyth
- 说明1、导入unittest模块。2、导入被测对象。3、创建测试类unittest.TestCase。4、重写setUp和tearDown(
- Python使用Try Exception来处理异常机制 若Exception中有Try对应的异常处理,则Try - exception之后
- 1 算术运算add(other)比如进行数学运算加上具体的一个数字data['open'].add(1)2018-02-27
- LDA(Latent Dirichlet allocation)模型是一种常用而用途广泛地概率主题模型。其实现一般通过Variational
- 列表更多的方法index():返回指定数据所在位置的下标 (注意:如果查找的数据不存在则报错。)。count():统计指定数据在当前列表中出
- RGB图像转灰度图RGB图像转换为灰度图时通常使用:进行转换,以下尝试通过其他对图像像素操作的方式将RGB图像转换为灰度图像。#includ
- # 0. PyCharm 常用快捷键# 1. 查看使用库源码PyCharm 主程序员在 Stackoverflow 上答道经常听人说,多看源
- 第一种, 使用create_connection链接,需要pip install websocket-client (此方法不建议使用,链接
- 近日无事,想起以前曾打算过要做一个定时重启或关机的工具,便花了一点时间以hta的形式写了个,名为"Windows Timer&qu
- 1、查看鼠标右键快捷键,可以看到pycharm打开项目快捷键2、打开注册器win+r键打开,输入regedit,运行注册器找到下面的路径:计
- python实现银行管理系统,供大家参考,具体内容如下有的地方用的方法的比较复杂,主要是为回顾更多的知识test1用来存类和函数#test1