熵权法计算权重

news2025/7/6 5:22:14

文章目录

    • 1. 多属性决策问题
    • 2. 熵(entropy)
    • 3. 信息熵
    • 4. 熵权法
    • 5. 熵权法的实现

基于信息论的熵值法是根据各指标所含信息有序程度的差异性来确定指标权重的客观赋权方法,仅依赖于数据本身的离散程度。

熵用于度量不确定性,指标的离散程度越大(不确定性越大)则熵值越大,表明指标值提供的信息量越多,则该指标的权重也应越大。

1. 多属性决策问题

熵权法多用于多属性决策问题中求解各个属性的权值。我们先简单介绍下多属性决策:
多属性决策指的是在考虑多个属性的情况下,对一组(有限个)备选方案进行排序或者择优。
主要包含以下几个组成部分:
(1)获取属性信息。
(2)属性权重确定:包括主观赋权法、客观赋权法、主客观结合的赋权法。
(3)多属性决策:对决策所需的属性信息进行集结,并基于相应策略对备选方案进行排序和择优。

这里,假设我们的数据的样本数量为 n n n,每个样本有 j j j个feature,那么对于一个样本的一个feature的取值为: x i j x_{ij} xij
其中:
i i i :第个样本
j j j :第个feature

假设有这样一个应用场景,由于每一个样本都有很多feature,我想把这个样本的这些feature总结为一个值,应该怎么做?即

![在这里插入图片描述](https://img-blog.csdnimg.cn/75b679b827594e2bb40b53975f5df77b.p
我们有一万种方法能达到这个目的,有了这个值,我们就可以进行排名、比较等操作。所以,这个值还得有点实际意义,不能是瞎攒出来的一个数。

熵权法(EEM, entropy evaluation method)是根据指标信息熵的大小对指标客观赋值的一种方法,信息熵越大,代表该指标的离散程度很大,包含的信息就多,所赋予的权重就越大。也就是说,这个方法实际上关注的是变量的取值的多样性,取值大小差异越大的,即离散程度越高的,就说明这个feature的重要程度很大,包含了更多的信息。

2. 熵(entropy)

熵的概念是由德国物理学家克劳修斯于1865年所提出。最初是用来描述“能量退化”的物质状态参数之一,在热力学中有广泛的应用。

热力学第二定律又被称为”熵增“定律,从它的描述中大家也能明白一二:在自然状态下,热量只会从热水杯传递给冷水杯,这个过程是不可逆的,而”熵“则是这个不可逆过程的度量。换而言之,封闭系统的熵只会不变或增加,不会减少。关于“热力学熵”,最原始的宏观表达式是:
在这里插入图片描述

那时的熵仅仅是一个可以通过热量改变来测定的物理量,其本质仍没有很好的解释,直到统计物理、信息论等一系列科学理论发展,熵的本质才逐渐被解释清楚,即,熵的本质是一个系统“内在的混乱程度”。

3. 信息熵

信息熵是一个数学上颇为抽象的概念,由大名鼎鼎的信息论之父——克劳德 • 香农提出。在这里不妨把信息熵理解成某种特定信息的出现概率(离散随机事件的出现概率)。一个系统越是有序,信息熵就越低;反之,一个系统越是混乱,信息熵就越高。信息熵也可以说是系统有序化程度的一个度量。

一般说来,信息熵的表达式为:
在这里插入图片描述

举例1:

假设一个硬币,投出正反两面的概率都是50%,那么它的entropy为:
在这里插入图片描述
也就是说,一个公平的硬币,其正反面概率都是50%的情况下,熵最大化了。这件事推广到有多个面的骰子也是一样的,每个事件出现的概率越接近,样本的混乱程度就越高,熵就越大。而如果某个事件的出现概率是压倒性的,比其他所有事件出现概率加一起都高得多,那么熵就会比较小。

举例2:

假设4个元素,每个元素的feature有1个特征x1,并且它有个类型y,即
在这里插入图片描述

在这里插入图片描述
我们发现一个很有趣的现象,就是进行分组以后,熵降低了。这实际上就是决策树的基本原理,通过对属性进行分割,从而降低整体的混乱程度。即对一个属性的不同取值进行分组以后,每一组的混乱程度做个加权和,整体混乱程度要比分组之前的混乱程度还要低,也就是说每一组都更纯粹一些。

当然,这里计算entropy的 l o g 2 log_2 log2是以2为底,也可以以自然对数为底,函数图像形状是基本不变的。

4. 熵权法

回到最开始我们问的问题,就是我怎么对一大堆指标(feature)进行综合一下,形成一个综合的值。当然我们就是用简单的加权和来做,但是我们还希望这个值具有一定的代表性。这个代表性我们就视为该feature下取值的多样性,或者说离散程度。

也就是说,如果一张数据表有很多行数据,每个数据又有很多feature,**如果某个feature的取值大家都一样,这实际上也说明这个feature可以丢掉了,用什么数据训练模型它都没啥用。但如果这个feature的取值特别多,那么这么指标对于决策更有用。**因此我们如果要综合一个指标的话,我们就要给最多样化,即离散程度最高的feature以最高的权重。

主要计算步骤如下:

(1)归一化数据

这里对数据进行归一化,主要是消除量纲的影响。可以采用 min-max归一化或者mean-std归一化方法。
数据归一化方法可以参考博客:数据预处理——数据无量纲化(归一化、标准化)

这里以min-max归一化为例:
在这里插入图片描述

这里有几点需要注意的:

  • 如果原始数据中,不同属性的取值在相近的量级上, x m a x x_{max} xmax x m i n x_{min} xmin可以直接取所有数据的最大最小值。
X_std = (X - np.min(X)) / (np.max(X) - np.min(X)
  • 如果原始数据中,不同属性的取值量级相差较大,可以考虑使用列归一化,即 x m a x x_{max} xmax x m i n x_{min} xmin取列数据的列最大值和列最小值。
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
  • 如果原始数据中,某个属性的取值完全一样为 x v x_{v} xv,min、max、x 均相等,则基于min-max归一化方法计算分子分母均为0,默认算出的该属性数据均为0。

该属性的取值大家都一样,对于决策没有作用,参与决策过程的权重理应很小很小。而归一化后的0值数据,经过信息熵的计算后, P = 1 P=1 P=1 l o g ( P ) = 0 log(P)=0 log(P)=0 − P ∗ l o g ( P ) = 0 -P * log(P) = 0 Plog(P)=0 E = 0 E = 0 E=0,安全权重系数计算公式,最后算出来的权值很大,不符合实际情况。

在这里插入图片描述

这种情况下,我们可以在数据归一化后,给数据加上一个很小的数值(比如1e-3)来避免样本取值为0情况,即: x ′ ′ i j = x i j ′ + 0.001 {x''}_{ij}=x'_{ij} + 0.001 x′′ij=xij+0.001

(2)只关注第 j j j个feature,计算每个样本 x ′ ′ i j {x''}_{ij} x′′ij在第个feature下所占的全部取值的比例。
在这里插入图片描述
这个比例其实就是视为概率了。
举个例子,如果对于第 j j j个feature,我们的样本经过归一化以后取值为:
在这里插入图片描述
我们可以理解为,取值越大,这个 p i j p_{ij} pij的值就越大。相当于我们自定义了一个"概率",将其与取值联系到了一起,这么做,是因为我们要计算的熵仅仅与概率有关,而如果 x i j x_{ij} xij的取值特别多样化,我们用它算出来的这个概率也会特别多样化,有大有小,从而降低熵。

(3)计算第 j j j个feature的熵
在这里插入图片描述
(4)计算第 j j j个feature的差异系数

在这里插入图片描述

这个差异系数的含义显而易见,就是该feature的离散程度越高,该差异系数越高。

(5)对差异系数归一化,计算第个feature的权重
在这里插入图片描述

这样对于每个feature,其离散程度越高,所占比重就会越高。这样一来,我们就有了每个feature的权重了,下面我们用这个权重来算每个样本的指标

(6)计算最终的统计测度:
在这里插入图片描述

5. 熵权法的实现

先定义基础数据:

data = pd.DataFrame(
        {'人均专著': [0.1, 0.2, 0.4, 0.9, 1.2], '生师比': [5, 6, 7, 10, 2], '科研经费': [5000, 6000, 7000, 10000, 400],
         '逾期毕业率': [4.7, 5.6, 6.7, 2.3, 1.8]}, index=['院校' + i for i in list('ABCDE')])

【实现代码 1】:

import numpy as np

def get_entropy_weight_1(data): # 熵权法需要使用原始数据作为输入
	data = np.array(data)
	# 数据归一化
	# 这里可以根据需要选择mean-std归一化或者min-max归一化
	
    # 计算Pij
	P = data / data.sum(axis=0) # 需要考虑分子为0的情况,可以考虑加一个epsilon=1e-3

	# 计算熵值
	E = np.nansum(-P * np.log(P) / np.log(len(data)), axis=0)

	# 计算权系数
	return (1 - E) / (1 - E).sum()

get_entropy_weight_1(data)

程序输出结果:

array([ 0.41803075,  0.14492264,  0.28588943,  0.15115718])

【实现代码 2】:

def get_entropy_weight_2(data):
    """
    :param data: dataframe类型
    :return: 各指标权重列表
    """
    # 数据归一化
    # 这里可以根据需要选择mean-std归一化或者min-max归一化
    
    m,n=data.shape
    
    #将dataframe格式转化为matrix格式
    data=data.as_matrix(columns=None)
    
    # 第一步:计算k
    k=1/np.log(m)
    
    #第二步:计算pij
    pij=data/data.sum(axis=0)

    # 第三步:计算每种指标的信息熵
    tmp=np.nan_to_num(pij*np.log(pij))
    ej=-k*(tmp.sum(axis=0))
    
    # 第四步:计算每种指标的权重
    wi=(1-ej)/np.sum(1-ej)
    wi_list=list(wi)
    
    return  wi_list

get_entropy_weight_2(data)
[0.41803075156086411,
 0.14492263660659988,
 0.28588943395852595,
 0.15115717787401006]

可以看到,两个代码的输出结果一致,且各个属性的权值加起来和为1。

这里,有几个需要注意的点:

  • 数据归一化:在原始数据量纲不一致时,我们使用熵权法之前可以先对数据做归一化处理。这里可以根据数据的实际情况和业务需要选择mean-std归一化或者min-max归一化。不同的归一化方法,对最后求出来的权值会有影响。
  • 可以在数据归一化后,给数据加上一个很小的数值(比如1e-3)来避免样本取值为0情况,即: x ′ ′ i j = x i j ′ + 0.001 {x''}_{ij}=x'_{ij} + 0.001 x′′ij=xij+0.001
  • 除数为0的情况:上述计算过程涉及除法,会遇到除数为0的情况。可以给除数加一个很小的数值,如epsilon=1e-3,以避免除以0的情况发生。

【参考博客】:

  • TOPSIS法(优劣解距离法)介绍及 python3 实现
  • https://zhuanlan.zhihu.com/p/551107230

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

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

相关文章

LeetCode-Kotlin-Array-EASY-21至30题

关键字 PriorityQueuePairHashMap和HashSet的区别 1.HashMap实现了Map接口,而HashSet实现了Set接口。2.HashMap用于存储键值对,而HashSet用于存储对象。3.HashMap不允许有重复的键,可以允许有重复的值。HashSet不允许有重复元素。4.HashMap…

新库上线 | CnOpenData专精特新“小巨人”企业工商注册基本信息数据

专精特新“小巨人”企业工商注册基本信息数据 一、数据简介 “专精特新”一词最早来源于2011年7月,由时任工信部总工程师朱宏任在《中国产业发展和产业政策报告(2011)》新闻发布会上首次提出。“专精特新”是指具备专业化、精细化、特色化、…

第三届区块链服务网络(BSN)全球合作伙伴大会在杭州成功举办

为持续推动分布式技术和产业创新发展,2023年2月17日,由杭州市人民政府指导,杭州市拱墅区人民政府、国家信息中心主办,中国移动通信集团有限公司、区块链服务网络(BSN)发展联盟承办,中国移动通信…

如何在六秒内吸引观众的注意力

根据《2022国民专注力洞察报告》显示,当代人的连续专注时长,已经从2000年的12秒,下降到了现在的8秒。对于这个事实你可能难以相信,实际上这意味着,大多数互联网用户跳到一些页面上时,可能眼皮都不眨一下就离…

通过finalshell远程连接Windows中linux虚拟机

在Windows系统中安装Linux虚拟机,在日常使用中跨系统会造成很多不便,以finalshell为媒介,连接windows和linux虚拟机,方便日程练习,具体安装过程如下: 一、 安装finalshell 安装链接: https://…

Linux 配置网卡(基础配置、网卡会话配置、网卡绑定配置)

目录 配置网卡基本信息 通过nmcli命令配置网卡 通过配置网卡文件配置网卡 通过nmtui命令配置网卡 通过nm-connection-editor命令配置网卡 网卡高级配置 配置网络会话 配置网卡绑定(Bonding) 通过nmcli命令配置网卡绑定 nm-connection-editor 进…

DAX 微信 markdown 编辑器

DAX 微信 markdown 编辑器 一、致谢 感谢开源项目: md wechat-format 感谢 WordPress 插件 Mine云点播 作者 mine27 的指导。 二、如何使用 打开如下地址,直接编辑,可以实时看到符合微信公众号排版的效果。 推荐访问:https://j…

opencv学习整理--基础入门

文章目录读取和显示文件绘制线段,矩形,圆,椭圆,多边形,文字鼠标事件获取和修改图像像素,获取图像类型,ROI,图像通道拆分合并,图像融合图像缩放,平移&#xff…

社科院杜兰金融管理硕士——考研初试成绩已出,关于分数“6线”你有了解吗

多地公布了2023考研初试成绩查询时间,部分省份今日就能查询到考研初试成绩,考研学子们此刻的心情应该是很忐忑吧,关于分数的“6线”你都知道有哪些吗?我们跟随社科院杜兰金融管理硕士项目一起去了解一下。1.国家线教育部依据硕士生…

骨传导耳机工作原理,骨传导耳机优缺点

骨传导耳机虽说最近是十分火爆的一款单品,但还是有很多人对骨传导耳机不是很了解,骨传导耳机更多使用场景还是在户外运动使用,骨传导耳机对于长时间使用耳机的人来说十分友好,这主要还是得益于骨传导耳机传输声音的特殊性。 下面我…

《Vue+Spring Boot前后端分离开发实战》专著累计发行上万册

杰哥的学术专著《VueSpring Boot前后端分离开发实战》由清华大学出版社于2021年3月首次出版发行,虽受疫情影响但热度不减,受到业界读者的热捧,截至今日加印5次,累计发行12000册,引领读者开发前后端分离项目&#xff0c…

Temperature_Drift_Test_Tool使用说明

测试目的: 测试各个厂商的电阻温漂是否满足使用要求。 测试方法: 1、取5~10个电阻样品。 2、测试样品初始值,并保存文件。 3、设定测试流程。 4、开始测试,实时分析测试结果。 5、导出测试数据,并进一步分析。 6、得…

【Kubernetes 企业项目实战】08、简化 K8s 应用部署工具 Helm V3 入门到企业实战

目录 一、Helm 介绍 1.1 Helm 是什么 1.2 Helm 解决了什么痛点 1.3 Helm 相关组件及概念 1.4 Helm v3 版本变化 1.5 总结 二、安装 Helm 2.1 下载 Helm 2.2 安装 Helm 2.3 配置国内存放 chart 仓库的地址 三、Helm 基本使用 3.1 搜索和下载 Chart 3.2 部署 chart …

用Python搓一个黑洞

文章目录简介单位制观测绘图简介 黑洞图像大家都知道,毕竟前几年刚发布的时候曾火遍全网,甚至都做成表情包了。 问题在于,凭什么认为这就是黑洞的照片,而不是一个甜甜圈啥的给整模糊了得到的呢?有什么理论依据吗&…

动态规划-01背包

理论 有N件物品和⼀个最多能被重量为W 的背包。第i件物品的重量是weight[i],得到的价值是 value[i] 。每件物品只能⽤⼀次,求解将哪些物品装⼊背包⾥物品价值总和最⼤。 思路 确定dp数组的定义 在⼀维dp数组中,dp[j]表⽰:容量为…

【C++算法】dfs深度优先搜索(下) ——【全面深度剖析+经典例题展示】

💃🏼 本人简介:男 👶🏼 年龄:18 🤞 作者:那就叫我亮亮叭 📕 专栏:关于C/C那点破事 文章目录0.0 写在前面1. 中国象棋1.1 题干信息① 背景说明概述② 问题描述…

【2月比赛合集】55场可报名的数据挖掘奖金赛,任君挑选!

CompHub 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…)比赛。本账号同时会推送最新的比赛消息,欢迎关注!更多比赛信息见 CompHub主页 或 点击文末阅读原文以下信息仅供参考,以比赛官网为准目录Kaggle&#xff…

C++学习笔记-循环

C循环语句包括while语句,do-while语句和for语句等常见几种语句。while语句实现"当型"循环,do-while语句实现"直到型"循环,for语句也用来实现"当型"循环。 有的时候,可能需要多次执行同一块代码。一…

如何锁定Word文档部分文字不被修改

我们知道,想要保护Word文档的内容无法随意更改,可以设置“限制编辑”的保护模式。 那如果实际工作中,只需要固定的一部分内容不能编辑,可以实现吗?答案是肯定的,今天就来说说如何设置Word文档部分文字可修…

Unity UI框架

一、简介 最近在各大网站看了一下 Unity3d 的 UI 框架,各种 UI 框架已经有很多的版本了,各有千秋,有的功能虽然写的完善,但用起来太复杂,有的框架功能不完善,搞个课程就上架了,还有什么 MVC 框…