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

news2024/12/23 11:40:21

文章目录

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

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


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

1.简单理解 信息熵

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

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

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

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

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

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


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

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

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

             P i = P_i = Pi= Z i ∑ i = 1 n Z i \frac{Z_i}{\sum_{i=1}^n{Z_i}} i=1nZiZi


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

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

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

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

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

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

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

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

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

具体的权重计算公式为:
          ω j = d j ∑ j = 1 m \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 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)

     在这里插入图片描述


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


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/193691.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在数组中删除重复数字(详解)

前言:本期是关于删除重复数字的详解,今天你c了吗? 方法: 双指针 以一组数:3 4 1 0 0 2 3 1 1 2 为例删除重复的数字 step 1:排序 使用双下标法的前提是数组有序(降序or升序) 可以使…

MYSQL命令总结

一.库的操作 1.创建库 create database db1;//创建名为db1的数据库 create database db2 charsetutf8;//创建一个utf8字符集的db2数据库 create database db3 charsetutf8 collate utf8_general_ci;//创建一个使用utf字符集并带校对规则的db3数据库2.字符集和校验规则 show …

[redis+springboot]缓存sql执行结果

场景: 访问controller层(其实是service),需要将其结果缓存到redis,下一次直接从缓存找值,从而减少sql操作,减轻数据库压力技术: redis,springboot,jpa,mysql1, 新建项目2, 导入依赖<?xml version"1.0" encoding"UTF-8"?> <project xmlns"h…

懂了委托,才算真正入门C#

文章目录委托的概念多播委托拖动按钮前文提要&#xff1a;超快速成&#xff0c;零基础掌握C#开发中最重要的概念抽丝剥茧&#xff0c;C#面向对象快速上手Winform&#xff0c;最友好的桌面GUI框架 委托的概念 委托这个名字取的神乎其神的&#xff0c;但实质是函数式编程&#…

网络攻防技术--第五次作业

文章目录作业五一、 什么是恶意代码&#xff1f;恶意代码主要类型有哪些&#xff1f;二、 恶意代码的基本技术主要包括哪几种&#xff1f;三、 什么是特洛伊木马&#xff1f;有什么特点&#xff1f;四、 什么是计算机病毒&#xff1f;其有哪几个基本组成部分&#xff1f;五、 什…

项目管理工具能做什么 它给企业带来哪些作用

一个项目经理&#xff0c;如果要想管理好项目&#xff0c;那么一定要掌握项目管理的方法与工具。在项目管理过程中总会借助一些工具来掌控项目点点滴滴&#xff0c;这不仅可以提高团队的生产力和效率&#xff0c;还可以让项目组织在不同项目带来的影响变化中做好准备。 项目管…

每天一道大厂SQL题【Day03】订单量统计

每天一道大厂SQL题【Day03】订单量统计 大家好&#xff0c;我是Maynor。相信大家和我一样&#xff0c;都有一个大厂梦&#xff0c;作为一名资深大数据选手&#xff0c;深知SQL重要性&#xff0c;接下来我准备用100天时间&#xff0c;基于大数据岗面试中的经典SQL题&#xff0c…

SAP 自定义SQL编辑器

导语&#xff1a;自定义SQL编辑器&#xff0c;可使用SAP ABAP的OPEN SQL语法进行编辑&#xff0c;快速出具简单报表&#xff0c;基本具备与SAP中DB02相似的功能。 此资源其中有两个版本&#xff0c;一个版本是网上的代码资料&#xff0c;另一个版本是本人优化过后的&#xff0…

Gerrit3.4.1安装使用

环境依赖jdk11 安装jdk11&#xff1a; 下载&#xff1a; wget https://download.java.net/openjdk/jdk11/ri/openjdk-1128_linux-x64_bin.tar.gz解压&#xff1a; tar zxvf openjdk-1128_linux-x64_bin.tar.gzsudo update-alternatives --install /usr/bin/java java /home/je…

Fiddler抓包工具配置+Jmeter基本使用

目录 一、Fiddler抓包工具的配置和使用 局域网络配置# Fiddler配置# Fiddler抓包实例# 二、Jmeter的基本使用 Jmeter的安装配置# 第一个Jmeter脚本# 一、Fiddler抓包工具的配置和使用 在编写网关自动化脚本之前&#xff0c;得先学会如何抓包&#xff0c;这里以Fiddler为…

Docker容器及安装 01

前言 1.1 从环境配置说起 环境配置是软件开发的一大难题。开发、测试及运维人员需要相同的代码运行环境&#xff0c;如此一来就需要多次搭建环境&#xff0c;想想就觉得麻烦&#xff0c;实际上&#xff0c;在不了解docker等容器技术以前&#xff0c;还真就是这么干的&#xff…

2023年FOF/MOM基金研究报告

第一章 概况 FOF 是 Fund of Funds 的简称&#xff0c;即“基金中的基金”&#xff0c;是一种专门投资于其他投资基金的基金。FOF 并不直接投资股票或债券&#xff0c;其投资范围主要限于其他基金。按照募集方式&#xff0c;FOF 分为公募 FOF 和私募 FOF。 公募 FOF 是指将80…

python小游戏——飞机大战代码开源

♥️作者&#xff1a;小刘在这里 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的&#xff0c;绽放&#xff0c;愿所有的美好&#…

明细打印重影方案

一、问题描述生产上出现明细查询打印业务&#xff0c;部分客户打印数据时出现数据重叠现象&#xff0c;不利于客户使用&#xff0c;影响客户体验。二、问题原因对方户名公司名称字段目前没有限制&#xff0c;按照现有的分页处理机制&#xff0c;如果一页纸出现多个公司名称较长…

python中值传递、引用传递、global关键字

结论1、函数中&#xff0c;数值、字符、元组的传递是值传递 b 5 print(id b ,id(b))def change(b):print(\n)#print(在函数change中 修改前 id b ,id(b))b 0print(在函数change中 修改后 id b ,id(b))def print_b():print(\n)print(在函数print b中 b , b)print(在函数pri…

【C++修炼之路】C++入门(下)

&#x1f451;作者主页&#xff1a;安 度 因 &#x1f3e0;学习社区&#xff1a;StackFrame &#x1f4d6;专栏链接&#xff1a;C修炼之路 文章目录一、前言二、内联函数1、概念2、特性三、auto&#xff08;C 11)1、概念2、价值3、三个不能四、范围for循环(C11)1、基本使用2、使…

MySQL基础(3)—— MySQL数据类型

文章目录数值类型1、整数类型2、浮点数类型3、定点数类型日期和时间类型1、YEAR2、DATE、TIME、DATETIME3、TIMESTAMP字符串类型1、CHAR(M)2、VARCHAR(M)3、各种 TEXT 类型4、ENUM 类型和 SET 类型二进制类型1、BIT 类型2、BINARY(M) 与 VARBINARY(M)3、BLOB 类型MySQL说到底就…

移动出行2023:聊以新颜待今朝

兔年春节期间&#xff0c;城市再现浓浓烟火气。预订全满的年夜饭、排不到号的奶茶店以及火爆的电影票房等&#xff0c;证明着“吃、游、购、娱”等需求集中释放的“威力”。根据国家税务总局发布的最新数据&#xff0c;今年春节假期&#xff0c;全国消费相关行业销售收入与上年…

最长上升子序列问题(LIS问题)与最长不上升子序列问题的四种方法(c++ 模板代码)

文章目录动态规划树状数组线段树二分查找最大上升子序列问题也叫做LIS问题&#xff0c;与最大公共子序列LCS问题是一类经典问题&#xff0c;在本章我们将总结一下求解LIS最大上升子序列的几种方法&#xff0c;同时也会给出对应的最大不上升子序列的求解方法。 关于LCS问题&…

【表格单元格可编辑】vue-elementul简单实现table表格点击单元格可编辑,点击单元格变成输入框修改数据

前言 这是最近遇到的功能&#xff0c;经常会需要一个表格可以编辑数据 类似于excel那种点击一下单元格就可以编辑数据&#xff0c;修改后鼠标移动出去 光标消失就会保存数据给后台 这里记录一下实现方法&#xff0c;其实也比较简单 就是通过角标来判断显示隐藏的 效果图 代码…