数模学习day07-基于熵权法对Topsis模型的修正

 初步理解

        这里看看就好

        熵权法是一种常用的多指标综合评价方法,通过计算指标的熵值来确定各指标的权重。而Topsis模型则是一种常用的多指标决策模型,用于评估不同方案的优劣。

在基于熵权法的Topsis模型中,可以对熵权法进行一些修正来提高模型的准确性和可靠性。以下是一种可能的修正方法:

        1. 引入相对熵值:在熵权法中,计算指标的熵值时使用的是绝对熵值,即每个指标的熵值都是相互独立计算的。然而,在实际问题中,不同指标之间常常存在一定的相关性。为了更准确地反映指标的信息量,可以引入相对熵值的概念,即考虑各指标之间的相关性。通过计算指标之间的协方差矩阵,可以得到各指标的相关性系数,然后将相关性系数考虑到熵值的计算中,得到相对熵值。

        2. 建立模型的一致性检验:在Topsis模型中,评估方案的优劣是通过计算方案与理想解之间的距离来实现的。然而,在使用Topsis模型时,往往会使用专家判断或者模糊评价来确定指标的权重和方案的评价等级。这样会引入主观因素,可能导致模型的不一致性。为了保证模型的一致性和可靠性,可以建立模型的一致性检验步骤,对模型进行检验和验证。

        3. 敏感性分析:在Topsis模型中,通过调整指标的权重来评估不同方案的优劣。然而,指标权重的确定往往是主观的,并且可能会受到多个因素的影响。为了克服这些问题,可以引入敏感性分析的方法,通过对不同权重组合下的模型结果进行分析,来确定最优的权重组合。

        通过以上修正方法,可以提高基于熵权法的Topsis模型的准确性和可靠性,使其更适用于实际决策问题。

 

引入 

如何度量信息量的大小

小张和小王是两个高中生。小张学习很差,而小王是全校前几名的尖子生。
高考结束后,小张和小王都考上了清华。小王考上了清华,大家都会觉得很正常,里
面没什么信息量,因为学习好上清华,天经地义,本来就应该如此的事情。
然鹅,如果是小张考上了清华,这就不一样了,这里面包含的信息量就非常大。怎么
说?因为小张学习那么差,怎么会考上清华呢?把不可能的事情变成可能,这里面就有很
多信息量。
注:本例子来自微信公众号:“小宇治水”

上面的小例子告诉我们:
越有可能发生的事情,信息量越少,
越不可能发生的事情,信息量就越多。

 

那么怎么衡量事情发生的可能性大小?
答:概率越大信息量越小


信息熵的定义


熵越大信息量越大还是越小

熵越大,信息量越小


熵权法的计算步骤


熵权法背后的原理

熵权法的讨论

熵权法的另一个问题:
因为概率p是位于0‐1之间,因此需要对原始数据进行标准化,我们应该选择哪种方式进行标准化呢?查看知网的文献会发现,
并没有约定俗成的标准,每个人的选取可能都不一样。但是不同方式标准化得到的结果
可能有很大差异,所以说熵权法也是存在着一定的问题的。

也就是说:

如果大家的论文要发表,别用熵权法
如果大家只是用这个方法进行比赛
那么可以随便用
因为这个方法总比你自己随意定义好


熵权法的代码实现

function [W] = Entropy_Method(Z)
% 计算有n个样本,m个指标的样本所对应的的熵权
% 输入
% Z : n*m的矩阵(要经过正向化和标准化处理,且元素中不存在负数)
% 输出
% W:熵权,1*m的行向量

 代码

 Entropy_Method

function [W] = Entropy_Method(Z)
% 计算有n个样本,m个指标的样本所对应的的熵权
% 输入
% Z : n*m的矩阵(要经过正向化和标准化处理,且元素中不存在负数)
% 输出
% W:熵权,1*m的行向量%% 计算熵权[n,m] = size(Z);D = zeros(1,m);  % 初始化保存信息效用值的行向量for i = 1:mx = Z(:,i);  % 取出第i列的指标p = x / sum(x);% 注意,p有可能为0,此时计算ln(p)*p时,Matlab会返回NaN,所以这里我们自己定义一个函数e = -sum(p .* mylog(p)) / log(n); % 计算信息熵D(i) = 1- e; % 计算信息效用值endW = D ./ sum(D);  % 将信息效用值归一化,得到权重    
end

mylog 

% 重新定义一个mylog函数,当输入的p中元素为0时,返回0
function [lnp] =  mylog(p)
n = length(p);   % 向量的长度
lnp = zeros(n,1);   % 初始化最后的结果for i = 1:n   % 开始循环if p(i) == 0   % 如果第i个元素为0lnp(i) = 0;  % 那么返回的第i个结果也为0elselnp(i) = log(p(i));  endend
end

 topsis

%%  第一步:把数据复制到工作区,并将这个矩阵命名为X
% (1)在工作区右键,点击新建(Ctrl+N),输入变量名称为X
% (2)在Excel中复制数据,再回到Matlab中右键,点击粘贴Excel数据(Ctrl+Shift+V)
% (3)关掉这个窗口,点击X变量,右键另存为,保存为mat文件(下次就不用复制粘贴了,只需使用load命令即可加载数据)
% (4)注意,代码和数据要放在同一个目录下哦。
clear;clc
load data_water_quality.mat%%  第二步:判断是否需要正向化
[n,m] = size(X);
disp(['共有' num2str(n) '个评价对象, ' num2str(m) '个评价指标']) 
Judge = input(['这' num2str(m) '个指标是否需要经过正向化处理,需要请输入1 ,不需要输入0:  ']);if Judge == 1Position = input('请输入需要正向化处理的指标所在的列,例如第2、3、6三列需要处理,那么你需要输入[2,3,6]: '); %[2,3,4]disp('请输入需要处理的这些列的指标类型(1:极小型, 2:中间型, 3:区间型) ')Type = input('例如:第2列是极小型,第3列是区间型,第6列是中间型,就输入[1,3,2]:  '); %[2,1,3]% 注意,Position和Type是两个同维度的行向量for i = 1 : size(Position,2)  %这里需要对这些列分别处理,因此我们需要知道一共要处理的次数,即循环的次数X(:,Position(i)) = Positivization(X(:,Position(i)),Type(i),Position(i));% Positivization是我们自己定义的函数,其作用是进行正向化,其一共接收三个参数% 第一个参数是要正向化处理的那一列向量 X(:,Position(i))   回顾上一讲的知识,X(:,n)表示取第n列的全部元素% 第二个参数是对应的这一列的指标类型(1:极小型, 2:中间型, 3:区间型)% 第三个参数是告诉函数我们正在处理的是原始矩阵中的哪一列% 该函数有一个返回值,它返回正向化之后的指标,我们可以将其直接赋值给我们原始要处理的那一列向量enddisp('正向化后的矩阵 X =  ')disp(X)
end
%% 作业:在这里增加是否需要算加权
% 补充一个基础知识:m*n维的矩阵A 点乘 n维行向量B,等于这个A的每一行都点乘B
% (注意:2017以及之后版本的Matlab才支持,老版本Matlab会报错)
% % 假如原始数据为:
%   A=[1, 2, 3;
%        2, 4, 6] 
% % 权重矩阵为:
%   B=[ 0.2, 0.5 ,0.3 ] 
% % 加权后为:
%   C=A .* B
%     0.2000    1.0000    0.9000
%     0.4000    2.0000    1.8000
% 类似的,还有矩阵和向量的点除, 大家可以自己试试计算A ./ B
% 注意,矩阵和向量没有 .- 和 .+ 哦 ,大家可以试试,如果计算A.+B 和 A.-B会报什么错误。%% 这里补充一个小插曲
% % 在上一讲层次分析法的代码中,我们可以优化以下的语句:
% % Sum_A = sum(A);
% % SUM_A = repmat(Sum_A,n,1);
% % Stand_A = A ./ SUM_A;
% % 事实上,我们把第三行换成:Stand_A = A ./ Sum_A; 也是可以的哦 
% % (再次强调,新版本的Matlab才能运行哦)%% 第三步:对正向化后的矩阵进行标准化
Z = X ./ repmat(sum(X.*X) .^ 0.5, n, 1);
disp('标准化矩阵 Z = ')
disp(Z)%% 让用户判断是否需要增加权重
disp("请输入是否需要增加权重向量,需要输入1,不需要输入0")
Judge = input('请输入是否需要增加权重: ');
if Judge == 1Judge = input('使用熵权法确定权重请输入1,否则输入0: ');if Judge == 1if sum(sum(Z<0)) >0   % 如果之前标准化后的Z矩阵中存在负数,则重新对X进行标准化disp('原来标准化得到的Z矩阵中存在负数,所以需要对X重新标准化')for i = 1:nfor j = 1:mZ(i,j) = [X(i,j) - min(X(:,j))] / [max(X(:,j)) - min(X(:,j))];endenddisp('X重新进行标准化得到的标准化矩阵Z为:  ')disp(Z)endweight = Entropy_Method(Z);disp('熵权法确定的权重为:')disp(weight)elsedisp(['如果你有3个指标,你就需要输入3个权重,例如它们分别为0.25,0.25,0.5, 则你需要输入[0.25,0.25,0.5]']);weight = input(['你需要输入' num2str(m) '个权数。' '请以行向量的形式输入这' num2str(m) '个权重: ']);OK = 0;  % 用来判断用户的输入格式是否正确while OK == 0 if abs(sum(weight) -1)<0.000001 && size(weight,1) == 1 && size(weight,2) == m  % 注意,Matlab中浮点数的比较要小心OK =1;elseweight = input('你输入的有误,请重新输入权重行向量: ');endendend
elseweight = ones(1,m) ./ m ; %如果不需要加权重就默认权重都相同,即都为1/m
end%% 第四步:计算与最大值的距离和最小值的距离,并算出得分
D_P = sum([(Z - repmat(max(Z),n,1)) .^ 2 ] .* repmat(weight,n,1) ,2) .^ 0.5;   % D+ 与最大值的距离向量
D_N = sum([(Z - repmat(min(Z),n,1)) .^ 2 ] .* repmat(weight,n,1) ,2) .^ 0.5;   % D- 与最小值的距离向量
S = D_N ./ (D_P+D_N);    % 未归一化的得分
disp('最后的得分为:')
stand_S = S / sum(S)
[sorted_S,index] = sort(stand_S ,'descend')% A = magic(5)  % 幻方矩阵
% M = magic(n)返回由1到n^2的整数构成并且总行数和总列数相等的n×n矩阵。阶次n必须为大于或等于3的标量。
% sort(A)若A是向量不管是列还是行向量,默认都是对A进行升序排列。sort(A)是默认的升序,而sort(A,'descend')是降序排序。
% sort(A)若A是矩阵,默认对A的各列进行升序排列
% sort(A,dim)
% dim=1时等效sort(A)
% dim=2时表示对A中的各行元素升序排列
% A = [2,1,3,8]
% Matlab中给一维向量排序是使用sort函数:sort(A),排序是按升序进行的,其中A为待排序的向量;
% 若欲保留排列前的索引,则可用 [sA,index] = sort(A,'descend') ,排序后,sA是排序好的向量,index是向量sA中对A的索引。
% sA  =  8     3     2     1
% index =  4     3     1     2

运行结果

总结

打比赛可以用,写论文发表还是且行且珍惜呀~~

 

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

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

相关文章

在word文档中自制代码段样式

附&#xff1a; 在word中插入高亮代码的网站 HighlightCode&#xff1a;https://highlightcode.com/ CodeInWord&#xff1a;http://codeinword.com/ 一、新建代码段样式 点击下拉按钮&#xff0c;选择创建样式&#xff0c;命名为代码段&#xff0c;然后点击修改 点击格式&a…

【Linux驱动】Linux中断(二)—— 按键中断驱动

前一篇已经在设备树的 gpio-led 节点中引入了中断信息&#xff0c;接下来将通过API来获取设备树中的中断信息。gpio-led 节点具体内容如下&#xff1a; gpio-key0 {pinctrl-names "default";pinctrl-0 <&pinctrl_gpio_keys>; // pinctrl子系…

linux性能优化

文章目录 性能优化图CPU进程和cpu原理性能指标 性能优化图 CPU 进程和cpu原理 进程与线程&#xff1a; 进程是程序的执行实例&#xff0c;有自己的地址空间和系统资源。线程是进程内的执行单元&#xff0c;共享进程的资源。在多核系统中&#xff0c;使用多线程可以更好地利用多…

【JS逆向】某乐网登陆密码加密逆向分析探索!

一个网站的登陆密码加密逆向解密分析&#xff0c;没有混淆&#xff0c;加密代码还是比较好找的&#xff0c;只需要多花点耐心&#xff0c;多尝试&#xff0c;就能找到关键的加密代码片段。 网址&#xff1a; aHR0cHMlM0EvL29hdXRoLmQuY24vYXV0aC9nb0xvZ2luLmh0bWw 登陆密码加密…

炼石免改造加密亮相2023商密大会,参编密评行业报告发布

2023年8月9-11日&#xff0c;2023商用密码大会在河南省郑州国际会展中心圆满召开&#xff0c;是我国商密领域规格最高、规模最大、影响最广的全国性商用密码盛会&#xff0c;也是《密码法》和新修订的《商用密码管理条例》正式实施以来的第一次全国性的盛会。大会以“密码赋能美…

excel 插件:Rainbow Analyst Crack

一个插件中包含四种 EXCEL 审核工具检测并修复隐藏的电子表格错误 不要满足于更少&#xff0c;四种领先的电子表格审计工具合二为一 Rainbow Analyst&#xff08;因其对颜色编码的独特强大使用而得名&#xff09;结合了世界级电子表格审核功能的多个领域&#xff1a; Excel™ …

关于如何设计出优秀的 URL

Kyle Aster 在 2010 年就写过为什么认真设计 URL 很重要&#xff1a; URL 是通用的&#xff0c;它们适用于 Firefox, Chrome, Safari, Internet Explorer, cURL, wget, 以及 iPhone&#xff0c;Android, 甚至便签。它们是网络的唯一通用语法&#xff0c;不要把这当作理所当然。…

LCR 145. 判断对称二叉树

解题思路&#xff1a; class Solution {public boolean checkSymmetricTree(TreeNode root) {return root null || recur(root.left, root.right);}boolean recur(TreeNode L, TreeNode R) {if(L null && R null) return true;if(L null || R null || L.val ! R.v…

Java 深入理解 AQS 和 CAS 原理

AQS 介绍 AQS 全称是 Abstract Queued Synchronizer&#xff0c;一般翻译为同步器。它是一套实现多线程同步功能的框架&#xff0c;由大名鼎鼎的 Doug Lea 操刀设计并开发实现的。AQS 在源码中被广泛使用&#xff0c;尤其是在 JUC&#xff08;Java Util Concurrent&#xff09;…

天融信Topgate搭建

一、下载防火墙 首先下载防火墙&#xff0c;在虚拟机中打开。 二、网卡配置 防火墙设备上有5块网卡&#xff0c;分别对应接口eth1~5 这里要手动添加&#xff0c;还有需要注意vmnet1&#xff0c;他的必须是192.168.1.0&#xff0c;并且为DHCP 其它vlan无需设置DHCP 自定义网…

跨站脚本攻击漏洞XSS绕过22种方式总结

XSS漏洞简介 跨站脚本攻击在目前这个时间节点还是属于一个排位比较高的漏洞&#xff0c;在OWASP TOP10 2021中隶属于注入型漏洞&#xff0c;高居TOP3的排位&#xff0c;可见这个漏洞的普遍性。跨站脚本攻击的学习中我们主要需要明白的是跨站的含义&#xff0c;以及XSS的核心。…

企业数据存储监控

随着组织及其网络基础架构的不断扩展&#xff0c;存储将不可避免地成为一项挑战&#xff0c;随着存储需求的增长&#xff0c;调配更多存储资源的需求也会随之增长。为基础架构配置了更多存储资源后&#xff0c;它们需要不间断地运行&#xff0c;并且应该免受威胁。从本质上讲&a…

Syn_SegNet:用于常规 3T MRI 中超高场 7T MRI 合成和海马亚场分割的联合深度神经网络

Syn_SegNet: A Joint Deep Neural Network for Ultrahigh-Field 7T MRI Synthesis and Hippocampal Subfield Segmentation in Routine 3T MRI Syn_SegNet&#xff1a;用于常规 3T MRI 中超高场 7T MRI 合成和海马亚场分割的联合深度神经网络背景贡献实验为了确定哪个模态分割最…

list1.Sort((m, n) => m.Id - n.Id); id是double类型的为什么回报错

问题产生的地方 原因 对于 double 类型的属性&#xff0c;不能直接使用减法运算符进行比较。减法运算符只能用于数值类型&#xff0c;而 double 是浮点数类型。 要在 double 属性上进行排序&#xff0c;可以使用 CompareTo 方法或者使用自定义的比较器。 更改 要在 double 属性…

K8s 源码剖析及debug实战之 Kube-Scheduler(五):优选算法详解

文章目录 0. 引言1. 回顾2. PrioritizeNodes3. 有哪些优选算法4. selectHost5. 总结6. 参考 0. 引言 欢迎关注本专栏&#xff0c;本专栏主要从 K8s 源码出发&#xff0c;深入理解 K8s 一些组件底层的代码逻辑&#xff0c;同时借助 debug Minikube 来进一步了解 K8s 底层的代码…

鸿蒙应用中图片的显示(Image组件)

目录 1、加载图片资源 1.1、存档图类型数据源 a.本地资源 b.网络资源 c.Resource资源 d.媒体库file://data/storage e.base64 1.2、多媒体像素图片 2、显示矢量图 3、添加属性 3.1、设置图片缩放类型 3.2、设置图片重复样式 3.3、设置图片渲染模式 3.4、设置图…

Go语言基本数据类型

Go语言基本数据类型 1.整型2.浮点型3.复数4.布尔型5.字符串窥探字符串类型字符串内建函数UTF-8编码字符串处理相关的四个包字符串和数字的转换 6.常量 1.整型 Go语言同时提供了有符号和无符号类型的整数运算。这里有int8、int16、int32和int64四种截然不同大小的有符号整数类型…

基于springboot公租房申请管理系统

开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven…

柯桥小语种学习,留学韩语 生活日常口语 语法

① N이다/A/V/았ㄹ/을지도 모르다 说不定 이미 도착했을 지도 모르니까 전화해 봐요 说不定已经到了&#xff0c;打电话试试 주말에 세일이 있을지도 모르니까 주말에 가 보자 周末说不定会搞活动&#xff0c;我们周末去吧 ② ㄴ/은/는/았었는/ㄹ/을지 모르다 不知道 처음이…

【webstorm中通过附加方式打开一个项目,这个项目本身有git,但是却看不到git的解决方法】

1、如图所示 设置-》版本控制-》未注册的根&#xff0c;选中后&#xff0c;再点加号&#xff0c;就可以了 2、如图所示 版本控制-》直接点加号-》选中项目路径&#xff0c;vcs选择git&#xff0c;点击确定就可以了