赞
踩
TOPSIS(Technique for Order Preference by Similarity to Ideal Solution)直译为逼近理想解排序法,国内常简称为优劣解距离法。
TOPSIS是一种常用评价模型,优点在于能充分利用原始数据的信息,其结果能精确反映各个评价方法之间的差距。
TOPSIS和AHP(层次分析法)的主要差异在于功能和适用问题范围的差异:
两者在实际中可结合使用。
TOPSIS 的核心原理是指标正向化与标准化消除量纲影响两个方法的合理性。这两个方法也是 TOPSIS 和 AHP 的主要区别。
两个方法的合理性已经由运筹学家严格证明,因此只需要我们在使用时用合理的语言稍加阐释即可。
看到这里发现我的线性代数已经差不多忘完了…
接下来根据例题来讲解模型的步骤以及实现,并且补充相应的知识。
小明所在宿舍共有四名同学,他们该学期的线代成绩以及与他人的干架次数如下表所示,请为这四名同学评分,使评分能合理地描述综合成绩地高低。
姓名 | 线代成绩 | 与他人干架次数 |
---|---|---|
小明 | 89 | 2 |
小王 | 60 | 0 |
小张 | 74 | 1 |
小李 | 99 | 3 |
TOPSIS中的数据可被分为四种:
例如在上述表格中,线代成绩当然是越高越好,所以是极大型指标。与他人干架次数按常理是越少越好,所以是极小型指标。(但也有人干架最多考的最好)
原始矩阵正向化指的是在TOPSIS方法中要将所有指标统一正向化,即将所有指标统一转化为极大型指标,意味着极小型指标、中间型指标、区间型指标需要转化为极大型指标。
转化公式:MAX - X
如果所有元素同为正数,转化公式也可为:1/X,公式不唯一。
姓名 | 与他人干架次数 | 正向化后的与他人干架次数 |
---|---|---|
小明 | 2 | 3 - 2 = 1 |
小王 | 0 | 3 - 0 = 3 |
小张 | 1 | 3 - 1 = 2 |
小李 | 3 | 3 - 3 = 0 |
{xi} 是一组中间型指标序列,且最佳数据为xbest ,那么正向化的公式如下:
M = max{ | xi - xbest | }, xi’ = 1 - | xi - xbest | / M
{xi} 是一组区间型指标序列,且最佳区间为
[a, b],那么正向化的公式如下:
M = max{a - min{xi}, max{xi} - b}
xi < a 时,xi’ = 1 - (a - xi) / M
a <= xi < = b 时,xi’ = 1
xi > b 时,xi’ = 1 - (xi - b) / M
标准化的目的是消除不同量纲的影响。
假设由m个要评价的对象,n个已正向化的评价指标构成的正向化矩阵如下:
标准化后的矩阵记为Z,Z 中的每个元素转换公式为:
PS:标准化的方式不唯一
此处建议手算感受一下:
最大值:
最小值:
默认在各项指标的权重相同情况下计算:
第i个评价对象与最大值的(欧式)距离:
第i个评价对象与最小值的(欧式)距离:
实际中的评价指标都有各自的权重,利用权重修正后的距离公式如下:
ω 可以由偏主观的层次分析法得出,也可由偏客观的熵权法(熵权法我会在文末补充)得出,主客观结合算出的权重更有说服力。
计算得出第i个评价对象未归一化的得分:
由上式定义可得 0 <= Si <= 1 ,且 Si 越大 Di 越小,该评价对象与最大值的距离越小。
得分的计算公式等价于:
回到题目中,先看一下标准化后的矩阵,免得大家往上拉了:
姓名 | 线代成绩 | 与他人干架次数 |
---|---|---|
小明 | 0.5437 | 0.2673 |
小王 | 0.3665 | 0.8018 |
小张 | 0.4520 | 0.5345 |
小李 | 0.6048 | 0 |
那么最大值 Z+ = [0.6048, 0.8018], Z- = [0.3665, 0]
真男人来手算一下:
归纳为表格:
姓名 | D+ | D- | 未归一化得分 | 归一化后得分 |
---|---|---|---|---|
小明 | 0.5380 | 0.3206 | 0.3734 | 0.1857 |
小王 | 0.2383 | 0.8018 | 0.7709 | 0.3834 |
小张 | 0.3079 | 0.5413 | 0.6374 | 0.3170 |
小李 | 0.8018 | 0.2383 | 0.2291 | 0.1139 |
TOPSIS 优劣解距离算法,主要利用数据信息精确反映评价方案之间的优劣差距。
TOPSIS 法多用于解决多指标的决策性问题,实现原理为计算各方案与正负理想解之间的相对距离进行排序并评分选择。主要步骤及作用如下:
topsis.m
%% 加载数据 clear;clc load data.mat %data.mat为原始数据矩阵,行为评价对象,列为评价指标 %% 第一步:正向化(极小型、中间型、区间型转极大型) [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,4] disp('请输入需要处理的这些列的指标类型(1:极小型, 2:中间型, 3:区间型) ') Type = input('例如:第2列是极小型,第3列是区间型,第6列是中间型,就输入[1,3,2]: '); %[2,1,3] for i = 1 : size(Position,2) %这里需要对这些列分别处理,因此我们需要知道一共要处理的次数,即循环的次数 X(:,Position(i)) = Positivization(X(:,Position(i)),Type(i),Position(i)); end disp('正向化后的矩阵 X = ') disp(X) end %% 第二步:对正向化矩阵标准化 Z = X ./ repmat(sum(X.*X) .^ 0.5, n, 1); disp('标准化矩阵 Z = ') disp(Z) %% 第三步:计算与最大值和最小值的距离,并计算得分 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'); disp('标准化后得分为:') disp(sorted_S) disp('对应的下标为:') disp(index)
Inter2Max.m
function [posit_x] = Inter2Max(x,a,b)
r_x = size(x,1); % row of x
M = max([a-min(x),max(x)-b]);
posit_x = zeros(r_x,1); %zeros函数用法: zeros(3) zeros(3,1) ones(3)
% 初始化posit_x全为0 初始化的目的是节省处理时间
for i = 1: r_x
if x(i) < a
posit_x(i) = 1-(a-x(i))/M;
elseif x(i) > b
posit_x(i) = 1-(x(i)-b)/M;
else
posit_x(i) = 1;
end
end
end
Mid2Max.m
function [posit_x] = Mid2Max(x,best)
M = max(abs(x-best));
posit_x = 1 - abs(x-best) / M;
end
Min2Max.m
function [posit_x] = Mid2Max(x,best)
M = max(abs(x-best));
posit_x = 1 - abs(x-best) / M;
end
Positivization.m
function [posit_x] = Positivization(x,type,i) % 输入变量有三个: % x:需要正向化处理的指标对应的原始列向量 % type: 指标的类型(1:极小型, 2:中间型, 3:区间型) % i: 正在处理的是原始矩阵中的哪一列 % 输出变量posit_x表示:正向化后的列向量 if type == 1 %极小型 disp(['第' num2str(i) '列是极小型,正在正向化'] ) posit_x = Min2Max(x); %调用Min2Max函数来正向化 disp(['第' num2str(i) '列极小型正向化处理完成'] ) disp('~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~') elseif type == 2 %中间型 disp(['第' num2str(i) '列是中间型'] ) best = input('请输入最佳的那一个值: '); posit_x = Mid2Max(x,best); disp(['第' num2str(i) '列中间型正向化处理完成'] ) disp('~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~') elseif type == 3 %区间型 disp(['第' num2str(i) '列是区间型'] ) a = input('请输入区间的下界: '); b = input('请输入区间的上界: '); posit_x = Inter2Max(x,a,b); disp(['第' num2str(i) '列区间型正向化处理完成'] ) disp('~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~') else disp('没有这种类型的指标,请检查Type向量中是否有除了1、2、3之外的其他值') end end
熵权法(Entropy Weight Method, EWM)是源自于信息论基本原理的解释,信息是系统有序程度的一个度量,熵是系统无序程度的一个度量(我只在化学里学过…)
熵权法的基本思路是根据指标变异性的大小来确定客观权重。
一般来说,若某个指标的信息熵越小,表明指标值得变异程度越大,提供的信息量越大,在综合评价中所能起到的作用也越大,权重也就越大;相反,某个指标的信息熵越大,表明指标值得变异程度越小,提供的信息量也越少,在综合评价中所起到的作用也越小,其权重也就越小。
先直接对原始矩阵进行标准化操作,即进行上述TOPSIS算法步骤中的步骤二基础上,再进行归一化(在上述步骤三中提及)计算,得到已经归一化矩阵:
第j项指标下第i个样本值占该指标的比重:
第j项指标的熵值:
第j项指标的差异系数:
第j项指标的权重:
以上笔记内容基于学习:
[1] 数学建模算法与应用/司守奎, 孙兆亮主编. —2版. —北京:国防工业出版社,2015.4
[2] https://blog.csdn.net/qq_58602552/article/details/129960986
[3] https://zhuanlan.zhihu.com/p/545071388
[4] https://www.zhihu.com/question/357680646/answer/943628631
仅供参考学习
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。