熵权法详细讲解+Python代码实现

news2024/11/14 14:03:57

🤵‍♂️ 个人主页:@艾派森的个人主页

✍🏻作者简介:Python学习者
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+


目录

问题的提出

熵权法

基本概念

基本步骤

①数据标准化

②计算概率矩阵P

③计算熵权

Python代码实现


问题的提出

根据前几篇文章我们可以知道,评价类模型最后根据各指标进行打分时因各指标的重要性不同往往需要权重,在层次分析法和TOPSIS法里权重都是主观得到的(主观评价、查文献等),那有没有更为客观的方法得到权重呢?

我们继续回到给明星A找对象这个问题上,这里我们对身高这个指标做了一些改动。

思考:观察候选人的数据我们可以发现,A、B、C三人的身高是极为接近的,那么对于找对象来说这个指标是不是就不重要了呢?而对于体重这个指标来说,三人相差较大,那么找对象是不是就要多考虑下这个指标?

熵权法

基本概念

熵权法,物理学名词,按照信息论基本原理的解释,信息是系统有序程度的一个度量,熵是系统无序程度的一个度量;根据信息熵的定义,对于某项指标,可以用熵值来判断某个指标的离散程度,其信息熵值越小,指标的离散程度越大,该指标对综合评价的影响(即权重)就越大,如果某项指标的值全部相等,则该指标在综合评价中不起作用。因此,可利用信息这个工具,计算出各个指标的权重,为多指标综合评价提供依据。

  • 熵权法是一种客观的赋权方法,它可以靠数据本身得出权重
  • 依据的原理:指标的变异程度越小,所反映的信息量也越少,其对应的权值也应该越低。

基本步骤

①数据标准化

②计算概率矩阵P

③计算熵权

我们继续帮明星A选对象,首先把原始指标矩阵正向化,这里我们还是使用之前没修改过的数据

将指标正向化后如下:

接着进行正向矩阵标准化:

计算概率矩阵P

计算熵权

得出的熵权结果如下:

Python代码实现

import numpy as np # 导入numpy库,并简称为np
# 定义一个自定义的对数函数mylog,用于处理输入数组中的零元素
def mylog(p):
    n = len(p) # 获取输入向量p的长度
    lnp = np.zeros(n) # 创建一个长度为n,元素都为0的新数组lnp
    for i in range(n): # 对向量p的每一个元素进行循环
        if p[i]==0: # 如果当前元素的值为0
            lnp[i]=0 # 则在np中对应位置也设置为0,因为Log(0)是未定义的,这里我们规定为0
        else:
            lnp[i]= np.log(p[i]) # 如果p[i]不为0,则计算其自然对数并赋值给lnp的对应位置
    return lnp # 返回计算后的对数效组
# 定义一个指标矩阵X
X = np.array([[9,0,0,0],[8,3,0.9,0.5],[6,7,0.2,1]])
# 对矩阵X进行标准化处理,得到标准化矩阵Z
Z = X/np.sqrt(np.sum(X*X,axis=0))
print("标准化矩阵Z=")
print(Z)

# 计算熵权所需的变量和矩阵初始化
n,m = Z.shape # 获取标准化矩阵Z的行数和列数
D = np.zeros(m) # 初始化一个长度为m的数组D,用于保存每个指标的信息效用值
# 计算每个指标的信息效用值
for i in range(m): # 历Z的每一列
    x = Z[:,i] # 获职Z的第i列,即第i个指标的所有数据
    p = x/np.sum(x) # 对第i个指标的数据进行归一化处理,得到概率分布p
    # 使用自定义的mylog的数计算p的对数。需要注意的是,如果p中含有0,直接使用np.1og会得到-inf,这里使用自定义函数避免这个问题
    e = -np.sum(p * mylog(p))/np.log(n) # 根据熵的定义计算第i个指标的信息熵e
    D[i] = 1-e # 根据信息效用值的定义计算D[i]
# 根据信息效用值计算各指标的权重
W = D/np.sum(D) # 将信息效用值D归一化,得到各指标的权重W
print("权重W=",W)

在上面的代码中,我们需要传入正向化后的指标矩阵X = np.array([[9,0,0,0],[8,3,0.9,0.5],[6,7,0.2,1]])

运行结果如下:

在用熵权法得到指标权重后,我们可以计算出加上权重后的标准化矩阵

temp_list = []
for i,j in zip(Z.T,W):
    temp_list.append(i*j)
import pandas as pd
new_Z = pd.DataFrame(data=temp_list).T.to_numpy()
print("加上权重后的标准化矩阵为:\n{}".format(new_Z)) # 打印加上权重后的标准化后的矩阵new_X

运行结果如下:

最后我们可以使用前面TOPSIS法中讲到的计算标准化后的得分

# 计算与最大值和最小值的距离,并算出得分
tep_max = new_Z.max(0)  # 得到Z中每列的最大值
tep_min = new_Z.min(0)  # 每列的最小值
tep_a = new_Z - np.tile(tep_max, (n, 1))  # 将tep_max向下平铺n行,并与Z中的每个对应元素做差
tep_i = new_Z - np.tile(tep_min, (n, 1))  # 将tep_max向下平铺n行,并与Z中的每个对应元素做差
D_P = ((tep_a ** 2).sum(axis=1)) ** 0.5  # D+与最大值的距离向量
D_N = ((tep_i ** 2).sum(axis=1)) ** 0.5
S = D_N / (D_P + D_N)  # 未归一化的得分
std_S = S / S.sum(axis=0)
sorted_S = np.sort(std_S, axis=0)
print('标准化后的得分:',[x*100 for x in std_S])  # 打印标准化后的得分

运行结果如下:

从结果可以看出,最后还是候选人B得分最高。

资料获取,更多粉丝福利,关注下方公众号获取

在这里插入图片描述

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

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

相关文章

大数据新视界 --大数据大厂之 Cassandra 分布式数据库:高可用数据存储的新选择

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

基于单片机的超声波液位检测系统(论文+源码)

1总体设计 本课题为基于单片机的超声波液位检测系统的设计,系统的结构框图如图2.1所示。其中包括了按键模块,温度检测模块,超声波液位检测模块,显示模块,蜂鸣器等器件设备。其中,采用STC89C52单片机作为主…

2.5 Trigger源码分析 -- ant-design-vue系列

Trigger源码分析 – ant-design-vue系列 1 概述 源码地址: https://github.com/vueComponent/ant-design-vue/blob/main/components/vc-trigger/Trigger.tsx 在源码的实现中,Trigger组件主要有两个作用: 使用Portal组件,把Pop…

构建响应式 Web 应用:Vue.js 基础指南

构建响应式 Web 应用:Vue.js 基础指南 一 . Vue 的介绍1.1 介绍1.2 好处1.3 特点 二 . Vue 的快速入门2.1 案例 1 : 快速搭建 Vue 的运行环境 , 在 div 视图中获取 Vue 中的数据2.2 案例 2 : 点击按钮执行 vue 中的函数输出 vue 中 data 的数据2.3 小结 三 . Vue 常…

Leetcode3282. 到达数组末尾的最大得分

Every day a Leetcode 题目来源&#xff1a;3282. 到达数组末尾的最大得分 解法1&#xff1a;动态规划 代码&#xff1a; class Solution { public:long long findMaximumScore(vector<int>& nums) {if (nums.size() < 1) return 0LL;int n nums.size();vect…

JavaScript高级——循环遍历加监听

本文分享到这里&#xff0c;欢迎大家评论区相互讨论学习&#xff0c;下一篇继续分享JavaScript高级学习中的闭包的内容。

linux进程间通信——学习与应用命名管道, 日志程序的使用与实现

前言&#xff1a;本节主要讲解linux进程间通信里面的命名管道&#xff0c; 命名管道和我们学过的匿名管道是类似的。 博主将会带着友友们先看一下原理&#xff0c; 然后就会着手使用以下命名管道是怎么使用的。 最后我们还会试着引入日志系统&#xff0c; 我们从本节开始就会引…

npm 安装 与 切换 淘宝镜像

一、镜像源 npm默认镜像源是国外的&#xff0c;安装依赖速度较慢&#xff0c;使用国内的镜像源速度会快一些。 1、设置淘宝镜像源&#xff1a; #最新地址 淘宝 NPM 镜像站喊你切换新域名啦! npm config set registry https://registry.npm.taobao.org&#xff08;弃用了&…

网站采用H5+CSS3开发的优势和劣势

在现代网站开发中&#xff0c;HTML5和CSS3的结合使用已经成为一种趋势。以下是其优势和劣势的介绍&#xff1a; 优势 增强的多媒体支持&#xff1a;HTML5引入了新的标签&#xff0c;使开发者能够轻松嵌入音频、视频和图形&#xff0c;无需依赖第三方插件如Flash。这大大简化了…

【AI大模型】ChatGPT模型原理介绍(下)

目录 &#x1f354; GPT-3介绍 1.1 GPT-3模型架构 1.2 GPT-3训练核心思想 1.3 GPT-3数据集 1.4 GPT-3模型的特点 1.5 GPT-3模型总结 &#x1f354; ChatGPT介绍 2.1 ChatGPT原理 2.2 什么是强化学习 2.3 ChatGPT强化学习步骤 2.4 监督调优模型 2.5 训练奖励模型 2.…

基于单片机的风机故障检测装置的设计与实现(论文+源码)

1 系统总体设计方案 通过对风机故障检测装置的设计与实现的需求、可行性进行分析&#xff0c;本设计风机故障检测装置的设计与实现的系统总体架构设计如图2-1所示&#xff0c;系统风机故障检测装置采用STM32F103单片机作为控制器&#xff0c;并通过DS18B20温度传感器、ACS712电…

macOS使用brew安装并配置python环境

1.确认已安装brew环境,如没有安装,参考: macOS系统Homebrew工具安装及使用-CSDN博客 2.安装python python安装成功 3.添加pip路径到/etc/paths 4.查看python与pip默认安装版本

【leetcode】树形结构习题

二叉树的前序遍历 返回结果&#xff1a;[‘1’, ‘2’, ‘4’, ‘5’, ‘3’, ‘6’, ‘7’] 144.二叉树的前序遍历 - 迭代算法 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,…

git 更换远程地址的方法

需要将正在开发的代码远程地址改成新的地址&#xff0c;通过查询发现有三个方法可以实现&#xff0c;特此记录。具体方法如下&#xff1a; &#xff08;1&#xff09;通过命令直接修改远程仓库地址 git remote 查看所有远程仓库git remote xxx 查看指定远程仓库地址git remote…

外卖会员卡是不是一个骗局?

大家好&#xff0c;我是鲸天科技千千&#xff0c;大家都知道我是做小程序开发的&#xff0c;平时会给大家分享一些互联网相关的创业项目&#xff0c;感兴趣的可以跟我关注一下。 首先就是要搭建一个自己的外卖会员卡系统小程序&#xff0c;我们自己的工作就是把这个小程序推广…

JDBC注册驱动及获取连接

文章目录 1. JDBC注册驱动1.1 导入驱动 Jar 包1.2 注册驱动1.2.1 API介绍1.2.2 使用步骤1.2.3 案例代码 2. 获取连接2.1 API介绍2.2 参数说明2.3 注意事项2.4 使用步骤3.5 案例代码 1. JDBC注册驱动 Connection表示Java程序与数据库之间的连接&#xff0c;只有拿到Connection才…

TCP/IP网络模型分层

应用层 应用层是最上层的&#xff0c;也就是我们能直接接触到的就是应用层(Application Layer),手机和电脑上的应用软件都是在应用层实现。当两个不同设备的应用需要通信的时候&#xff0c;应用就会把数据传输给下一层&#xff0c;也就是传输层 所以&#xff0c;应用层只需要…

PMP--一模--解题--91-100

文章目录 13.干系人管理91、 [单选] 在项目执行期间&#xff0c;一名外部干系人反对一项重大范围变更。除非重新评估干系人的决定&#xff0c;否则项目进展将受到影响。项目经理下一步该怎么做&#xff1f; 5.范围管理92、 [单选] 一客户给你一复杂项目的采购工作说明书&#x…

「数组」堆排序 / 大根堆优化(C++)

目录 概述 核心概念&#xff1a;堆 堆结构 数组存堆 思路 算法过程 up() down() Code 优化方案 大根堆优化 Code(pro) 复杂度 总结 概述 在「数组」快速排序 / 随机值优化|小区间插入优化&#xff08;C&#xff09;中&#xff0c;我们介绍了三种基本排序中的冒泡…

数学学习记录

9月14日 1.映射&#xff1a; 2.函数: 9月15日 3.反函数&#xff1a; 4.收敛数列的性质 5.反三角函数&#xff1a; 9月16日 6.函数的极限&#xff1a; 7.无穷小和无穷大 极限运算法则&#xff1a;