TOPSIS和熵权法的应用(Matlab实现,包括数据预处理)
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=⎣⎢⎢⎢⎢⎢⎢⎡x11x21...xn1x12x22...xn2............x1mx2m...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>ba∗=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=1nxixiyi∈[0,1](i=1,2,...,n)且i=1∑nyi=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=1nxi2xi
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)1i=1∑nyijln(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=1ndjdj
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=⎣⎢⎢⎢⎢⎢⎢⎡z11z21...zn1z12z22...zn2............z1mz2m...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∑mwj(Zj+−zij)2Di−=j=1∑mwj(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实现,包括数据预处理)相关推荐
- matlab 基于Topsis的熵权法2
基于Topsis的熵权法2 %%基于Topsis的熵权法代码 %% 熵权法部分 clc,clear; xij=xlsread('accessory1.xls','A','C2:IH147'); [ro ...
- matlab 基于Topsis的熵权法
基于Topsis的熵权法 clc,clear; testData=xlsread('accessory1.xls','C2:IH403'); R=testData; [rows,cols]=size( ...
- 数学建模笔记 Topsis和熵权法
Topsis法(Technique for Order Preference by Similarity to Ideal Solution)可翻译为逼近理想解排序法,国内常简称为优劣解距离法. ...
- 用matlab实现熵权法,熵权法原理及matlab代码实现
参考原理博客地址https://blog.csdn.net/u013713294/article/details/53407087 一.基本原理 在信息论中,熵是对不确定性的一种度量.信息量越大,不确 ...
- 数学建模之熵权法(EWM)matlab实例实现
本文参考http://blog.sina.com.cn/s/blog_710e9b550101aqnv.html 熵权法是一种客观赋值的方法,即它通过数据所包含的信息量来确定权重,形象的说如果每个人考 ...
- 数学建模笔记——评价类模型之熵权法
嗯,这次讲一讲熵权法,一种通过样本数据确定评价指标权重的方法. 熵权法 之前我们提到了TOPSIS方法,用来处理有数据的评价类模型.TOPSIS方法还蛮简单的,大概就三步. 将原始数据矩阵正向化. 也 ...
- 最常用的客观赋权方法——熵权法
我们的征途是星辰大海,而并非烟尘人间. 文章目录 一.熵权法的原理 1.1 信息熵 1.2 熵权法 二.熵权法的主要步骤 2.1 数据标准化 2.2 求各指标在各方案下的比值 2.3 求各指标的信息熵 ...
- 《零基础数学建模》——TOPSIS+熵权法
目录 前言 一.TOPSIS法(优劣解距离法) 1.模型原理 2.建模步骤 二.模型实现 第一步:将原始矩阵正向化 第二步:正向化矩阵标准化 第三步:计算得分并归一化 四.TOPSIS模型的总结与 ...
- 基于熵权法对Topsis模型的修正
基于熵权法对Topsis模型的修正 有n个要评价的对象,m个评价指标的标准化矩阵,可以使用层次分析法给这m个评价指标确定权重 ∑j=1mωj=1\sum_{j=1}^m{\omega_j}=1 j=1 ...
最新文章
- 揭榜:2018中国AI英雄风云榜,年度10位杰出领军人物!
- JS正则表达式使用方法及示例
- C++中比较大小的表达式中,小于号和大于号都是不能连着打的,要用连接起来
- .NET特性(Attribute)应用一例
- eclipselink mysql_Eclipselink更新现有表
- 基于Hadoop 2.6.0运行数字排序的计算
- 依赖倒置原则_设计模式原则之依赖倒置原则
- Linux服务器系统管理优化,Linux服务器性能管理与优化
- [转]unresolved external symbol _*
- MonkeyTest小结
- 分享一张网上的测试工程师能力模型思维导图
- Chromedrive下载与安装
- 各类资源工具下载地址(http://msdn.itellyou.cn/)
- 执行taosdemo发生错误Unable to establish connection
- 使用钢琴键盘作为电脑键盘[关闭]
- python selenium学习之新浪微博
- 【阿里云原生架构】二、云原生架构的原则和模式
- Wiley-中国科学院文献情报中心开放科学联合研讨会第二讲:开放获取期刊选择及论文投稿...
- java锁的种类及研究
- poj 2579 Blurred Vision