熵权法计算评价指标权重——使用Excel VBA实现

熵权法 ]

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

在进行熵权法之前,如果数据方向不一致时,需要进行提前数据处理,通常为正向化或者逆向化两种处理(统称为数据归一化处理)。

公式如下:

我们常常通常需要使用一些统计软件以及脚本语言来计算,如:Spss,Matlab,stata,python等诸如此类的工具,但对于大部分不太习惯用统计软件或者其他编程语言的人来说使用并不方便。

为大家分享一段Excel内的VBA代码来实现在Excel中自动计算熵权权重,无需下载任何软件即可计算权重。

下面是我所使用的示范数据,大家可以从后台找我领取或者微信号公众号主页回复 “熵值法”即可获取代码以及练习数据哦。

Excel自动计算熵值法链接:https://pan.quark.cn/s/3fe506701b6c

具体代码如下

Sub 熵权法()Dim rg As Range, nrow As Integer, ncol As IntegerDim r As Integer, c As Integer'************************变量初始化*******************************Set rg = Selection  '选区With rgnrow = .Rows.Count   '选区总行数ncol = .Columns.Count '选区总列数r = .Row '选区第一个单元格行号c = .Column '选区第一个单元格列号lr = r + nrow - 1 '选区最后一个单元格行号lc = c + ncol - 1 '选区最后一个单元格列号End With'*******  Step 1 . 标准化处理  *****************************************************For k = 1 To ncol - 1Max = Application.WorksheetFunction.Max(Range(Cells(r + 2, c + k), Cells(lr, c + k)))Min = Application.WorksheetFunction.Min(Range(Cells(r + 2, c + k), Cells(lr, c + k)))For i = 2 To nrow - 1If Cells(r + 1, c + k) = 1 ThenCells(lr + i, c + k) = (Cells(r + i, c + k) - Min) / (Max - Min)ElseIf Cells(r + 1, c + k) = -1 ThenCells(lr + i, c + k) = (Max - Cells(r + i, c + k)) / (Max - Min)ElseMsgBox ("请输入正确的指标标签,-1或1,1表示指标为正向指标;-1表示指标为负向指标")Exit ForEnd IfNextNextCells(lr + 2, c) = "标准化"'********************************************************************'********  Step 2 .计算第i年份第j项指标值的比重 ********************************'1初始化变量的值r = lr + 2 '标准化矩阵的第一个单元格行号c = c + 1 '标准化矩阵的第一个单元格列号lr = lr + nrow - 1  '标准化矩阵的最后一个单元格行号lc = ncol - 1 '标准化矩阵的最后一个单元格列号For k = 0 To ncol - 2Sum = Application.WorksheetFunction.Sum(Range(Cells(r, c + k), Cells(lr, c + k)))For i = 0 To nrow - 3Cells(lr + 2 + i, c + k) = Cells(r + i, c + k) / SumNextNextCells(lr + 2, c - 1) = "第i年份第j项指标值的比重:"'************************************************************************'**********  Step 3 . 计算指标信息熵  *******************************************r = lr + 2  '比重矩阵第一个单元格行号lr = lr + nrow - 1 '比重矩阵最后一个单元格行号m = -1 / Application.Ln(nrow - 2)For k = 0 To ncol - 2For i = 0 To nrow - 3n = Application.Ln(Cells(r + i, c + k))b = Application.WorksheetFunction.IfError(n, 0)Cells(lr + 2 + i, c + k) = Cells(r + i, c + k) * bNextNextr = lr + 2   'ylny矩阵第一个个单元格行号lr = lr + nrow - 1  'ylny矩阵最后一个单元格行号For k = 0 To ncol - 2Cells(lr + 2, c + k) = Application.WorksheetFunction.Sum(Range(Cells(r, c + k), Cells(lr, c + k))) * mNextCells(lr + 2, c - 1) = "信息熵:"'*******************************************************************************'**********  Step 4 . 计算信息冗余度  *******************************************r = lr + 2 '信息熵矩阵第一个单元格行号For k = 0 To ncol - 2Cells(r + 2, c + k) = 1 - Cells(r, c + k)NextCells(r + 2, c - 1) = "信息冗余度:"'************************************************************************************'***********  Step 5 . 计算指标权重  **************************************************r = r + 2Sum = Application.WorksheetFunction.Sum(Range(Cells(r, c), Cells(r, c + ncol - 2)))For k = 0 To ncol - 2Cells(r + 2, c + k) = Cells(r, c + k) / SumWith Cells(r + 2, c + k).Font.ColorIndex = 3.Font.Bold = TrueEnd WithNextCells(r + 2, c - 1) = "指标权重:"With Cells(r + 2, c - 1).Font.ColorIndex = 3.Font.Bold = TrueEnd With'***************************************************************************************End Sub

需要资料的欢迎私信后台!

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

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

相关文章

数据库——表格之间的关系(表格之间的连接和处理)

数据库表格之间经常存在各种关系: 一对一、一对多、多对多 1.一对一 —— 丈夫表,妻子表为例 连接方式一:合并为一张表 这种方式对于一对一来说最优 连接方式二:在其中一张表内加入一个外键,连接另一张表 连…

ARM base instruction -- sdiv

有符号除法运算 Signed Divide divides a signed integer register value by another signed integer register value, and writes the result to the destination register. The condition flags are not affected. 将一个有符号整数寄存器值除以另一个有符号整数寄存器值&am…

Java中的switch分支结构

switch分支结构 switch分支结构1.基本语法2.说明3.流程图4.案例5.注意事项6.练习7.switch和if的比较 switch分支结构 1.基本语法 switch(表达式){case 常量1: //当...语句块1;break;case 常量2: 语句块2;break;...case 常量n: 语句块n;break;defaul…

路径跟踪之导航向量场——二维导航向量场

今天带来一期轨迹跟踪算法的讲解,首先讲解二维平面中的导航向量场[1]。该方法具有轻量化、计算简便、收敛性强等多项优点。该方法根据期望的轨迹函数,计算全局位置的期望飞行向量,将期望飞行向量转为偏光角,输入底层控制器&#x…

prometheus client_java实现进程的CPU、内存、IO、流量的可观测

文章目录 1、获取进程信息的方法1.1、通过读取/proc目录获取进程相关信息1.2、通过Linux命令获取进程信息1.2.1、top(CPU/内存)命令1.2.2、iotop(磁盘IO)命令1.2.3、nethogs(流量)命令 2、使用prometheus c…

AAA Mysql与redis的主从复制原理

一 :Mysql主从复制 重要的两个日志文件:bin log 和 relay log bin log:二进制日志(binnary log)以事件形式记录了对MySQL数据库执行更改的所有操作。 relay log:用来保存从节点I/O线程接受的bin log日志…

用凡尔码系统进行隐患排查二维码的制作

隐患排查是企业安全管理的重要环节,通过定期或不定期地对生产设备、作业场所、作业人员等进行检查,发现并消除安全隐患,预防事故的发生。隐患排查的效率和质量直接影响到企业的安全生产水平和经济效益。 传统的隐患排查方法主要依靠纸质进行…

PostgreSQL学习笔记七:常规SQL操作

PostgreSQL 支持标准的 SQL 语句,同时也扩展了一些特有的功能。以下是一些常规的 SQL 语句示例,这些示例涵盖了数据定义、数据操作和数据查询的基本操作: 数据定义语言 (DDL 创建数据库: CREATE DATABASE mydatabase;创建表&#…

Vue/组件的生命周期

这篇文章借鉴了coderwhy大佬的Vue生命周期 在Vue实例化或者创建组件的过程中 内部涉及到一系列复杂的阶段 每一个阶段的前后时机都可能对应一个钩子函数 以下是我根据coderwhy大佬文章对于每一个阶段的一些看法 1.过程一 首先实例化Vue或者组件 在实例化之前 会对应一个钩子函…

安装最新 MySQL 8.0 数据库(教学用)

安装 MySQL 8.0 数据库(教学用) 文章目录 安装 MySQL 8.0 数据库(教学用)前言MySQL历史一、第一步二、下载三、安装四、使用五、语法总结 前言 根据 DB-Engines 网站的数据库流行度排名(2024年)&#xff0…

使用 Go 语言与 Redis 构建高效缓存与消息队列系统

什么是 Redis? Redis 是一个开源的内存数据库,支持多种数据结构,包括字符串、列表、集合、哈希和有序集合。由于 Redis 运行在内存中,读写速度极快,常被用于构建缓存系统、实时排行榜、会话存储和消息队列等高并发场景…

【浏览器】如何正确使用Microsoft Edge

1、清理主页广告 如今的Microsoft Edge 浏览器 主页太乱了,各种广告推送,点右上角⚙️设置,把快速链接、网站导航、信息提要、背景等全部关闭。这样你就能得到一个超级清爽的主页。 网站导航       关闭 …

十款文件防泄密软件推荐,保护您的重要信息

信息安全是现代社会不可忽视的重要话题,尤其是在工作和生活中接触到大量敏感数据时。选择合适的文件防泄密软件,可以有效防止信息泄露。以下是我们为您推荐的十款优秀软件。 Ping32 以高效的文件加密功能而闻名,Ping32 可以轻松保护您的文件&…

【JavaEE】——回显服务器的实现

阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 一:引入 1:基本概念 二:UDP socket API使用 1:socke…

笔记||VUE3

侦听器 | Vue.js (vuejs.org) 模板引用 | Vue.js (vuejs.org)

R语言绘制散点图

散点图是一种在直角坐标系中用数据点直观呈现两个变量之间关系、可检测异常值并探索数据分布的可视化图表。它是一种常用的数据可视化工具,我们通过不同的参数调整和包的使用,可以创建出满足各种需求的散点图。 常用绘制散点图的函数有plot()函数和ggpl…

SpringCloud学习记录|day4

学习材料 2024最新SpringCloud微服务开发与实战,java黑马商城项目微服务实战开发(涵盖MybatisPlus、Docker、MQ、ES、Redis高级等) 网关 微服务下,好多不同地址和端口,而前端只知道8080,这怎么解决&…

《Programming from the Ground Up》阅读笔记:p217-p238

《Programming from the Ground Up》学习第11天,p217-p238总结,总计22页。 一、技术总结 1.C compiling p216, C compiling is split into two stages - the preprocessor and the main compiler。 注:感觉这个写法不好,因为p…

Java实体对象转换利器MapStruct详解

概述 现在的JAVA项目多数采用分层结构,参考《阿里巴巴JAVA开发手册》。 分层之后,每一层都有自己的领域模型,即不同类型的 Bean:  DO ( Data Object ) :与数据库表结构一一对应,…

acwing:1576. 再次树遍历

打卡一道有意义的题。 题签: 通过使用栈可以以非递归方式实现二叉树的中序遍历。 例如,假设遍历一个如下图所示的 66 节点的二叉树(节点编号从 11 到 66)。 则堆栈操作为:push(1); push(2); push(3); pop(); pop(); pu…