数学建模二:TOPSIS法(优劣解距离法)附代码详解

TOPSIS法(优劣解距离法)用于评价类问题。

层次分析法因为受限于一致性检验指标的数量,最多只能选择15个准则或方案。同时层次分析法也难以处理已经存在评价数据的问题。而TOPSIS法(优劣解距离法)则没有这些问题。

TOPSIS法(优劣解距离法)步骤:
1.原始矩阵正向化。
2.正向化矩阵标准化。
3.计算得分并归一化。

例:评价下表中20条河流的水质情况。
注:含氧量越高越好;PH值越接近7越好;细菌总数越少越好;植物性营养物量介于10‐20之间最佳,超过20或低于10均不好。

1.原始矩阵正向化。
最常见的指标类型:

原始矩阵正向化就是将所有指标都转化为极大型指标。并且转化函数不唯一,可以根据数据进行适当的修改。

极小型指标转化公式:

max - x (如果x均大于零,可以用1/x)

中间型指标转化公式:

区间型指标转化公式:


代码涉及函数应用,具体代码见完整代码。

2.正向化矩阵标准化。

标准化的目的是消除不同指标量纲的影响。同时标准化的方法有很多种,其主要目的就是去除量纲的影响,未来我们还可能见到更多种的标准化方法,例如:(x‐x的均值)/x的标准差;具体选用哪一种标准化的方法在多数情况下并没有很大的限制,这里我们采用的是前人的论文中用的比较多的一种标准化方法。

标准化方法:

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

3.计算得分并归一化。
要区别开归一化和标准化。归一化的计算步骤也可以消去量纲的影响,但更多时候,我们进行归一化的目的是为了让我们的结果更容易解释,或者说让我们对结果有一个更加清晰直观的印象。例如将得分归一化后可限制在0‐1这个区间,对于区间内的每一个得分,我们很容易的得到其所处的比例位置。

归一化方法:


如果赋予指标不同的权重,那么计算评价对象与最大值的距离和评价对象与最大值的距离时,要在计算公式中添加权重。

代码如下:

%% 第四步:计算与最大值的距离和最小值的距离,并算出得分
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')

完整代码如下:

%%  第一步:把数据复制到工作区,并将这个矩阵命名为X
% (1)在工作区右键,点击新建(Ctrl+N),输入变量名称为X
% (2)在Excel中复制数据,再回到Excel中右键,点击粘贴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法(优劣解距离法)\代码和例题数据'
% 也可以看我更新的视频:“更新9_Topsis代码为什么运行失败_得分结果怎么可视化以及权重的确定如何更加准确”,里面有介绍%%  第二步:判断是否需要正向化
[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%% 第三步:对正向化后的矩阵进行标准化
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')% 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

更多数学建模相关内容请关注微信公众号《数学建模学习交流》。同时购买更多优质精选的数学建模资料,在微信公众号后台发送“买”这个字即可进入店铺(我的微店地址:https://weidian.com/?userid=1372657210)进行购买。视频价格不贵,但价值很高。单人购买观看只需要58元,三人购买人均仅需46元,视频本身也是下载到本地观看的,所以请大家不要侵犯知识产权,对视频或者资料进行二次销售。

数学建模二:TOPSIS法(优劣解距离法) 附代码详解相关推荐

  1. 曲率高斯滤波去噪python实现(附代码详解)

    曲率高斯滤波去噪python实现(附代码详解) 曲率滤波的理论基础可以参考下曲率滤波的理论基础和应用,这篇博客介绍的思想完美的避开了一大堆数学公式,简直是我的福音,但还是要细看的,不然很容易忽略重点, ...

  2. NLP【05】pytorch实现glove词向量(附代码详解)

    上一篇:NLP[04]tensorflow 实现Wordvec(附代码详解) 下一篇:NLP[06]RCNN原理及文本分类实战(附代码详解) 完整代码下载:https://github.com/ttj ...

  3. BraTS数据集处理详解(附代码详解)

    代码参考:https://github.com/sinclairjang/3D-MRI-brain-tumor-segmentation-using-autoencoder-regularizatio ...

  4. 要怎么通过PHP发布微博动态:附代码详解

    今天主要聊聊关于如何通过PHP发布微博动态(代码详解),这里通过一些实例讲解与代码示例让大家通过直观的表现了解其中内容,相信大家能从中收获到有用的知识. 首先,肯定是注册成为开发者新浪微博开放平台 选 ...

  5. 独家总结 | KNN算法Python实现(附代码详解及注释)

    ↑ 点击上方[计算机视觉联盟]关注我们 上一篇已经介绍KNN算法的基本原理,这篇就不再赘述(公式太多,读不懂? 一文带你领略KNN近邻算法~简单易懂) 纸上得来终觉浅,仅仅懂了原理还不够,要用代码实践 ...

  6. Python文本特征提取 DictVectorizer CountVectorizer TfidfVectorizer 附代码详解

    文章目录 DictVectorizer 对使用字典储存的数据进行特征提取与向量化 CountVectorizer / TfidfVectorizer 处理无特殊数据结构存储的数据 词袋模型(Bag o ...

  7. 独家总结 | 决策树算法Python实现(附代码详解及注释)

    ↑ 点击上方[计算机视觉联盟]关注我们 上一篇已经介绍过决策树基本原理机器学习经典算法决策树原理详解(简单易懂) 纸上得来终觉浅,仅仅懂了原理还不够,要用代码实践才是王道,今天小编就附上小编自己在学习 ...

  8. 如何创建一个百分百懂你的产品推荐系统 | 深度教程(附代码详解)

    (图片由AI科技大本营付费下载自视觉中国) 来源 | 读芯术(ID:AI_Discovery) 你也许每天都会逛一逛电子商务网站,或者从博客.新闻和媒体出版物上阅读大量文章.浏览这些东西的时候,最令读 ...

  9. JDBC有这一篇就够了(万字JDBC附代码详解)

    目录: 1.JDBC的本质 2.JDBC的使用步骤 3.DriverManager对象 4.Connectioin对象 5.Statement对象 6.ResultSet对象 7.JDBC工具类 8. ...

最新文章

  1. 延长 XSS 生命期
  2. C# 整数与字符串拼接之间的装箱操作
  3. 数组 ——求出一组数的最大值(用数组实现)
  4. 【python】self cls
  5. netfilter/iptables全攻略
  6. 大剑无锋之介绍一下B+树【面试推荐】
  7. 西湖大学生命学院章永登实验室 (超分辨成像)科研团队招聘启事
  8. volatile关键字(转)
  9. 黑客Alex Tapanaris与PDF文档
  10. Interface的精髓——《Thinking in Java》随笔025
  11. java编程练习(开源):十种经典游戏
  12. Win11_vs2010镜像安装方法
  13. 显控触摸屏与STC51单片机modbus通讯程序,包含触摸屏程序与c51代码
  14. android frameworks下面config.xml属性
  15. python语言标识符首字符不能是汉字_python二级电子教案 第2章 Python语言基本语法元素...
  16. 学生成绩管理系统 easyx库(半成品
  17. xpath之根据节点获取兄弟节点
  18. Android程序的入口
  19. 第三课:布尔逻辑与逻辑门
  20. 树莓派Raspberry Pico RP2040 开发环境配置完全缝合终极版C-SDK

热门文章

  1. 企业微信又又增加新功能啦
  2. ffmpeg的IO操作
  3. python将图片按照标签分类复制到指定的文件夹
  4. 虹科案例丨修保时捷?戴上虹科AR眼镜,你也行!
  5. sqli-labs————less 20
  6. 佛山科学技术学院计算机期末试题,佛山科学技术学院 2002-2003学年第一学期概率与数理统计试卷(A卷)...
  7. 基于java+jsp快递物流订单管理系统
  8. 图解通信原理与案例分析-32:物流仓储、智能交通中的RFID通信技术详解
  9. 激光振镜误差校正算法C语言,激光振镜扫描误差校正装置的制作方法
  10. 使用MATLAB来可视化三维点云上的法向量