熵值法原理及python实现 附指标编制案例

news/2024/11/24 6:07:41/

文章目录

  • 1.简单理解 信息熵
  • 2.编制指标 (学术情景应用)
  • 3.python实现
    • 3.1 数据准备
    • 3.2 数据预处理
    • 3.3 熵值、权重计算
    • 3.4 编制综合评价指标

熵值法也称熵权法,是学术研究,及实际应用中的一种常用且有效的编制指标的方法。


             请添加图片描述请添加图片描述请添加图片描述

1.简单理解 信息熵

机器学习中的决策树算法是对信息熵的一种典型的应用。
在信息论中,使用 (Entropy)来描述随机变量分布的不确定性。
假设对随机变量X,其可能的取值有x1,x2,...,xnx_1,x_2,...,x_nx1,x2,...,xn。即有n种可能发生的结果。其对应发生的概率依次为p1,p2,...,pnp_1,p_2,...,p_np1,p2,...,pn,则事件pip_ipi对应的信息熵为:

    H(X)=H(p)=∑i=1npilog⁡1pi=−∑i=1npilog⁡piH(X)=H(p)=\sum_{i=1}^np_i\log \frac{1}{p_i}=-\sum_{i=1}^{n}p_i\log p_iH(X)=H(p)=i=1npilogpi1=i=1npilogpi

信息熵中log的底数通常为2,理论上可以使用不同的底数。

如何理解信息熵呢,假设已知今天是周日,则对于“明天是周几”这件事,只有一种可能的结果:是周一,且p=1。则“明天是周几”的信息熵H(X)H(X)H(X)−1×log⁡1=0-1×\log 1=01×log1=0,取信息熵的最小值0。表示“明天是周几”这个话题的不确定性很低,明天周几很确定。

再比如抛一枚硬币,则结果为正面和反面的概率都是0.5。则信息熵为log2log2log2,相比“明天周几”这件事的信息熵稍大些了。

假设某事情有100中可能的结果,每种结果发生的概率为0.01。则H(X)=log100H(X)=log100H(X)=log100,对于等概率均匀分布的事件,不确定的结果种类越多,则熵越大。


2.编制指标 (学术情景应用)

迁移到编制指标的情形,通过下边一个简单的示例理解熵权法在学术研究中的应用。
以陈浩,刘媛华的论文《数字经济促进制造业高质量发展了吗?——基于省级面板数据和机器学习模型的实证分析》
中部分内容展示为例:
在这里插入图片描述
对于离散型的随机变量,某指标在样本中出现的频率即可视为概率P,进而求出每个指标的熵值。
而对于上图中的连续型的随机变量,则在处理思想上与离散型随机变量有所不同。
通常可以先对数据做标准化处理,假设X指标中的第i个样本的标准化处理结果为ZiZ_iZi
(注意对正向指标和负)

则指标X中的第i个样本的权重为:

            Pi=P_i =Pi=Zi∑i=1nZi\frac{Z_i}{\sum_{i=1}^n{Z_i}}i=1nZiZi


上边说到,指标的熵值计算公式为:

        H(p)=∑i=1npilog⁡1pi=−∑i=1npilog⁡piH(p)=\sum_{i=1}^np_i\log \frac{1}{p_i}=-\sum_{i=1}^{n}p_i\log p_iH(p)=i=1npilogpi1=i=1npilogpi

为了方便求变异系数,这里计算熵值的时候常常在该公式的基础上再乘以一个常数K,即

        H(p)=−K∑i=1npilog⁡piH(p)=-K\sum_{i=1}^{n}p_i\log p_iH(p)=Ki=1npilogpi

其中K=K=K=1ln(n)\frac{1}{ln(n)}ln(n)1,n是样本的个数。易知,乘以常数后计算出的熵值,通常范围都是在区间[0,1]内的。

举个例子,假设一共有十个样本,且十个样本的连续型X指标数值非常相近,甚至完全一致。
对数的底数取10,则每个样本的权重都有接近或等于1/10。
通过公式H(p)=−K∑i=1npilog⁡piH(p)=-K\sum_{i=1}^{n}p_i\log p_iH(p)=Ki=1npilogpi计算出的熵值则为1,
然后引入一个新的指标“差异系数”来刻画数据之间的差异性大小(即使用1减去熵值得到所谓“差异系数”,不要跟变异系数混淆),

第j个指标的差异系数dj=1−Hjd_j=1-H_jdj=1Hj(H_j为第j个指标的熵值)

计算可知差异系数为0。则说明该指标在数值上不存在任何差异(雀食如此)。
随着数据本身数值上的差距的提升,指标的熵值会逐步减小,差异系数逐渐增大。这样说相信很容易理解了。

指标的熵值越小(差异系数越大),则该指标在最终要编制的指标中所占的权重则越大。

具体的权重计算公式为:
         ωj=dj∑j=1m\omega_j=\frac{d_j}{\sum_{j=1}^{m}}ωj=j=1mdj

即某指标差异系数占所有指标差异系数和的比重。


上图的情景中,作者首先对二级指标进行衡量,然后使用熵权法,求出每个二级指标的熵值,进而求出权重,分别计算出四个一级指标;
然后再对四个一级指标再次使用熵权法计算权重,进而得到最终指标:制造业高质量发展水平


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 dataelif 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-ew = d/d.sum()return w

该函数的返回值有两个,w是权重,score是评分


调用函数,计算出各个指标的权重:

w = Weightfun(df2)
print(w)

各个指标权重如下图所示:
      在这里插入图片描述


3.4 编制综合评价指标

直接将DataFrame格式的数据与求出的权重相乘,并求和,即得到通过熵值法编制出的综合指标,代码及结果如下图所示:

df3= df2 * w
df3['综合指标'] = df3.sum(axis=1)

     在这里插入图片描述


本次分享就到这里,小啾感谢您的关注与支持!
🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ


P2部分示例文献截图,参考:
陈浩,刘媛华的论文《数字经济促进制造业高质量发展了吗?——基于省级面板数据和机器学习模型的实证分析》


http://www.ppmy.cn/news/21636.html

相关文章

【C++修炼之路】15.C++继承

每一个不曾起舞的日子都是对生命的辜负 继承C继承一. 继承的概念及定义1.1 继承的引出1.2 继承的概念1.3 继承的定义二.基类和派生类对象赋值转换三.继承中的作用域3.1 作用域的概念3.2 举例说明同名冲突四.派生类的默认成员函数4.1 派生类的构造函数4.2 派生类的拷贝构造函数4…

概论第7章_参数估计_点估计的评价标准_相合性_无偏性_有效性

点估计的评价标准包括: 相合性, 无偏性, 有效性。 一. 相合性 衡量一个估计是否可行的必要条件, 就是估计的相合性。 本文不提其定义了。直接给出一些结论。 结论 设有正态总体N(μ,σ2\mu, \sigma^2μ,σ2) 的样本,…

mysql逻辑架构和数据库缓冲池

逻辑架构 典型的CS架构,服务端程序使用的是mysqld 客户端进程向服务器进程发送一段文本(SQL语句),服务器进程处理后再向客户端进程发送文本(处理结果) # 应用连接层: # 连接处理,用户鉴权(username,host…

C++入门:变量作用域

作用域是程序的一个区域,一般来说有三个地方可以定义变量:在函数或一个代码块内部声明的变量,称为局部变量。在函数参数的定义中声明的变量,称为形式参数。在所有函数外部声明的变量,称为全局变量。在程序中&#xff0…

《批处理BAT从入门到精通》总目录_培训教程持续更新中...

<--返回「批处理BAT从入门到精通」专栏主页--> 在从事“嵌入式软件开发”和“Autosar工具开发软件”过程中&#xff0c;经常会在其集成开发环境IDE&#xff08;CodeWarrior&#xff0c;S32K DS&#xff0c;Davinci&#xff0c;EB Tresos&#xff0c;ETAS…&#xff09;中…

Spark Streaming

1. kafka 具体步骤&#xff1a; 启动 zookeeper、kafkaShell 方法测试 kafka producer、consumer 生产消费情况启动 hdfs、yarn提交 spark 任务消费 kafka 消息 1.1 启动 zk 和 kafka [rootbogon bin]# cd /usr/local/src/zookeeper-3.4.14/bin [rootbogon bin]# ./zkServe…

Windows实时运动控制软核(六):LOCAL高速接口测试之Matlab

今天&#xff0c;正运动小助手给大家分享一下MotionRT7的安装和使用&#xff0c;以及使用Matlab对MotionRT7开发的前期准备。 01 MotionRT7简介 MotionRT7是深圳市正运动技术推出的跨平台运动控制实时内核&#xff0c;也是国内首家完全自主自研&#xff0c;自主可控的Windows…

算法刷题-回文数、找出小于平均值的数、旋转图像(C_C++)

文章目录回文数找出小于平均值的数旋转图像回文数 给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的…