TOPSIS法是一种组内综合评价方法,能充分利用原始数据的信息,其结果能精确地反映各评价方案之间的差距。
①基本过程为归一化后的原始数据矩阵;
②采用余弦法找出有限方案中的最优方案和最劣方案;然后分别计算各评价对象与最优方案和最劣方案间的距离;
③获得各评价对象与最优方案的相对接近程度,依次最为评价优劣的依据。
优点:该方法对数据分布及样本含量没有严格限制,数据计算简单易行。

原始数据:
共有n个待评价对象,每个对象有m个指标(属性),则原始矩阵构造为
X=[x11x12...x1mx21x22...x2m............xn1xn2...xnm]X=\begin{bmatrix} x_{11} & x_{12} & ... &x_{1m} \\ x_{21} & x_{22} & ... &x_{2m} \\ . & .& .& . \\. & .& .& . \\. & .& .& . \\x_{n1} & x_{n2} & ... &x_{nm} \end{bmatrix} X=⎣⎢⎢⎢⎢⎢⎢⎡​x11​x21​...xn1​​x12​x22​...xn2​​............​x1m​x2m​...xnm​​⎦⎥⎥⎥⎥⎥⎥⎤​

步骤一:首先需要进行指标属性同向化,一般选择指标正向化:
一般有以下四种指标:
1.极大型指标:期望指标值越大越好,如盈利指标,这种指标不做处理;
2.极小型指标:期望值标值越小越好,如犯错率,这种指标可以取导数,缺陷是只适用于x>0的情况;(min_to_max函数)
x′=1x(x>0)x'=\frac{1}{x}(x>0) x′=x1​(x>0)
一般采用最大值减去最小值,这样可以防止出现负数:
x′=Max(x)−xx'=Max(x)-x x′=Max(x)−x
3.中间型指标:期望值标值不要过大也不要过小,而是取中间值(如水质量PH值)(mid_to_max函数,这里采取方式一:)
方式一:
x′=1−∣x−best∣max(∣x−best∣)x'=1-\frac{|x-best|}{max(|x-best|)} x′=1−max(∣x−best∣)∣x−best∣​
方式二:
x′={2×x−min(x)max(x)−min(x),m≤x≤max(x)+min(x)22×max(x)−xmax(x)−min(x),max(x)+min(x)2≤x≤max(x)x'=\left\{ \begin{aligned} 2\times\frac{x-min(x)}{max(x)-min(x)},\qquad m\le x\le \frac{max(x)+min(x)}{2}\\ 2\times\frac{max(x)-x}{max(x)-min(x)},\frac{max(x)+min(x)}{2}\le x\le max(x) \\ \end{aligned} \right. x′=⎩⎪⎪⎪⎨⎪⎪⎪⎧​2×max(x)−min(x)x−min(x)​,m≤x≤2max(x)+min(x)​2×max(x)−min(x)max(x)−x​,2max(x)+min(x)​≤x≤max(x)​
4.区间型指标:期望指标的取值最好落在某个区间内最好。
需要指定最优区间值的范围[a,b],最大容忍区间是[a*,b*]:
x′={1−a−xa−a∗,x<a1,a≤x≤b1−x−bb∗−b,x>ba∗=a−min(x)b∗=max(x)−bx'=\left\{ \begin{aligned} 1-\frac{a-x}{a-a*},x<a\\ 1\qquad,a\le x \le b\\ 1-\frac{x-b}{b*-b},x>b \end{aligned} \right.\\ a*=a-min(x)\\ b*=max(x)-b x′=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧​1−a−a∗a−x​,x<a1,a≤x≤b1−b∗−bx−b​,x>b​a∗=a−min(x)b∗=max(x)−b

步骤二:对数据进行标准化。(参考:三种常用数据标准化方法)
这里提供了两种方式,
方式一:归一化方法:
yi=xi∑i=1nxiyi∈[0,1](i=1,2,...,n)且∑i=1nyi=1y_i = \frac{x_i}{\sum_{i=1}^nx_i}\\ yi\in[0,1](i=1,2,...,n)且\sum_{i=1}^ny_i=1 yi​=∑i=1n​xi​xi​​yi∈[0,1](i=1,2,...,n)且i=1∑n​yi​=1
方式二:规范化方法:
yi=xi−min(x)max(x)−min(x)y_i=\frac{x_i-min(x)}{max(x)-min(x)} yi​=max(x)−min(x)xi​−min(x)​
这里稍微做了一点改进,因为x_i=min(x)时,yi=0,而后面熵权法需要取对数。这里就将yi限制在[0.002,0.996]的范围内。
yi=(0.996−0.002)×xi−min(x)max(x)−min(x)+0.002y_i=(0.996-0.002)\times\frac{x_i-min(x)}{max(x)-min(x)}+0.002 yi​=(0.996−0.002)×max(x)−min(x)xi​−min(x)​+0.002
方式三:向量规范化,即每一列元素都除以当前列向量的范数(使用余弦距离度量)
yi=xi∑i=1nxi2y_i=\frac{x_i}{\sqrt{\sum_{i=1}^nx_{i}^2}} yi​=∑i=1n​xi2​​xi​​

function y = dataProcess(x,way,ind,best)
% @brief,dataProcess数据预处理函数,进行指标同向化一般选择指标正向化
% @param,way指定归一化方式分别对应方式一二三
% @param,x待处理的数据,x为n行m列的矩阵,其中行数表示样本数n,列表表示指标数m
% @param,ind为数据的处理方式,长度为m;
% ind(i)=0,表示第i个指标是极大型指标,不需要处理
% ind(i)=1,表示第i个指标是极小型指标,采用取倒数或取相反数的方式处理
% ind(i)=2,表示第i个指标是中间型指标(期望指标值既不要太大也不要太小,适当取中间值最好)
% ind(i)=3,表示第i个指标是区间型指标(期望指标的取值最好落在某一个确定的区间最好)
% @param,best为中间型或区间型指标的最佳取值范围,大小为m*2,若无则为0
[n,m] = size(x);
if nargin == 1way = 1;ind = zeros(m,1);best = zeros(m,2);
elseif nargin == 2ind = zeros(m,1);best = zeros(m,2);
elseif nargin == 3best = zeros(m,2);
end%% 将数据进行正向化
for i = 1:mif ind(i) == 1x(:,i) = min_to_max(x(:,i));elseif ind(i) == 2x(:,i) = mid_to_max(x(:,i),best(i,1));elseif ind(i) == 3x(:,i) = sec_to_max(x(:,i),best(i,1),best(i,2));end
end%% 将数据进行标准化
if way == 1
%---------------- 方式一:一般归一化方法 ----------------y = x ./ repmat(sum(x),n,1);% 这种写法等价于% for i=1:n%     for j=1:m%         p(i,j)=y(i,j)/sum(y(:,j));%     end% end%---------------- 方式二:为了避免0的出现,归一化到某一范围内 ----------------
elseif way == 2% 求每一行的最大值xMax = max(x);% 求每一行的最小值xMin = min(x);% 不归一化到[0,1]范围内,因为0不能求对数,这里取[0.002,0.996]helperMax = 0.996;helperMin = 0.002;helper = helperMax - helperMin;y = zeros(size(x));for i = 1:mtemp = xMax(i) - xMin(i);y(:,i) = helper*(x(:,i)-xMin(i))/temp + helperMin;end%---------------- 方式三:向量规范化,即每一列元素都除以当前列向量的范数----------------
elseif way == 3y = x ./ repmat(sqrt(sum(x.*x)), n, 1);   % 一般标准化
endreturn;endfunction [y] = min_to_max(x)% 极小型指标:期望指标值越小越好(如患病率、死亡率等)% 可以化成y=1/x(x>0)或y=max(x)-xy = max(x) - x;return;
endfunction [y] = mid_to_max(x,best)% 中间型指标:期望指标值既不要太大也不要太小,适当取中间值最好(如水质量评估PH值)M = max(abs(x-best));y = 1 - abs(x-best) / M;
% 也可以写成
%     Xmin = min(x);
%     Xmax = max(x);
%     Xmid = (Xmin+Xmax)/2;
%     Xdiv = Xmax - Xmin;
%     if x>=Xmin && x <= Xmid
%         y = 2*(x-Xmin)/Xdiv;
%     else
%         y = 2*(Xmax-x)/Xdiv;
%     end
end function [y] = sec_to_max(x,min_n,max_n)% 区间型指标:期望指标的取值最好落在某一个确定的区间最好(如体温)% [min_n,max_n]为指标x的最佳稳定区间n = size(x,1);  % 行数,即为对象个数 M = max([min_n-min(x),max(x)-max_n]);   % 最大容忍区间y = zeros(n,1);     for i = 1: nif x(i) < min_ny(i) = 1-(min_n-x(i))/M;elseif x(i) > max_ny(i) = 1-(x(i)-max_n)/M;elsey(i) = 1;endend
end

步骤二:采用熵权法处理数据。
1.因为这里已经对数据进行了标准化处理,设标准化处理后的数据为y,因此不要再处理;
2.计算各指标的熵值:(n为样本数,m为指标数)
ej=−1ln(n)∑i=1nyijln(yij)(j=1,2,...,m)e_j=-\frac{1}{ln(n)}\sum_{i=1}^ny_{ij}ln(y_{ij})(j=1,2,...,m) ej​=−ln(n)1​i=1∑n​yij​ln(yij​)(j=1,2,...,m)
3.计算信息效用值:信息效用值越大,表示该指标越重要。
dj=1−ejd_j=1-e_j dj​=1−ej​
4.计算各指标的权系数:熵权系数dj越大,代表指标代表的信息量越大,表示其对综合评价的作用越大。
Wj=dj∑j=1ndjW_j=\frac{d_j}{\sum_{j=1}^nd_j} Wj​=∑j=1n​dj​dj​​

function [score, weight] = entropyWeight(x)
% 使用熵权法求数据行的得分及各指标(列)的权重
% x为原始数据矩阵, 一行代表一个样本, 每列对应一个指标
% ind指示向量,指示各列正向指标还是负向指标,1表示正向指标,2表示负向指标
% score返回各行(样本)得分,weight返回各列权重[n,m] = size(x);
% 计算每个指标的熵值
k = 1/log(n);
e = zeros(1,m);
lnx = Myln(x);
for j = 1:me(j) = -k * sum(x(:,j).*lnx(:,j));
end% 计算熵冗余度
d = ones(1,m) - e;
% 计算权值
weight = d/sum(d);
% 计算综合得分
score = 100 * weight * x';

这里进行了补充定义:(见Myln函数)
当yij=0时ln(yij)=0当y_{ij}=0时ln(y_{ij})=0 当yij​=0时ln(yij​)=0

function lnx = Myln(x)% 方法一和方法二都可能会出现y=0的情况需要特别对出现0的情况进行处理lnx = zeros(size(x));lnx(x==0) = 0;lnx(x~=0) = log(x(x~=0));
end

步骤三:
采用TOPSIS方法:
1.首先需要对属性向量规范化,即每一列元素都除以当前列向量的范数(使用余弦距离度量),即前面所述规范化的方式三,将规范化后的矩阵即为Z。
Z=[z11z12...z1mz21z22...z2m............zn1zn2...znm]Z=\begin{bmatrix} z_{11} & z_{12} & ... &z_{1m} \\ z_{21} & z_{22} & ... &z_{2m} \\ . & .& .& . \\. & .& .& . \\. & .& .& . \\z_{n1} & z_{n2} & ... &z_{nm} \end{bmatrix} Z=⎣⎢⎢⎢⎢⎢⎢⎡​z11​z21​...zn1​​z12​z22​...zn2​​............​z1m​z2m​...znm​​⎦⎥⎥⎥⎥⎥⎥⎤​
2.确定最优方案和最劣方案:
最优方案由每个Z中每个方案的最大值构成:
Z+=(max{z11,z21,...,zn1},max{z12,z22,...,zn2},...max{z1n,z2n,...,znm})=(Z1+,Z2+,...,Zm+)Z^+=(max\{z_{11},z_{21},...,z_{n1}\},max\{z_{12},z_{22},...,z_{n2}\},... max\{z_{1n},z_{2n},...,z_{nm}\}) \\=(Z_1^+,Z_2^+,...,Z_m^+)\qquad\qquad\qquad\qquad\qquad\qquad\quad Z+=(max{z11​,z21​,...,zn1​},max{z12​,z22​,...,zn2​},...max{z1n​,z2n​,...,znm​})=(Z1+​,Z2+​,...,Zm+​)
最劣方案由每个Z中每个方案的最小值构成:
Z−=(min{z11,z21,...,zn1},min{z12,z22,...,zn2},...min{z1n,z2n,...,znm})=(Z1−,Z2−,...,Zm−)Z^-=(min\{z_{11},z_{21},...,z_{n1}\},min\{z_{12},z_{22},...,z_{n2}\},... min\{z_{1n},z_{2n},...,z_{nm}\}) \\=(Z_1^-,Z_2^-,...,Z_m^-)\qquad\qquad\qquad\qquad\qquad\qquad\quad Z−=(min{z11​,z21​,...,zn1​},min{z12​,z22​,...,zn2​},...min{z1n​,z2n​,...,znm​})=(Z1−​,Z2−​,...,Zm−​)
3.计算各评价对象与最优方案、最劣方案的接近程度,这里的w取得即是通过熵权法计算出来的权重。
Di+=∑j=1mwj(Zj+−zij)2Di−=∑j=1mwj(Zj−−zij)2D_i^+=\sqrt{\sum_{j=1}^mw_j(Z_j^+-z_{ij})^2}\qquad D_i^-=\sqrt{\sum_{j=1}^mw_j(Z_j^--z_{ij})^2} Di+​=j=1∑m​wj​(Zj+​−zij​)2​Di−​=j=1∑m​wj​(Zj−​−zij​)2​
4.计算各评价对象与最优方案的贴近程度Ci
Ci=Di−Di++Di−C_i=\frac{D_i^-}{D_i^+ + D_i^-} Ci​=Di+​+Di−​Di−​​
0≤Ci≤1,Ci→1,表明评价对象越优。0\le C_i\le1,C_i\rightarrow1,表明评价对象越优。 0≤Ci​≤1,Ci​→1,表明评价对象越优。

function [sorted_S,index] = topsis(x,weights)
% 求解TOPSIS算法
% X={x1,x2,..,xn},原始数据集,这里取归一化之后的数据,有m个指标;有n个样本
% weights={w1,w2,...wn},各指标权重;
[n,m] = size(x);%% 计算各平均对象与最优方案、最劣方案的接近程度
yMax = max(x);
yMin = min(x);DMax = zeros(n,1);
DMin = zeros(n,1);
Score = zeros(n,1);
for i = 1:nfor j = 1:mDMax(i) = DMax(i) + weights(j)*(yMax(j)-x(i,j))^2;DMin(i) = DMin(i) + weights(j)*(yMin(j)-x(i,j))^2;endScore(i) = DMin(i) / (DMax(i) + DMin(i));
end%% 计算各评价对象与最优方案的贴近程度
% 其中0<=C<=1,C越接近与1,说明评价对象越优
StandScore = Score / sum(Score); %% 根据C的大小进行排序,得出评价结果
[sorted_S,index] = sort(StandScore ,'descend');

最后一步主函数写法:

clc;
clear;%% 第一步:导入数据
load data_water_quality.mat%% 第二步:熵权法计算,采用一般归一化方法
p=dataProcess(X,1,[1,2,3,1],[0,0;5,0;30,40;0,0]);
[score, weight] = entropyWeight(p);%% 第三步:TOPSIS法计算,采用向量规范化
X = dataProcess(X,3,[1,2,3,1],[0,0;5,0;30,40;0,0]);
[sorted_S,index] = topsis(X,weight)

主要参考:
TOPSIS法(优劣解距离法)介绍及 python3 实现

有错误的话,欢迎指出!

TOPSIS和熵权法的应用(Matlab实现,包括数据预处理)相关推荐

  1. matlab 基于Topsis的熵权法2

    基于Topsis的熵权法2 %%基于Topsis的熵权法代码 %% 熵权法部分 clc,clear; xij=xlsread('accessory1.xls','A','C2:IH147'); [ro ...

  2. matlab 基于Topsis的熵权法

    基于Topsis的熵权法 clc,clear; testData=xlsread('accessory1.xls','C2:IH403'); R=testData; [rows,cols]=size( ...

  3. 数学建模笔记 Topsis和熵权法

    Topsis法(Technique for Order Preference by Similarity to Ideal Solution)可翻译为逼近理想解排序法,国内常简称为优劣解距离法. ​ ...

  4. 用matlab实现熵权法,熵权法原理及matlab代码实现

    参考原理博客地址https://blog.csdn.net/u013713294/article/details/53407087 一.基本原理 在信息论中,熵是对不确定性的一种度量.信息量越大,不确 ...

  5. 数学建模之熵权法(EWM)matlab实例实现

    本文参考http://blog.sina.com.cn/s/blog_710e9b550101aqnv.html 熵权法是一种客观赋值的方法,即它通过数据所包含的信息量来确定权重,形象的说如果每个人考 ...

  6. 数学建模笔记——评价类模型之熵权法

    嗯,这次讲一讲熵权法,一种通过样本数据确定评价指标权重的方法. 熵权法 之前我们提到了TOPSIS方法,用来处理有数据的评价类模型.TOPSIS方法还蛮简单的,大概就三步. 将原始数据矩阵正向化. 也 ...

  7. 最常用的客观赋权方法——熵权法

    我们的征途是星辰大海,而并非烟尘人间. 文章目录 一.熵权法的原理 1.1 信息熵 1.2 熵权法 二.熵权法的主要步骤 2.1 数据标准化 2.2 求各指标在各方案下的比值 2.3 求各指标的信息熵 ...

  8. 《零基础数学建模》——TOPSIS+熵权法

    目录 ​ 前言 一.TOPSIS法(优劣解距离法) 1.模型原理 2.建模步骤 二.模型实现 第一步:将原始矩阵正向化 第二步:正向化矩阵标准化 第三步:计算得分并归一化 四.TOPSIS模型的总结与 ...

  9. 基于熵权法对Topsis模型的修正

    基于熵权法对Topsis模型的修正 有n个要评价的对象,m个评价指标的标准化矩阵,可以使用层次分析法给这m个评价指标确定权重 ∑j=1mωj=1\sum_{j=1}^m{\omega_j}=1 j=1 ...

最新文章

  1. 揭榜:2018中国AI英雄风云榜,年度10位杰出领军人物!
  2. JS正则表达式使用方法及示例
  3. C++中比较大小的表达式中,小于号和大于号都是不能连着打的,要用连接起来
  4. .NET特性(Attribute)应用一例
  5. eclipselink mysql_Eclipselink更新现有表
  6. 基于Hadoop 2.6.0运行数字排序的计算
  7. 依赖倒置原则_设计模式原则之依赖倒置原则
  8. Linux服务器系统管理优化,Linux服务器性能管理与优化
  9. [转]unresolved external symbol _*
  10. MonkeyTest小结
  11. 分享一张网上的测试工程师能力模型思维导图
  12. Chromedrive下载与安装
  13. 各类资源工具下载地址(http://msdn.itellyou.cn/)
  14. 执行taosdemo发生错误Unable to establish connection
  15. 使用钢琴键盘作为电脑键盘[关闭]
  16. python selenium学习之新浪微博
  17. 【阿里云原生架构】二、云原生架构的原则和模式
  18. Wiley-中国科学院文献情报中心开放科学联合研讨会第二讲:开放获取期刊选择及论文投稿...
  19. java锁的种类及研究
  20. poj 2579 Blurred Vision

热门文章

  1. 第四平方和定理,用c语言实现
  2. ThinkPHP6 预防XSS攻击的一点小建议
  3. 计数问题:1~n中x出现了多少次?
  4. 基于android定制的会议盒子
  5. docker最全笔记速查,逻辑清晰
  6. Xshell 免密连接云主机(以Vultr云服务为例)
  7. 工作中要怎样与同事相处呢?
  8. 2019组队赛第二场(ACM International Collegiate Programming Contest, Arabella Collegiate 解题报告 Apare_xzc
  9. github新手使用指南
  10. 猿创征文|我的Python成长之路