数学建模笔记2-TOPSIS&熵权法

为什么要有TOPSIS?

C.L.Hwang 和 K.Yoon 于1981年首次提出 TOPSIS (Technique for Order Preference by Similarity to an Ideal Solution),可翻译为逼近理想解排序法。

TOPSIS 法是一种常用的综合评价方法,能充分利用原始数据的信息,其结果能精确地反映各评价方案之间的差距。基本过程为先将原始数据矩阵统一指标类型(一般正向化处理)得到正向化的矩阵,再对正向化的矩阵进行标准化处理以消除各指标量纲的影响,并找到有限方案中的最优方案和最劣方案,然后分别计算各评价对象与最优方案和最劣方案间的距离,获得各评价对象与最优方案的相对接近程度,以此作为评价优劣的依据。该方法对数据分布及样本含量没有严格限制,数据计算简单易行。

层次分析法的局限

1.评价的决策层不能太多,否则就会使一致矩阵中的阶数n很大,判断矩阵和一致矩阵的差异就会很大

2.如果决策层中的指标的数据是已知的,我们可能无法充分利用

3.构造出的判断矩阵相对主观

模型原理

TOPSIS法是一种理想目标相似性的顺序选优技术,在多目标决策分析中是一种非常有效的方法。它通过归一化后(去量纲化) 的数据规范化矩阵,找出多个目标中最优目标和最劣目标(分别用理归想一解化和反理想解表示),分别计算各评价目标与理想解和反理想解的距离,获得各目标与理想解的贴近度,按理想解贴近度的大小排序,以此作为评价目标优劣的依据。贴近度取值在0~1之间,该值愈接近1.表示相应的评价目标越接近最优水平:反之,该值愈接近0,表示评价目标越接近最劣水平。

基本步骤

  • 原始矩阵正向化(将所有的指标类型统一转化为极大性指标)
  • 正向矩阵标准化(去除量港的影响,保证不同评价指标在同一数量级,同时数据大小排序不变)
  • 计算得分并归一化

一个简单的例子

现在,你们班里面假如有四个人(为了方便李姐,就四个了哈),进行过一场考试之后,有了一个排名,通过这个排名,听好,是通过排名,来个这四位同学评个分,你认为合适吗?就像这样:

姓名成绩排名修正后的排名评分
WY99144/10=0.4
NY60411/10=0.1
RY74322/10=0.2
HC89233/10=0.3

看上去没什么问题对吗,但是想一下下面这个极端的情况,也就是,当考分有了变化但是排名没有变化的时候,其评分依旧是保持不变的

也就是说,假如这四个人里面有一个是你,同样难度的卷子,第一次考试你考了那么多分,排名一个样子,第二次考试,分数进步了,但是排名没有变化,所以你的评分还是那么多。你的有些努力,被忽视了,有没有一种失落?

这就说明我们的评分机制出现了一些问题,我们这样行不行?

回顾一下咱们刚刚说的,那是一个和排名紧密相关的评分机制,那么为了避免忽视“一些努力”,我们把评分机制改成和分数相关的一种方式:

姓名成绩未归一化的评分归一化之后的评分
WY99(99-60)/(99-60)=11/2.1=0.48
NY60(60-60)/(99-60)=00/2.1=0
RY74(74-60)/(99-60)=0.360.36/2.1=0.17
HC89(89-60)/(99-60)=0.740.74/2.1=0.35

我们看到,第一名的评分始终为1,最后一名的评分始终为0。这种方法,除需要最后一位需要有一颗大心脏,没什么不好。为了照顾一下最后一名,你有没有一种这样的想法:

这样的话,岂不是对所有人都公平了,除非是极端优秀——考了满分,不然对所有人都公平。

姓名成绩未归一化的评分归一化之后的评分
WY990.990.30
NY600.600.19
RY740.740.23
HC890.890.28

但是,我们需要考虑一个问题,我们评价的对象,只有考分吗?能不能是GDP?能不能是光照强度?能不能是宇宙微波背景辐射?我的意思是,有些指标,他没有明显的上下限,所以说,最后一种方法就有点捉襟见肘。回看倒数第二种方法,除了第一和最后一名,这并没有什么不好,毕竟我们真到了统计的时候,对象的数量可能更多,等下我们还会进行归一化处理,所以说,我们选择倒数第二种方法。

总结下来,我们因为注意到了以下的问题,所以选用和评分相关性较大的一种评分机制。

接下来,为了能让这种方法能在更多的地方有用武之地,我们新增几种可以用这种方式进行统计的指标类型。

几种新的指标类型及其转化方式

为了在进行统计时更加方便,我们需要把不同的指标都转化成极大型指标,或者称为效益型指标,也就是,越大越好的,就比如我们刚提到的成绩,考分。下面的转化形式只是很多种方式的一种,如果遇见更好的,当然也可以用。

极小型指标(成本型指标)

顾名思义,越小越好的指标,就比如说,你进橘子的次数【doge】,每天摸鱼的时间【bushi】。

中间型指标

区间型指标

标准化处理

将指标转换成同一种类型之后,我们还需要对其进行标准化处理,毕竟,力的大小牛顿和光照强度坎德拉不能一拉过来就比较,所以,标准化的意义就在于:消除不同量纲。

这里对得分的计算过程进行一下说明

归一化评分

在统计和加工完成之后,我们最好对分数进行归一化处理,注意,这样并不会影响评分的质量。

基于熵权法对TOPSIS模型的修正

我们刚刚说过,层次分析发的缺点主要就是,主观性太强,哪怕指标都是专家给的,你能确保每一位专家的水平都很高么?万一人家是砖家呢?

有什么好办法?熵权法。

基本概念

  1. 熵权法,源于物理学,借用信息论的核心观点来解释,就是将信息看作是衡量系统有序性的标准,而熵则是衡量系统混乱或无序程度的标准。根据这一理论,我们可以通过计算信息熵的数值来判断某一指标的分布离散情况。具体来说,一个指标的信息熵值越小,表示这个指标的数值分布越离散,这意味着该指标在整体评价中的影响力或权重更大。相反,如果一个指标的所有数值都相同,那么这个指标在综合评价中就没有实际作用。因此,我们可以运用信息熵这一工具来科学计算各个评价指标的权重,从而为多指标的综合评价提供有力的数据支撑。

  2. 熵权法作为一种客观且公正的权重分配方法,其特点在于,它完全依赖于数据本身来确定每个指标的权重,避免了主观判断的干扰。

  3. 基本原理是:一个评价指标的数值变异程度越小,说明它提供的信息量就越少,因此在整体评价中,这个指标的权重也应当相应地降低。这种方法能够更精确地反映出每个指标在整体评价中的真实价值和影响力。

基本步骤

  • 数据标准化

  • 计算概率矩阵P,第 j 项指标下第 i 个样本所占的比重

  • 计算熵权

而熵权法以来的,是数据的变异程度。

变异程度是什么意思呢,你可以理解它为方差,一组数据的方差越小,说明数据的波动越小,反之则越大。

图中圆括号中所说,当所有的样本,同一指标都是一个数,相同的数值,那么这个指标可要可不要,毕竟这个指标并没有给我们带来任何多余的信息量。

理论没听明白?好的,假如你现在要买手机,现在摆在你面前的三款手机,它们的尺寸几乎相同,那些轻微的差别不会给你的手感带来特别大的影响,那么“尺寸”这个指标是不是就不需要考虑了,毕竟几乎没有变化。

下面介绍一点有关信息,

信息是什么?

这是文心一言4.0给我的回答。

大概理解了哈。

事件发生概率越小,当事件发生时,所反映的信息量就越大。听不懂?么事,咱举个例子:oi~达瓦里希,巴黎奥运会国乒赢回来了五块金牌。信息量大么?不大,毕竟国乒队最不缺的就是世界冠军(doge);好的那么如果我说,咱国足踢赢了欧洲那几个国家,信息量大么?这可太大了。

我们又应该如何度量信息的多少呢?

信息熵

原理大概讲完了,现在开始讲公式

熵权法的计算步骤

注意这一步,评价指标如果没有正向化,矩阵没有意义。

熵权法背后的原理

我们可以用指标的标准差来衡量标本的变异程度,指标的标准差越大,其信息熵越小。

TOPSIS和MATLAB

EXCEL在MATLAB中的操作

%%  第一步:把数据复制到工作区,并将这个矩阵命名为X
% (1)在工作区右键,点击新建(Ctrl+N),输入变量名称为X
% (2)在Excel中复制数据,再回到Matlab中右键,点击粘贴Excel数据(Ctrl+Shift+V)
% (3)关掉这个窗口,点击X变量,右键另存为,保存为mat文件(下次就不用复制粘贴了,只需使用load命令即可加载数据)
% (4)注意,代码和数据要放在同一个目录下哦,且Matlab的当前文件夹也要是这个目录。

%	下次打开同一个文件,别忘了你的文件名字是什么

clear;clc
load data_water_quality.mat
%% 注意:如果提示: 错误使用 load,无法读取文件 'data_water_quality.mat'。没有此类文件或目录。
% 那么原因是因为你的Matlab的当前文件夹中不存在这个文件
% 可以使用cd函数修改Matlab的当前文件夹
% 比如说,我的代码和数据放在了: D:数模笔记2_TOPSIS
% 那么我就可以输入命令:
% cd 'D:数模笔记2_TOPSIS'

如果说有些你在load了之后没有打开,或者报错了,你改一下“当前文件夹”,改为你文件所在位置(你打开的代码文件和你所要编辑和想要打开的数据文件所在的文件夹)

可以把你打开的文件夹的上面的路径复制一下放到MATLAB上面。

矩阵正向化和标准化

%%  第二步:判断是否需要正向化
[n,m] = size(X);
disp(['共有' num2str(n) '个评价对象, ' num2str(m) '个评价指标']) 
Judge = input(['这' num2str(m) '个指标是否需要经过正向化处理,需要请输入1 ,不需要输入0:  ']);

if Judge == 1
    Position = input('请输入需要正向化处理的指标所在的列,例如第2、3、6三列需要处理,那么你需要输入[2,3,6]: '); %[2,3,6]
    disp('请输入需要处理的这些列的指标类型(1:极小型, 2:中间型, 3:区间型) ')
    Type = input('例如:第2列是极小型,第3列是区间型,第6列是中间型,就输入[1,3,2]:  '); %[1,3,2]
    % 注意,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:区间型)
    % 第三个参数是告诉函数我们正在处理的是原始矩阵中的哪一列
    % 该函数有一个返回值,它返回正向化之后的指标,我们可以将其直接赋值给我们原始要处理的那一列向量
    end
    disp('正向化后的矩阵 X =  ')
    disp(X)
end

%% 第三步:对正向化后的矩阵进行标准化
Z = X ./ repmat(sum(X.*X) .^ 0.5, n, 1);
disp('标准化矩阵 Z = ')
disp(Z)

MATLAB中定义的函数要单独放在一个文件里面,并且,这个文件要和我们要用这个函数的文件在同一个文件夹里面。

否则将会报错:此上下文中不允许函数定义

幻方矩阵与sort函数

%% 第四步:计算与最大值的距离和最小值的距离,并算出得分
D_P = sum([(Z - repmat(max(Z),n,1)) .^ 2 ],2) .^ 0.5;   % D+ 与最大值的距离向量
D_N = sum([(Z - repmat(min(Z),n,1)) .^ 2 ],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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值