当前位置: 首页 > news >正文

数学建模笔记(四):熵权

背景&基本思想介绍

        在实际的评价类问题中,在前面所说的层次分析法以及Topsis法中,指标权重的确定往往是通过主观的评价得来的,如果在没有专家的情况下,我们自己的权重分配往往可能带有一定的主观性,有没有一种可以客观确定指标的权重的方法呢?这就是本次要介绍的熵权法的由来。

        总的来说,从方法的名字来看我们可以知道,所谓熵,就是离散或者说混乱程度,熵权法的核心思想在于,我们可以通过一个指标在不同的评价对象上的离散程度来确定这个指标的重要性。这样讲可能有点抽象,下面我来举一个例子帮助大家理解。

       假如现在要对几个不同的城市的空气质量情况进行评估排名,每个城市在进行评价的时候有如下几个指标:第一个是PM2.5浓度,第二个是空气能见度,第三个是空气中含氮化合物的浓度,第四个是含硫化合物的浓度,在这几个城市中经过调查,发现他们的含氮化合物的浓度基本一致,那么大家想一想,当我们在进行评估的时候,极端情况下,假如我们只能拿出一个指标来评判,我们会拿含氮化合物浓度这个指标来进行评估吗?相信大家肯定都不会选择这个指标,理由很简单,因为这几个城市都是一样的,那怎么进行评价呢?

        所以相信大家能够从这个例子中大概了解到熵权法的一些思想,所谓离散程度,就是指这个指标在几个对象的身上的差异大不大,差异越大,离散程度越大,那么这个指标在评价的过程中,所能发挥的作用越大;反之,如果差异不大,离散程度越低,那么这个指标对评价的帮助就越小。我们肯定是要给帮助大的指标分配更多的权重,给帮助越小的分配更少的权重,这就是熵权法的基本思想。

方法具体实现

在所有的工作开始前,我么还要偶先对指标进行正向化处理,这一点在Topsis法的文章中有提及,大家可以看一下这个文章:数学建模笔记(2):Topsis分析法。

矩阵的标准化处理

        首先还是一样,标准化的目的就是消除量纲的影响,这一点在前面的文章中已经有所提及,由于不同的物理量的单位不同,因此我们要消除因为单位不同所带来的数据上的差异影响。

        这里采用的方法还是和Topsis法的处理方法一样,即用每一个指标所在的列的平方和的二次方根作为分母,每一个元素除以该列所有元素的平方和的二次方根即可。(PS:这里的矩阵,每一行是一个评价对象,每一列是一个指标)。

概率矩阵计算

虽然这个概率矩阵的名字听起来挺唬人,但是本质上就是在前面的标准化矩阵的基础上,再对每一列(指标是列)进行归一化处理,即每一列的元素除以这列元素的和,让这个列所有的元素的和为一即可。

计算熵权

这里的熵权是针对每一个指标来说的,具体的公式如下:

 每一个e_{j}都是一个指标的熵权,最后得到的W_{j}是进行归一化处理之后的最终结果(权重肯定是和为1才对嘛)。

这样的话,最终的W_{j }就是每一个指标的熵权,权重分配就正式完成。

代码实现

下面是熵权法的MatLab代码,供大家参考,是我自己写的,难免会有错误,还请大家指正。

clc;
clear;
X=input("请输入正向化后的指标矩阵:");
[n,m]=size(X);
%对矩阵进行标准化操作
for i=1:size(X,2)judge=find(X<0);  %find函数如果找不到在矩阵X中小于0的数就会返回空if isempty(judge)Z(:,i)=X(:,i)/(sum(X(:,i).^2).^(1/2));%针对没有负数的情况,采用的是每一列除以这一列的平方和的归一化方法elseZ(:,i)=(X(:,i)-min(X(:,i)))/(max(X(:,i))-min(:,i)); %有负数就采用这种办法end
end
%另外一种标准化的代码
%Z=X./repmat(sum(X.*X).^0.5,n,1);%相当于是先利用sum函数是计算得到矩阵的每一列之和,得到每列和开方的行向量,再把这个行向量沿着行方向复制n次得到一个和原来矩阵大小一样的矩阵,进行逐项相除。
disp("标准化后的矩阵为:")
disp(Z);
%计算熵权
for j=1:mP(:,j)=Z(:,j)/sum(Z(:,j));%对标准化后的矩阵进行归一化,即每一列之和都变为1e(j)=-sum(P(:,j).*mylog(P(:,j)))/log(n);%按照公式计算熵权d(j)=1-e(j);
end
disp("归一化后的矩阵为:")
disp(P);
disp("每个指标的熵权为:")
disp(e);
disp(d);
W=d/sum(d);   %对熵权进行归一化处理
disp("最终经过归一化处理的熵权为:")
disp(W);

由于害怕出现log函数中有0的情况,还有一个mylog函数文件

function [res]=mylog(j)n=length(j);res=zeros(n,1);for i=1:nif j(i)==0res(i)=0;elseres(i)=log(j(i));endend
end

好了以上就是熵权法的介绍,希望能够得到大家的一键三连~~~

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 排序算法-堆排序
  • 甲方(北汽)渗透测试面试经验分享
  • Nginx: 负载均衡场景下上游服务器异常时的容错机制
  • github访问加速项目@一键部署自动更改host修改加速Github访问
  • k8s调度器Scheduler
  • Lodash——JavaScript中的工具库
  • buuctf [MRCTF2020]hello_world_go
  • 速盾:服务器接入cdn后上传图片失败怎么解决?
  • 主控和从控!!!
  • (二) 初入MySQL 【数据库管理】
  • C语言试题(含答案解析)
  • 发布npm包到GitLab教程
  • 树莓派+艺术品,有没有搞头?
  • 网络安全之DC-1靶机渗透实验
  • OZON免费选品工具大揭秘
  • CSS相对定位
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • PHP变量
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • Python_OOP
  • Python实现BT种子转化为磁力链接【实战】
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • vue学习系列(二)vue-cli
  • XForms - 更强大的Form
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 对超线程几个不同角度的解释
  • 后端_MYSQL
  • 讲清楚之javascript作用域
  • 一个SAP顾问在美国的这些年
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • const的用法,特别是用在函数前面与后面的区别
  • 函数计算新功能-----支持C#函数
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​VRRP 虚拟路由冗余协议(华为)
  • #Datawhale AI夏令营第4期#AIGC文生图方向复盘
  • #Linux(帮助手册)
  • #nginx配置案例
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (19)夹钳(用于送货)
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (力扣)1314.矩阵区域和
  • (一)十分简易快速 自己训练样本 opencv级联haar分类器 车牌识别
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (轉)JSON.stringify 语法实例讲解
  • *算法训练(leetcode)第四十七天 | 并查集理论基础、107. 寻找存在的路径
  • .net core 外观者设计模式 实现,多种支付选择
  • .net 连接达梦数据库开发环境部署
  • .NET开源、简单、实用的数据库文档生成工具
  • :=