TOPSIS算法与熵权法

TOPSIS 算法与熵权法
TOPSIS 算法
英⽂全称Technique for Order Preference by Similarity to Ideal Solution,翻译为逼近理想解排序法。使⽤层次分析法进⾏评价时,n 不能很⼤,最多就15个,再多就没有随机⼀致性指标RI的值了。当评价的对象⽐较多的时候,我们可以利⽤数据信息进⾏评价。
基本过程为先将原始数据矩阵统⼀指标类型(⼀般正向化处理)得到正向化的矩阵,再对正向化的矩阵进⾏标准化处理以消除各指标量纲的影响,并到有限⽅案中的最优⽅案和最劣⽅案,然后分别计算各评价对象与最优⽅案和最劣⽅案间的距离,获得各评价对象与最优⽅案的相对接近程度,以此作为评价优劣的依据。该⽅法对数据分布及样本含量没有严格限制,数据计算简单易⾏。三种指标与正向化⽅法
极⼩型指标转化为极⼤型指标:,或者 中间型指标转化为极⼤型指标:
⾸先得到距离最远的值:,然后计算该对象这个指标正向化后的值:区间型指标转化为极⼤型指标:
⾸先计算距离这个区间最远的值: 计算⽅法
(1)原始矩阵正向化
将矩阵中的极⼩型,中间型和区间型指标正向化为极⼤型指标
(2)正向化矩阵标准化
也就是每⼀个元素/其所在列的元素平⽅和开平⽅(3)计算得分和归⼀化排序
计算每⼀列的最⼤值  和最⼩值 计算每个对象与最⼤值的距离 和最⼩值 得分:归⼀化:代码
使⽤熵权法确定权重
clear ;clc
load data_water_quality .mat
%%  第⼆步:判断是否需要正向化
[n ,m ] = size (X );
disp (['共有' num2str (n ) '个评价对象, ' num2str (m ) '个评价指标'])
Judge = input (['这' num2str (m ) '个指标是否需要经过正向化处理,需要请输⼊1 ,不需要输⼊0:  ']);
if  Judge == 1
Position = 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 ));
end
max −x 1/x
M =max {∣x −x ∣}i best =x
i ~1−M
∣x −x ∣i best M =max{a −min {x },max{x }−i i b }=x i ~1−,x <M a −x i i a =x
i ~1,a <=x <i =b =x i ~1−,x >M x −b i i b z =ij x /ij x ∑i =1n ij 2
Z +Z −
D +D −
sonymt27i
S =i D +D i +i
−D i −=S i ~S /S i ∑i =1n
i
end
disp('正向化后的矩阵 X =  ')
disp(X)
end
%%第三步:对正向化后的矩阵进⾏标准化
Z = X ./repmat(sum(X.*X).^0.5, n,1);
disp('标准化矩阵 Z = ')企业如何管理人才
disp(Z)
%%让⽤户判断是否需要增加权重
disp("请输⼊是否需要增加权重向量,需要输⼊1,不需要输⼊0")
Judge =input('请输⼊是否需要增加权重: ');
if Judge ==1
Judge =input('使⽤熵权法确定权重请输⼊1,否则输⼊0: ');
if Judge ==1
if sum(sum(Z<0))>0%如果之前标准化后的Z矩阵中存在负数,则重新对X进⾏标准化
disp('原来标准化得到的Z矩阵中存在负数,所以需要对X重新标准化')
for i =1:n
for j =1:m
Z(i,j)=[X(i,j)-min(X(:,j))]/[max(X(:,j))-min(X(:,j))];
end
end
disp('X重新进⾏标准化得到的标准化矩阵Z为:  ')tatp
disp(Z)
end
weight =Entropy_Method(Z);
disp('熵权法确定的权重为:')
disp(weight)
else
disp(['如果你有3个指标,你就需要输⼊3个权重,例如它们分别为0.25,0.25,0.5, 则你需要输⼊[0.25,0.25,0.5]']);
weight =input(['你需要输⼊'num2str(m)'个权数。''请以⾏向量的形式输⼊这'num2str(m)'个权重: ']);
OK =0;%⽤来判断⽤户的输⼊格式是否正确
while OK ==0
if abs(sum(weight)-1)<0.000001&&size(weight,1)==1&&size(weight,2)== m  %注意,Matlab中浮点数的⽐较要⼩⼼                OK =1;
else
weight =input('你输⼊的有误,请重新输⼊权重⾏向量: ');
end
end
end
else
weight =ones(1,m)./ m ;%如果不需要加权重就默认权重都相同,即都为1/m
end
%%第四步:计算与最⼤值的距离和最⼩值的距离,并算出得分
D_P =sum([(Z -repmat(max(Z),n,1)).^2].*repmat(weight,n,1),2).^0.5;% D+与最⼤值的距离向量
D_N =sum([(Z -repmat(min(Z),n,1)).^2].*repmat(weight,n,1),2).^0.5;% D-与最⼩值的距离向量
S = D_N ./(D_P+D_N);%未归⼀化的得分
disp('最后的得分为:')
stand_S = S /sum(S)
[sorted_S,index]=sort(stand_S ,'descend')
我更改后的Positivization⽂件代码:
function [change_x ] = Positive_Change (src_x , type , index )
if  type == 1
disp (['极⼩型的列:' num2str (index )]);
change_x = max (src_x ) - src_x ;
disp ('----------极⼩型正向化完成----------')
elseif type == 2
disp (['中间型的列:' num2str (index )]);
best_num = input ('请输⼊该指标最好的值:');
M = max (abs (src_x - best_num ));    % 得到距离最远的值
change_x = 1 - abs (src_x - best_num )/M ;
disp ('----------中间型正向化完成----------')
elseif type == 3
disp (['区间型的列:' num2str (index )]);
L = input ('区间上界:');
裂隙制造者R = input ('区间下界:');
row_x = size (src_x , 1);
续修四库全书
M = max ([L - min (src_x ), max (src_x ) - R ]);
结晶氯化铝
for  i = 1 : row_x
if  src_x (i ) < L    % 距离上界的⼤⼩
change_x (i ) = 1 - (L - src_x (i )) / M ;
elseif src_x (i ) > R % 距离下界的⼤⼩
change_x (i ) = 1 - (src_x (i ) - R ) / M ;
else
change_x (i ) = 1;
end
end
disp ('----------区间型正向化完成----------')
else
disp ('类型输⼊错误!');
end
end
熵权法
层次分析法的权重⼤多是由⾃⼰确定的,主观性太强。熵权法是⼀种客观赋权⽅法,当数据变异程度越⼩,可以理解为⽅差越⼩,数据所含的信息越⼩,权重也就越低。常常使⽤差学⽣考⽣清华和好学⽣考上清华做为例⼦对⽐。
但是熵权法也有⾃⼰的弊端,对于⼀些极端情况,有些指标的变异程度虽然⾮常⼩,但是可能其权重很⼤,例如在评选奖学⾦的时候记档案次数和迟到次数,通过熵权法得到这两个指标的权值与实际常识不符。
信息熵
当越有可能发⽣的事情,信息量越⼩;当越不可能发⽣的事情,信息量越多。
我们使⽤概率表⽰事情发⽣的可能性⼤⼩,也就是概率与信息量呈反⽐,我们可以使⽤对数函数前加负号表⽰它们之间的关系。
设为事件发⽣的⼀种情况,这种情况发⽣的概率为,那么它的信息量 可以定义为:。如果事件所有可能发⽣的情况为:那么事件的信息熵可以定义为:可以看出信息熵其实是信息量的期望值。
当所有事件发⽣的情况概率相同时,信息熵最⼤(了解)计算步骤
(1)⾸先对输⼊的矩阵进⾏正向化,对构成的正向化矩阵进⾏标准化得到矩阵,的元素:如果Z中存在负数,需要对使⽤另⼀种标准化⽅法得到:
即x减去这⼀列最⼩值除去这⼀列的最⼤值减最⼩值
x X p (x )I (x )=−ln(p (x ))X x ,x ,...,x 12n
X H (x )=[p (x )I (x )]=∑i =1n i i −[p (x )ln(p (x ))]
∑i =1n
i i Z Z Z =ij x /
ij x ∑i =1n ij 2X Z ~
=z ij ~ma x{x ,x ,...x }−min{x ,x ,...x }1j 2j nj 1j 2j nj x −min{x ,x ,...x }
ij 1j 2j nj
(2)计算第项指标下第i个样本的⽐重,将其看作相对熵计算中的概率(3)计算每个指标的信息熵,并计算信息有效值,归⼀化得到每个指标的熵权信息熵的计算公式:当时最⼤,此时,除以可以使信
息熵始终位于上⾯。当越⼤,j指标的信息熵越⼤,那么第j个指标所包含的信息越少,当取得最⼤值的时候,那么,即所有的指标值都相同,信息效⽤值最⼩。
信息效⽤值:,当信息效⽤值越⼤,对应的信息越多。
我们将信息效⽤值进⾏归⼀化,就能得到每个指标的熵权:代码
从得到标准化矩阵开始
function [W ] = Entropy_Method (Z )
% 计算有n 个样本,m 个指标的样本所对应的的熵权
% 输⼊
% Z : n *m 的矩阵(要经过正向化和标准化处理,且元素中不存在负数)
% 输出
% W :熵权,1*m 的⾏向量
%% 计算熵权
[n ,m ] = size (Z );
D = zeros (1,m );  % 初始化保存信息效⽤值的⾏向量
for  i = 1:m
x = Z (:,i );  % 取出第i 列的指标
p = x / sum (x );
% 注意,p 有可能为0,此时计算ln (p )*p 时,Matlab 会返回NaN ,所以这⾥我们⾃⼰定义⼀个函数
e = -sum (p .* mylog (p )) / log (n ); % 计算信息熵
D (i ) = 1- e ; % 计算信息效⽤值
end
W = D ./ sum (D );  % 将信息效⽤值归⼀化,得到权重
end j p =ij ∑i =1n z ij
~
z ij ~
e =j −p ln(p )
ln n 1∑i =1n ij ij p (x )=1p (x )=2...=p (x )=n n 1H (x )H (x )=ln n ln n [0,1]e j H (x )p =1j p =2j ...=p nj =z 1j ~
=z 2j ~...=z nj ~d =j 1−e j W =j d /d j ∑j =1m j
Z

本文发布于:2024-09-20 21:28:57,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/229696.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:指标   矩阵   权重   需要
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议