数学建模笔记 Topsis和熵权法

article/2025/11/10 5:14:03

Topsis法(Technique for Order Preference by Similarity to Ideal Solution)可翻译为逼近理想解排序法,国内常简称为优劣解距离法。

​ Topsis法是一种常用的综合评价方法,其能充分利用原始数据的信息, 其结果能精确地反映各评价方案之间的差距。

在之前,我们学习过层次分析法(AHP)。其中,层次分析法模型的局限性是需要我们构造判断矩阵,这具有很强的主观性,并且决策因子数量最好不超过10个。那么有没有一种客观的方法去判断各因子之间的权重呢?基于熵权法的Topsis模型可以解决这个问题。

本文借鉴了数学建模清风老师的课件与思路,如果大家发现文章中有不正确的地方,欢迎大家在评论区留言,也可以点击查看右侧链接查看清风老师视频讲解:【强烈推荐】清风:数学建模算法、编程和写作培训的视频课程以及Matlab等软件教学_哔哩哔哩_bilibili


一个小例子引出Topsis模型

​ 这样评分有不合理之处,若小王得分为10分,那么他的总评分还是为0.1分,这显然是不合理的。因此我们需要修改评价模型。

比较好的想法:

方法1

卷面最高成绩max:100

卷面最低成绩min:0

计算评分的公式:\frac{x-0}{100-0}

方法2

最高成绩max:99

最低成绩min:60

计算评分的公式:\frac{x-min}{max-min}

​ 对于这个问题,可能大家会选方法1去进行评分,但大多是实际情况下,是没有最大值这个项的,如:国家年GDP增速等数据。并且比较的指标往往不只是单方面的,如成绩、竞赛成绩等。因此方法2更适合我们去进行评分。

拓展:增加指标个数

新增加了一个指标,现在要综合评价四位同学,并为他们进行评分

成绩是越高越好,这样的指标称为极大型指标(效益型指标)。

与他人争吵的次数是越少越好,这样的指标称为极小型指标(成本型指标)。


第一步:指标正向化

统一指标类型

将所有的指标转化为极大型称为指标正向化


极小型➡极大型

**极小型指标转换为极大型指标的公式:**max-x(此公式不唯一,若数据都为正数,那么也可以使用\frac{1}{x},此公式合理即可)

中间型➡极大型

中间型指标: 指标值既不要太大也不要太小,取某特定值最好(如水质量评估 PH 值)。img是一组中间型指标序列,且最佳的数据为,那么正向化的公式如下:

img

因此img

img


区间型➡极大型

区间型指标:指标值落在某个区间内最好,例如人的体温在36°~37°这个区间比较好。

img


第一步代码展示

[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]: '); disp('请输入需要处理的这些列的指标类型(1:极小型, 2:中间型, 3:区间型) ')Type = input('例如:第2列是极小型,第3列是区间型,第6列是中间型,就输入[1,3,2]:  '); for i = 1 : size(Position,2) X(:,Position(i)) = Positivization(X(:,Position(i)),Type(i),Position(i));enddisp('正向化后的矩阵 X =  ')disp(X)
end

第二步:正向化矩阵标准化

标准化的目的就是消除不同量纲的影响。

假设有n个要评价的对象,m个评价指标(已经正向化了)构成的正向化矩阵如下:

img

那么对其标准化后的矩阵记为Z,Z的每一个元素:

img

即得到标准化矩阵Z(每一个元素/根号下所在列元素的平方和):

img

注意:标准化的方法不唯一,但目的都是为了去量纲。

那么对题目中的矩阵进行处理:

img


第二步代码展示

Z = X ./ repmat(sum(X.*X) .^ 0.5, n, 1);
disp('标准化矩阵 Z = ')
disp(Z)

第三步:计算得分并归一化

定义最大值:img

定义最小值:img

定义第i(i = 1,2,…,n)个评价对象与最大值的距离:

img

定义第i(i = 1,2,…,n)个评价对象与最小值的距离 :

img

那么,我们可以计算得出第 i( i = 1,2,…,n) 个评价对象未归一化的得分:

img

很明显 0≤Si≤1,且 Si 越大 Di+ 越小,即越接近最大值。


得分结果如下


第三问代码展示

D_P = sum([(Z - repmat(max(Z),n,1)) .^ 2 ],2) .^ 0.5;
D_N = sum([(Z - repmat(min(Z),n,1)) .^ 2 ],2) .^ 0.5; 
S = D_N ./ (D_P+D_N);   
disp('最后的得分为:')
stand_S = S / sum(S)
[sorted_S,index] = sort(stand_S ,'descend')

模型拓展

熵权法

信息量


信息熵

事件所有发生情况的概率相等时,信息熵取最大值(只需要知道,不需要证明)

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

对于熵权法而言,因为我们关注的是已有的信息,所以答案是越小(后面大家看到计
算步骤就会明白)

计算步骤

  1. 对正向化的矩阵进行标准化,

如果有非负数,则采用标准化方式:(xij-该列最小值)/(该列最大值-该列最小值)

  1. 计算每一列(每一个指标)中每个元素所占比重,看作计算相对熵时要用到的概率

标准化后的矩阵

pij= zij/所在列的和

(这种求法有待商榷,但是大家都这么用)

  1. 计算每个指标信息熵

两个小问题的说明

  • 除lnn,使信息熵ej落在[0,1]之间。因为信息熵越大,所含信息越小。
  • 所以用1-ej来表示信息效用值,效用值越大,所含信息越多

  • 将信息效用进行归一化

背后原理

  • 问题

基于熵权法的Topsis模型:

img

​ 我们在上面讨论时,有一个问题没有考虑,就是两个指标之间的权重关系,因为层次分析法是一个比较主观的计算权重方法,在这里会介绍一个客观的求权重方法:熵权法

​ 熵权法的原理是指标的变异程度越小,所反映的信息量也越少,其对应的权值也应该越低。因此数据本身就告诉了我们权重。所以说熵权法是一种客观的方法。但就如评价三好学生的例子,只有学习成绩与违纪次数去评价一个学生,使用了熵权法之后,反而违纪次数的权重近于0,显然不符合常理。因此使用此方法后我们需要人工干预,判断一下权重是否合理(如2021年国赛C283论文)。若不合理,可通过层次分析法去修正权重大小。


熵权法代码展示

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


模型总结

​ Topsis优劣解距离法模型是一种常用的综合评价方法,能充分利用原始数据的信息,其结果能精确地反映各评价方案之间的差距。相对于层次分析法而言,Topsis法是解决决策层中数据已知的评价类模型。它可以解决多数据量的题目,数据计算简单易行。但对于各数据量之间的关系,我们需要使用熵权法或层次分析法来建立权重。

​ 熵权法的原理是指标的变异程度越小,所反映的信息量也越少,其对应的权值也应该越低。因此数据本身就告诉了我们权重。所以说熵权法是一种客观的方法。但就如评价三好学生的例子,只有学习成绩与违纪次数去评价一个学生,使用了熵权法之后,反而违纪次数的权重近于0,显然不符合常理。因此使用此方法后我们需要人工干预,判断一下权重是否合理(如2021年国赛C283论文)。综合来说,在比赛中,对于决策层中数据已知的问题,使用Topsis模型十分合适。

​ 解题步骤:1.熵权法确定权重

​ 1.1数据标准化

​ 1.2求出各指标的信息熵

​ 1.3计算各指标的差异系数

​ 1.4确定各指标的权重

​ 1.5分别用权重乘以归一化后的数据

​ 2.将原始矩阵正向化 (变为极大型指标)

​ 3.正向化矩阵标准化

​ 4.确定最优方案和最劣方案

​ 5.计算各评价对象与最优方案、最劣方案的接近程度

​ 6.计算各评价对象与最优方案的贴近程度

​ 7.根据贴近程度大小进行排序,给出评价结果

​ 其优点为:1.避免了数据的主观性,不用通过检验,能够很好的刻画多个影响指标的综合影响力度

​ 2.评估程序简单,计算过程简单易懂。

​ 3.对于数据分布及样本量、指标多少无严格限制,既适于小样本资料,也适于多评价单元、多指标的大系统,较为灵活、方便

​ 其缺点为:1.必须有两个以上的研究对象才可以进行使用

​ 2.需要的每个指标的数据,对应的权重计算会有一定难度

​ 3.不确定指标的选取个数为多少适宜,才能够很好刻画指标的影响力度

​ 总结来说:Topsis法是评价类模型,在多个研究对象的情况下,计算灵活、方便,适合在评价类问题使用,可以与计算权重类模型相结合加以论证。

一张图片总结 img

本文借鉴了**数学建模**清风老师的课件与思路,如果大家发现文章中有不正确的地方,欢迎大家在评论区留言,也可以点击查看右侧链接查看清风老师视频讲解:【强烈推荐】清风:数学建模算法、编程和写作培训的视频课程以及Matlab等软件教学_哔哩哔哩_bilibili


http://chatgpt.dhexx.cn/article/8ushBPaf.shtml

相关文章

Topsis与熵权法

定义 熵权法是一种客观赋权方法。 原理&#xff1a;指标的变异程度&#xff08;方差&#xff09;越小&#xff0c;所反映的信息量也越少&#xff0c;其对应的权值也应该越低。&#xff08;客观 数据本身就可以告诉我们权重&#xff09; 如何度量信息量的大小 通过上面的例子…

数学建模之熵权法——基于Topsis模型

写在前文&#xff1a;懒编是准备参加数学建模&#xff0c;并且负责编程部分&#xff08;matlab&#xff09;。因为时间有限&#xff0c;所以目前个人的看法就是以编程学习&#xff08;因为是小白&#xff09;为主&#xff0c;模型学习为辅&#xff08;这里的辅是知道这个模型怎…

Matlab计算熵权法

如需转载&#xff0c;请注明来源&#xff0c;谢谢合作。 若本文对您有一点点的帮助&#xff0c;欢迎点赞、评论和关注。您的鼓励和支持是我继续学习和分享的动力。 **熵权法是一种根据包含各个变量的变异程度进行赋权的方法&#xff0c;是一种客观赋权法。**而直接给定变量权重…

数学建模系列---熵权法

目录 一.简介 二.说明 1.正向指标&#xff1a; 2.信息量 3.信息熵 三.具体计算步骤 1.标准化矩阵 1.1该步骤的意义 1.2标准化的2种方法 2.计算各元素概率 3.计算各指标的权重 3.1计算每个指标的信息熵 3.2计算信息效用值 3.3归一化信息效用值 四.总结 一.简介 熵权…

数学建模——熵权法

一、熵权法基础知识 熵值越小越好; 熵权法是一种可以用于多对象、多指标的综合评价方法&#xff0c;其评价结果主要是依据客观资料&#xff0c;熵权法几乎不受主观因素的影响。 信息熵值越小&#xff0c;权重越大 二、熵权法基本思路 权重大-->提供的信息量大-->指标…

清风数学建模学习笔记——熵权法(客观赋权法)

熵权法 熵权法是一种客观赋权方法。&#xff08;客观 数据本身就可以告诉我们权重&#xff09; 依据的原理&#xff1a;指标的变异程度越小&#xff0c;所反映的信息量也越少&#xff0c;其对应的权值也应该越低。 本文借鉴了数学建模清风老师的课件与思路&#xff0c;如果大家…

熵权法 —— matlab

目录 一、熵权法介绍 二、熵权法赋权步骤 1.指标正向化 mapminmax介绍 2.数据标准化 3.计算信息熵 4.计算权重以及得分 三、实例分析 1.读取数据 2.指标正向化 2.1 越小越优型处理 2.2 某点最优型指标处理 3.数据标准化 4.计算信息熵 5.计算权重 6.计算得分 总…

数学建模——熵权法步骤及程序详解

数学建模——熵权法步骤及程序详解 权重的求解一直都是数学建模的重点关注对象&#xff0c;所以学好建模论文的重要一步就是如何确定权重&#xff0c;今天是来介绍一种客观确定几个指标各自所占的权重的方法——熵权法。之前的数学建模实战里有提到用熵权法确定了每个指标各自…

计算机电路知识,计算机电路基础教程(完整版)

计算机电路基础教程(完整版) 名称&#xff1a;计算机电路基础教程(完整版)分类&#xff1a;电脑基础 点击&#xff1a;加载中主讲&#xff1a;时间&#xff1a;2014-10-13 09:22 计算机电路基础教程(完整版)相关介绍 计算机电路是计算机专业和电子信息类专业的一门重要硬件基础…

大学计算机基础案例教程章测试答案,大学计算机基础案例教程--Win7+Office2010(高等院校公共基础课规划教材)...

导语 内容提要 尹建新编著的这本《大学计算机基础案例教程&#xff0d;&#xff0d;Win7&#xff0b;Office2010》是针对普通高等院校非计算机专业的教学要求&#xff0c;依托Windows 7操作系统和Office 2010办公软件平台&#xff0c;结合当今最新计算机技术编写而成的。本书最…

计算机系统新手入门,电脑初学者入门教程

本篇主要从关机、任务管理器、电脑屏幕锁定这三个方面&#xff0c;帮助初次学习电脑的人尽快掌握一些基本操作&#xff0c;快一起来学习吧。 工具/材料 电脑(本篇以Windows7系统为例) 电脑关机 01方法一。首先&#xff0c;点击屏幕左下方的win(当点击时&#xff0c;会提示“开始…

电子计算机入门教程,「冯修远」计算机入门0基础教程:Word文档的基本操作

冯修远:Word文档的基本操作 人生就像一场修行,任重而道远。大家好,我是冯修远,一位专注于IT教育行业及编程技术和网络营销的人士。通过对《「冯修远」计算机入门0基础教程:office的安装》的学习,大家应该都应安装好了word。我在《「冯修远」计算机入门0基础教程:office的…

RecyclerView添加Header的正确方式

看了一下博客目录&#xff0c;已经有好几篇博客是关于RecyclerView的&#xff0c;不过对于这么一款强大的控件&#xff0c;我还是要再写一篇博客来学习一下&#xff0c;这篇博客的主题是《为RecyclerView添加header》&#xff0c;当然在看完这篇博客后&#xff0c;相信添加Foot…

Android-第七节RecyclerView详解

目录 一、RecyclerView概述二、RecyclerView使用步骤三、布局管理器 一、RecyclerView概述 RecyclerView是support-v7包中的新组件&#xff0c;是一个强大的滑动组件&#xff0c;与经典的ListView相比&#xff0c;同样拥有item回收复用的功能&#xff0c;这一点从它的名字Recyc…

RecyclerView不显示问题

当我们使用RecyclerView控件的时候可能遇到不显示问题&#xff0c;一般分为以下情况&#xff0c; 一、RecyclerView和ScrollView嵌套使用出现RecyclerView不显示的问题&#xff0c; 首先要确保你从服务端拿到的数据不是空的&#xff0c; 1.第一种解决方式&#xff1a; 只需…

RecycleView

一. 在build.gradle中添加依赖 implementation androidx.recyclerview:recyclerview:1.1.0二. activity_main.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"…

Android学习之RecyclerView

RecyclerView是android-support-v7-21版本中新增的一个Widget,官方介绍RecyclerView 是 ListView 的升级版本,更加先进和灵活。 开发环境 - IDE: ADT - SDK: Android L 首先在Android SDK Manager上下载Android Support Repository, 它会在sdk/extras/android目录下生成m2…

Android——RecyclerView入门学习之RecyclerView.Adapter

学习资料&#xff1a; 鸿洋大神为RecyclerView打造通用Adapter让RecyclerView更加好用鸿洋大神Android优雅的为RecyclerView添加HeaderView和FooterView 之前使用RecyclerView.Adapter&#xff0c;基本就类似套用公式&#xff0c;死步骤&#xff0c;对Adapter感到既熟悉又陌生…

Android——RecyclerView的使用

RecyclerView 参考&#xff1a;《第一行代码》第二版——郭霖 可以用RecyclerView来显示多行列表。 recycle 循环回收再利用。 通过一个水果列表来学习RecyclerView 准备工作&#xff0c;在app/build.gradle文件中导入依赖 dependencies {implementation androidx.appcompat:a…

RecyclerView(二)—— RecyclerView的使用

RecyclerView ListView由于强大的功能&#xff0c;在过去的Android开发当中可以说是贡献卓越&#xff0c;直到今天仍然还有不计其数的程序在使用ListView。不过ListView并不是完美无缺的&#xff0c;比如如果不使用一些技巧来提升它的运行效率&#xff0c;那么ListView的性能就…