MATLAB 之 优劣解距离法(TOPSIS )

这篇具有很好参考价值的文章主要介绍了MATLAB 之 优劣解距离法(TOPSIS )。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、TOPSIS 简介

  • TOPSIS 是一种常用的综合评价方法,可以充分利用 原始数据 的信息,其结果可以精确地反映各评价方案之间的差距。
  • TOPSIS 是一种逼近于理想解的排序法,该方法只要求各效用函数具有单调递增(或递减)性就行。
  • TOPSIS 是多目标决策分析中一种常用的有效方法,又称为优劣解距离法。
  • TOPSIS 对样本容量没有严格限制,数据计算简单易行,无需数据检验。

二、TOPSIS 步骤

1:将原始矩阵正向化,得到正向化矩阵

1.1 指标类型

指标名称 指标特点 例子
极大型(效益性)指标 越大(多)越好 成绩、GDP增速、企业利润
极小型(成本型)指标 越小(少)越好 费用、坏品率、污染程度
中间型指标 越接近某个值越好 水质量评估时的PH值
区间型指标 落在某个区间最好 体温、水中植物性营养物量

1.2 正向化公式

正向化就是将原始数据指标都转化为极大型指标。

符号 含义
max 一列当中最大的元素
xbest 区间最好的值
a 区间下限
b 区间上限
  • 极小型指标转换为极大型指标:max−x,如果所有的元素均为正数,那么也可以使用:1 / x 。
  • 中间型指标转换为极大型指标:MATLAB 之 优劣解距离法(TOPSIS )
  • 区间型指标转换为极大型指标:MATLAB 之 优劣解距离法(TOPSIS )

2. 正向化矩阵标准化

标准化的目的是消除不同指标量纲的影响。
假设有 n 个要评价对象,m个评价指标(已经正向化了)构成的正向化矩阵如下:
MATLAB 之 优劣解距离法(TOPSIS )
那么,对其标准化的矩阵记为 Z ,Z 当中的每一个元素:
MATLAB 之 优劣解距离法(TOPSIS )(每一个元素 / 其所在列的元素的平方和的开方)
得到标准化矩阵 Z :
MATLAB 之 优劣解距离法(TOPSIS )

3. 计算得分并归一化

3.1 方法

MATLAB 之 优劣解距离法(TOPSIS )

3.2 步骤

  • 定义各个指标的最大值向量与最小值向量
    最大值向量:MATLAB 之 优劣解距离法(TOPSIS )
    最小值向量:MATLAB 之 优劣解距离法(TOPSIS )
  • 定义各个对象与最大值、最小值之间的距离
    MATLAB 之 优劣解距离法(TOPSIS )
  • 计算各个评价对象的分数
    得分:(显然 0 ≤ Si ≤ 1 ,且 Si 越大,Di+越小,即越接近最大值)
    MATLAB 之 优劣解距离法(TOPSIS )
  • 归一化:每一部分为该部分与所有部分和的比值。归一化的目的是为了让我们的结果更加容易解释。例如将得分归一化后可限制在 0-1 这个区间,对区间内每一个得分,都可以容易的得到起所处的比例位置。
  • 分数最高即为最优方案或对象

三、TOPSIS 模型实现

关于具体实现,需要有一定的数据,这里实现所选用的数据如下:

河流 含氧量(ppm) PH值 细菌总数(个/mL) 植物性营养物量
A 4.69 6.59 51 11.94
B 2.03 7.86 19 6.46
C 9.11 6.31 46 8.91
D 8.61 7.05 46 26.43
E 7.13 6.5 50 23.57
F 2.39 6.77 38 24.62
G 7.69 6.79 38 6.01
H 9.3 6.81 27 31.57
I 5.45 7.62 5 18.46
J 6.19 7.27 17 7.51
K 7.93 7.53 9 6.52
L 4.4 7.28 17 25.3
M 7.46 8.24 23 14.42
N 2.01 5.55 47 26.31
O 2.04 6.4 23 17.91
P 7.73 6.14 52 15.72
Q 6.35 7.58 25 29.46
R 8.29 8.41 39 12.02
S 3.54 7.27 54 3.16
T 7.44 6.26 8 28.41

1. MATLAB 实现

1.1 把数据复制到工作区,并将这个矩阵命名为X

  • 在工作区右键,点击新建(Ctrl+N),输入变量名称为X。
  • 在Excel中复制数据,再回到Excel中右键,点击粘贴Excel数据(Ctrl+Shift+V)。
  • 关掉这个窗口,点击X变量,右键另存为,保存为mat文件(下次就不用复制粘贴了,只需使用load命令即可加载数据)。
  • 注意,代码和数据要放在同一个目录下哦。
clear;clc
load data_water_quality.mat

1.2 判断是否需要正向化

  • 判断是否需要正向化,只有当存在非极大型指标时才需要正向化处理。
[n,m] = size(X);
disp(['共有' num2str(n) '个评价对象, ' num2str(m) '个评价指标']) 
Judge = input(['这' num2str(m) '个指标是否需要经过正向化处理,需要请输入1 ,不需要输入0:  ']);
  • 如果需要正向化处理,输入1。
if Judge == 1
    Position = input('请输入需要正向化处理的指标所在的列,例如第236三列需要处理,那么你需要输入[2,3,6]: '); %[2,3,6]
    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:区间型)
    % 第三个参数是告诉函数我们正在处理的是原始矩阵中的哪一列
    % 该函数有一个返回值,它返回正向化之后的指标,我们可以将其直接赋值给我们原始要处理的那一列向量
    end
    disp('正向化后的矩阵 X =  ')
    disp(X)
end
  • 可以得到正向化后的矩阵为:
含氧量(ppm) PH值 细菌总数(个/mL) 植物性营养物量
4.69 0.717241379 3 1
2.03 0.406896552 35 0.694036301
9.11 0.524137931 8 0.905790838
8.61 0.965517241 8 0.444252377
7.13 0.655172414 4 0.691443388
2.39 0.84137931 16 0.600691443
7.69 0.855172414 16 0.65514261
9.3 0.868965517 27 0
5.45 0.572413793 49 1
6.19 0.813793103 37 0.784788245
7.93 0.634482759 45 0.699222126
4.4 0.806896552 37 0.541918755
7.46 0.144827586 31 1
2.01 0 7 0.454624028
2.04 0.586206897 31 1
7.73 0.406896552 2 1
6.35 0.6 29 0.182368194
8.29 0.027586207 15 1
3.54 0.813793103 0 0.408815903
7.44 0.489655172 46 0.273120138
1.2.1 极小型指标正向化
function [posit_x] = Min2Max(x)
    posit_x = max(x) - x;
     %posit_x = 1 ./ x;    %如果x全部都大于0,也可以这样正向化
end
1.2.2 中间型指标正向化
function [posit_x] = Mid2Max(x,best)
    M = max(abs(x-best));
    posit_x = 1 - abs(x-best) / M;
end
1.2.3 区间型指标正向化
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
1.2.4 指标正向化处理
% function [输出变量] = 函数名称(输入变量)  
% 函数的中间部分都是函数体
% 函数的最后要用end结尾
% 输出变量和输入变量可以有多个,用逗号隔开
% function [a,b,c]=test(d,e,f)
%     a=d+e;
%     b=e+f;
%     c=f+d;
% end
% 自定义的函数要单独放在一个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向量中是否有除了123之外的其他值')
    end
end 

1.3 对正向化后的矩阵进行标准化

Z = X ./ repmat(sum(X.*X) .^ 0.5, n, 1);
disp('标准化矩阵 Z = ')
disp(Z)
  • 标准化后的矩阵为:
含氧量(ppm) PH值 细菌总数(个/mL) 植物性营养物量
0.162185916 0.248255278 0.024544035 0.306457563
0.070199874 0.140837129 0.286347071 0.212692674
0.315034904 0.181417319 0.065450759 0.277586453
0.297744294 0.334189798 0.065450759 0.136144501
0.24656409 0.226771648 0、03272538 0.211898056
0.082649113 0.291222538 0.130901518 0.184086436
0.265929573 0.295996678 0.130901518 0.200773408
0.321605335 0.300770818 0.220896312 0
0.188467643 0.198126809 0.4008859 0.306457563
0.214057745 0.281674258 0.302709761 0.240504293
0.274229065 0.219610438 0.36816052 0.214281909
0.152157363 0.279287188 0.302709761 0.166075101
0.257975892 0.05012847 0.253621692 0.306457563
0.06950825 0 0.057269414 0.139322972
0.070545686 0.202900949 0.253621692 0.306457563
0.267312822 0.140837129 0.01636269 0.306457563
0.21959074 0.207675088 0.237259002 0.055888112
0.286678304 0.00954828 0.122720173 0.306457563
0.122417515 0.281674258 0 0.125284726
0.257284268 0.169481969 0.376341865 0.083699732

1.4 计算得分并归一化(计算与最大值的距离和最小值的距离,并算出得分)

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')
  • 得分排名情况:
河流 D+ D- Stand_S(归一化后得分) 排名
K 0.1579 0.5212 0.0702 1
J 0.1683 0.4997 0.0684 2
I 0.1904 0.5550 0.0681 3
L 0.2471 0.4517 0.0591 4
T 0.2855 0.4611 0.0565 5
G 0.2977 0.4285 0.0539 6
O 0.3193 0.4466 0.0533 7
M 0.3262 0.4430 0.0527 8
H 0.3570 0.4503 0.0510 9
D 0.3770 0.4320 0.0488 10
C 0.3698 0.4178 0.0485 11
B 0.3500 0.3835 0.0478 12
Q 0.3405 0.3537 0.0466 13
A 0.4177 0.4059 0.0451 14
F 0.3832 0.3688 0.0448 15
R 0.4289 0.3953 0.0438 16
P 0.4338 0.3913 0.0434 17
E 0.4021 0.3588 0.0431 18
S 0.4858 0.3128 0.0358 19
N 0.5668 0.1506 0.0192 20

四、TOPSIS 模型优缺点

1. TOPSIS 法的优点

  • 避免了数据的主观性,不需要目标函数,不用通过检验,而且能够很好的刻画多个影响指标的综合影响力度。
  • 对于数据分布及样本量、指标多少无严格限制,既适于小样本资料,也适于多评价单元、多指标的大系统,较为灵活、方便。

2. TOPSIS 法的缺点

  • 需要的每个指标的数据,对应的量化指标选取会有一定难度。
  • 不确定指标的选取个数为多少适宜,才能够去很好刻画指标的影响力度。
  • 必须有两个以上的研究对象才可以进行使用

五、TOPSIS 模型优化

在 TOPSIS 当中,默认了各个评价指标所占的权重相同,但在实际的评价过程当中由于各种主观客观因素的影响,导致每一个评价指标所占的权重是有差异的。因此,对于 TOPSIS 模型的优化,可以从合理调整个评价指标所占权重入手。

1. 主观权重——层次分析法(AHP)

在此处只是简单介绍,详细介绍有时间的话会补充

  • 层次分析法是一个较为主观的评价方法,其在赋权得到权重向量时,主观因素占比很大。
  • 首先,分析系统中各因素之间的关系,建立系统的递阶层次结构。
  • 其次,对于同一层次的个元素关于上一层次中某一准则的重要性两两比较,构造两两比较矩阵(判断矩阵)。
  • 然后,由判断矩阵计算被比较元素对于该准则的相对权重,并进行 一致性检验(检验通过权重才能用)。
  • 最后,填充权重矩阵,根据矩阵计算得分,得出结果。
  • 权重矩阵填充方法
标度 含义
1 表示两个因素相比,具有同样重要性
3 表示两个因素相比,一个因素比另一个因素稍微重要
5 表示两个因素相比,一个因素比另一个因素明显重要
7 表示两个因素相比,一个因素比另一个因素强烈重要
9 表示两个因素相比,一个因素比另一个因素极端重要
2、4、6、8 上述两相邻判断的中值
倒数 A和B相比如果标度为3,那么B和A相比就是1/3
  • 判断矩阵实际情况下都是专家填的,但是很多时候大都是我们自己填的,最好有一些理论的依据支撑。
  • 判断矩阵当中,a[i][j] 表示:与指标 j 相比,i 的重要程度。

1.1 权重求解方法

(1) 算术平均法求权重
  • 将判断矩阵按照列归一化。
  • 将归一化的列相加(按行求和)。
  • 将相加后得到的向量中的每个元素除以 n 即可得到权重向量。
    MATLAB 之 优劣解距离法(TOPSIS )
(2) 几何平均法求权重
  • 将A的元素按照行相乘得到一个新的列向量。
  • 将新的向量的每个分量开n次方。
  • 对该列向量进行归一化即可得到权重向量。
    MATLAB 之 优劣解距离法(TOPSIS )
(3) 特征值法求权重

一致矩阵有一个特征值为 n,其余特征值均为 0。另外,我们很容易可以得到,特征值为 n 时,对应的特征向量刚好为:
MATLAB 之 优劣解距离法(TOPSIS )
在实际过程中建议综合三种方法求得的权重得到一个综合的权重向量更具有说服力。

2. 客观权重——熵权法

  • 熵权法就是根据一项指标的变化程度来分配权重的。
  • 第一步:判断输入的矩阵中是否存在负数,如果有则要重新标准化到非负区间(后面计算概率时需要保证每一个元素为非负数)。
  • 第二步:计算第 j 项指标下第 i 个样本所占的比重,并将其看作相对熵计算中用到的概率。
  • 第三步:计算每个指标的信息熵,并计算信息效用值,并归一化得到每个指标的熵权。

(1) 第一步

  • 假设有 n 个要评价的对象,m 个评价指标(已经正向化了)构成的正向化矩阵如下:
    MATLAB 之 优劣解距离法(TOPSIS )
  • 设标准化矩阵为 Z ,Z 中元素记为 zij
    MATLAB 之 优劣解距离法(TOPSIS )
  • 判断 Z 矩阵中是否存在着负数,如果存在的话,需要对 X 使用另一种标准化方法对矩阵 X 进行一次标准化得到 Z 矩阵,其标准化的公式为:MATLAB 之 优劣解距离法(TOPSIS )
  • 这样可以保证 zij 在 [0,1] 区间,没有负数。

(2) 第二步

  • 假设有 n 个要评价的对象,m 个评价指标,且经过了上一步处理得到的非负矩阵为:MATLAB 之 优劣解距离法(TOPSIS )
  • 计算概率矩阵 P ,其中 P 中每一个元素 Pij 的计算公式如下:
  • MATLAB 之 优劣解距离法(TOPSIS )
  • 保证每一列的加和为 1 ,即每个指标所对应的概率和为 1 。

(3) 第三步

  • 对于第 j 个指标而言,其信息嫡的计算公式为:
    MATLAB 之 优劣解距离法(TOPSIS )

3. 优化结果

在各个对象与最大值、最小值之间的距离公式转变为:MATLAB 之 优劣解距离法(TOPSIS )文章来源地址https://www.toymoban.com/news/detail-436135.html

到了这里,关于MATLAB 之 优劣解距离法(TOPSIS )的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2023数学建模国赛常用算法-Topsis优劣解距离法

    1.1 概念 TOPSIS 法是一种常用的组内综合评价方法,能充分利用原始数据的信息,其结果能精确地反映各评价方案之间的差距。基本过程为基于归一化后的原始数据矩阵,采用余弦法找出有限方案中的最优方案和最劣方案,然后分别计算各评价对象与最优方案和最劣方案间的距

    2024年02月15日
    浏览(33)
  • TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】

    目录 一、指标正向化 1.极小型指标-极大型指标 2.中间型指标-极大型指标 3.区间型指标-极大型指标 二、标准化处理 三、计算得分并归一化(不带权重) 四、计算得分并归一化(带权重) 熵权法 1)判断输入的矩阵是否存在负数 2)计算第j项指标下第i个样本所占的比重,并将其看

    2023年04月20日
    浏览(40)
  • TOPSIS法(熵权法)(模型+MATLAB代码)

    TOPSIS可翻译为逼近理想解排序法,国内简称为优劣解距离法 TOPSIS法是一种常用的 综合评价方法 , 其能充分利用原始数据的信息,其结果能精确地反映各评价方案之间的距离 极大型指标(效益型指标)  :越高(大)越好 极小型指标(成本型指标)  :越少(小)越好 中间

    2024年02月21日
    浏览(44)
  • 数学建模之TOPSIS模型(含matlab代码)

      目录 一、方法和原理 1、理想解法  2、方法原理  二、TOPSIS法的具体算法 (1) 用向量规划化的方法求得规范决策矩阵 1、线性变换 2、0-1变换 3、区间型属性的变换 4、向量规范化 5、标准换处理  (2)构成加权规范阵C  (3)确定正理想解和负理想解  (4)计算各方案到正

    2024年02月07日
    浏览(37)
  • 综合评价算法 | Matlab实现基于TOPSIS法的综合评价算法

    效果一览 文章概述 综合评价算法 | Matlab实现基于TOPSIS法的综合评价算法 研究内容 C.L.Hwang 和 K.Yoon 于1981年首次提出 TOPSIS (Technique for Order Preference by Similarity to an Ideal Solution)。TOPSIS 法是一种常用的组内综合评价方法,能充分利用原始数据的信息,其结果能精确地反映各评价方

    2024年02月12日
    浏览(86)
  • 基于熵权法的topsis分析(包含matlab源码以及实例)

                 目录 一、算法简述          1.topsis分析法          2.熵权法          3.两种算法的结合 二、算法步骤          1.判断指标类型          2.数据正向化          3.正向化矩阵标准化          4.计算概率矩阵P          5.计算各个指标的信息熵

    2024年01月16日
    浏览(38)
  • 【数学建模系列】TOPSIS法的算法步骤及实战应用——MATLAB实现

    客观评价方法中的一种,亦称为理想解法,是一种有效的多指标评价方法。这种方法通过构造评价问题的正理想解和负理想解,即各指标的最优解和最劣解,通过计算每个方案到理想方案的相对贴近度,即靠近止理想解和远离负理想解的程度,来对方案进行排序,从而选出最优

    2024年02月08日
    浏览(44)
  • matlab做经济地理、地理距离、经济距离空间权重矩阵

    首先讲下地理加权空间权重矩阵: 该矩阵的经济含义是通过不同点的坐标系之间的距离远近来衡量两地之间的关系重要程度,当两点之间距离较远,所占的权重越低,而距离越近,权重越高。故操作如下: 首先需要导入坐标数据: A=csvread(\\\'JWD.csv\\\',1,0); % JWD.csv是文件名,csvrea

    2023年04月12日
    浏览(38)
  • 计算两个多边形的最近距离(MATLAB)

            本文意在介绍关于计算两组坐标点的最近距离的简单方法,可用此方法来计算两个多边形的最近距离以及距离最近的两个点。下面展示具体实例。 函数代码         该函数可以比较快速的计算两组坐标点之间的最小距离,并返回相应的坐标。缺点是只能计算整数

    2024年02月08日
    浏览(41)
  • Matlab连接STK获取可见性、距离数据

    常用命令 用Matlab创建STK对象 创建场景: 创建卫星: STK创建好对象后,用Matlab获取 获取stk中所有对象的名称(包括卫星、地面站、星座等对象): 获取可见性数据: secData是元胞数据(相当于python中的字典dict),secData{1}获取第一个单元的数据,secData{1}.data返回可见次数、开始

    2024年02月16日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包