TOPSIS法(优劣距离法)
TOPSIS法(Technique for Order Preference by Similarity to Ideal Solution) 可翻译为逼近理想解排序法,国内常简称为优劣解距离法 TOPSIS 法是一种常用的综合评价方法,其能充分利用原始数据的信息, 其结果能精确地反映各评价方案之间的差距。
使用此类方法,有以下几个步骤:、
目录
第一步:将原始矩阵正向化
1、常见的四个指标
2、转化方法
(1)极小型指标 转为极大型指标
(2)中间型指标转为极大型指标
(3)区间型指标转为极大型指标
第二步:正向化矩阵标准化
第三步:计算得分并归一化
四、模型优化
五、代码实现
1、正向化函数的实现
2、Topsis方法实现
第一步:将原始矩阵正向化
将原始矩阵正向化,就是将所有的指标类型统一转化为极大型(转换函数不唯一)
1、常见的四个指标
2、转化方法
(1)极小型指标 转为极大型指标
(2)中间型指标转为极大型指标
(3)区间型指标转为极大型指标
第二步:正向化矩阵标准化
标准化的目的是消除不同指标量纲的影响
第三步:计算得分并归一化
四、模型优化
当每一个指标都要权重时,则距离公式改变为:
五、代码实现
1、正向化函数的实现
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('~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~')elsedisp('没有这种类型的指标,请检查Type向量中是否有除了1、2、3之外的其他值')end
end
2、Topsis方法实现
%% 第一步:判断是否需要正向化
[n,m] = size(X);%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是我们自己定义的函数,其作用是进行正向化,其一共接收三个参数enddisp('正向化后的矩阵 X = ')disp(X)
end%% 让用户判断是否需要增加权重
disp('请输入是否需要增加权重向量,需要输入1,不需要输入0')
Judge = input('请输入是否需要增加权重: ');
if Judge == 1disp(['如果你有3个指标,你就需要输入3个权重,例如它们分别为0.25,0.25,0.5, 则你需要输入[0.25,0.25,0.5]']);weigh = input(['你需要输入' num2str(m) '个权数。' '请以行向量的形式输入这' num2str(m) '个权重: ']);OK = 0; % 用来判断用户的输入格式是否正确while OK == 0 if abs(sum(weigh) - 1)<0.000001 && size(weigh,1) == 1 && size(weigh,2) == m % 这里要注意浮点数的运算是不精准的。OK =1;elseweigh = input('你输入的有误,请重新输入权重行向量: ');endend
elseweigh = ones(1,m) ./ m ; %如果不需要加权重就默认权重都相同,即都为1/m
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')
注:此博客的方法和图片均来自b站的清风建模,若侵权可联系删除
TOPSIS法(优劣距离法)相关推荐
- [数学建模]---2.Topsis优劣距离法
一.有关excel数据的导入 ①可以直接在工作区将矩阵的元素直接复制粘贴过去,并创建一个变量X来存储代表这个矩阵 ②右击这个变量,另存为一个.mat文件,下次再用的时候,代码区直接 load wat ...
- 数学建模学习笔记(二)——Topsis优劣解距离法
(续上篇文章)层次分析法的局限 上一篇文章中,层次分析法有这样的局限 评价决策层不能太多: 数据是已知的的话,便无法使用层次分析法进行精确的分析评价: 因此,为对这些情况做出更为精准的分析,我们可以使 ...
- MATLAB 之 优劣解距离法(TOPSIS )
文章目录 一.TOPSIS 简介 二.TOPSIS 步骤 1:将原始矩阵正向化,得到正向化矩阵 1.1 指标类型 1.2 正向化公式 2. 正向化矩阵标准化 3. 计算得分并归一化 3.1 方法 3. ...
- TOPSIS算法(优劣解距离法)的使用举例与matlab实现
文章目录 一.算法的提出 二.TOPSIS算法的一般步骤 1.形成决策矩阵 2.计算加权决策矩阵 (1)指标正向化处理 a.极大值指标正向化 b.极小型指标极大正向化 c.中间型指标极大正向化 d.区 ...
- TOPSIS法笔记(优劣解距离法)
一.概述 C.L.Hwang 和K.Yoon 于1981年首次提出TOPSIS (Technique for Order Preference by Similarity to an Ideal So ...
- TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】
目录 一.指标正向化 1.极小型指标->极大型指标 2.中间型指标->极大型指标 3.区间型指标->极大型指标 二.标准化处理 三.计算得分并归一化(不带权重) 四.计算得分并归一化 ...
- Python实现TOPSIS分析法(优劣解距离法)
文章目录 (1).题目 (2).读取Excel表中的数据 (3).将不同的指标转换为极大型指标 (4).正向化矩阵标准化 (5).计算得分并归一化 (6).主函数 (7).完整代码部分 (8).计算结 ...
- 数学建模——TOPSIS法(优劣解距离法)学习笔记(一)
一.TOPSIS方法 TOPSIS法(Technique for Order Preference by Similarity to Ideal Solution) 可翻译为逼近理想解排序法,国内常简 ...
- 数学建模学习笔记(2):TOPSIS方法(优劣解距离法)和熵权法修正
文章目录 TOPSIS方法概述 TOPSIS方法步骤(重点) 熵权法对TOPSIS模型的修正 熵权法的步骤(重点) TOPSIS方法由C.L.Hwang和K.Yoon在1981年首次提出,在国内常简称 ...
最新文章
- 使用 github 和 jitpack 构建 android 依赖
- Web APi之过滤器执行过程原理解析【二】(十一)
- java学习笔记总略
- ajax滚动条动态加载,下拉滚动条,动态加载ajax加载数据
- 漫步线性代数二十六——特征值和特征向量(续)
- 【论文笔记】Simple and Deep Graph Convolutional Networks
- 用python做股票因子分析_什么是多因子量化选股模型?
- 透视相机(PerspectiveCamera)
- 使用百度地图API进行Android地图应用开发(Eclipse)
- 多目标优化——帕累托最优
- 码云最火开源项目 TOP 50
- css实现人走路效果,如何使用纯CSS实现一个人独自行走的动画效果(附源码)
- Zotero 和它的朋友们: 一个文献阅读生态
- ./bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file:
- 虚拟机由于硬盘存储空间过满导致启动异常+虚拟机扩容
- 前言-如何学习区块链
- windows搭建go语言开发环境
- 地摊金融沦为噱头?贷款需要有房产,“被城管驱逐就赔款”
- php 美化json,分享一个 PHP 版的 JSON 数据格式化函数
- 登陆失败 禁用当前的账户