🔆 文章首发于我的个人博客:欢迎大佬们来逛逛
TOPSIS分析法
算法流程
- 假设有m个评价对象,n个评价指标,首先需要进行指标的正向化 :
- 极大型
- 极小型
- 单点型
- 区间型
- 然后对正向化后的矩阵进行标准化 ,得到 Z Z Z 矩阵:假设 X X X 为正向化后的矩阵,则 Z Z Z 是标准化后的矩阵:
X = [ x 11 x 11 . . . x 1 n x 21 x 22 . . . x 2 n ⋮ ⋮ ⋱ ⋮ x m 1 x m 2 . . . x m n ] ; X=\begin{bmatrix}x_{11}&x_{11}&...&x_{1n}\\x_{21}&x_{22}&...&x_{2n}\\\vdots&\vdots&\ddots&\vdots\\x_{m1}&x_{m2}&...&x_{mn}\end{bmatrix}; X= x11x21⋮xm1x11x22⋮xm2......⋱...x1nx2n⋮xmn ;
Z i j = x i j ∑ i = 1 n x i j 2 Z_{ij}=\frac{x_{ij}}{\sqrt{\sum_{i=1}^nx_{ij}^2}} Zij=∑i=1nxij2 xij
- 得到标准化后的矩阵后,我们要进行打分:计算出第 i i i个评价对象与最大值的距离 D i + D^{+}_i Di+ ,和最小值的距离 D i − D^{-}_i Di−
- 计算带组合权重的 TOPSIS 分析法还需要 D i + D^{+}_i Di+ D i − D^{-}_i Di− 分别再乘以权重 W W W
然后再开方。
- 计算带组合权重的 TOPSIS 分析法还需要 D i + D^{+}_i Di+ D i − D^{-}_i Di− 分别再乘以权重 W W W
Z = [ z 11 z 11 . . . z 1 n z 21 z 22 . . . z 2 n ⋮ ⋮ ⋱ ⋮ z m 1 z m 2 . . . z m n ] ; Z=\begin{bmatrix}z_{11}&z_{11}&...&z_{1n}\\z_{21}&z_{22}&...&z_{2n}\\\vdots&\vdots&\ddots&\vdots\\z_{m1}&z_{m2}&...&z_{mn}\end{bmatrix}; Z= z11z21⋮zm1z11z22⋮zm2......⋱...z1nz2n⋮zmn ;
最大值 ( z 1 + , z 2 + . . . z n + ) = ( max { z 11 , z 21 , . . . , z m 1 } , max { z 12 , z 22 , . . . , z m 2 } , . . . , max { z 1 n , z 2 n , . . . , z m n } ) ∣ 最大值(z^{+}1,z^{+}2 ...z^{+}n) = \left.\left(\max\begin{Bmatrix}z{11},z{21},...,z{m1}\end{Bmatrix},\max\begin{Bmatrix}z_{12},z_{22},...,z_{m2}\end{Bmatrix},...,\max\begin{Bmatrix}z_{1n},z_{2n},...,z_{mn}\end{Bmatrix}\right)\right| 最大值(z1+,z2+...zn+)=(max{z11,z21,...,zm1},max{z12,z22,...,zm2},...,max{z1n,z2n,...,zmn})
最小值 ( z 1 − , z 2 − . . . z n − ) = ( min { z 11 , z 21 , . . . , z m 1 } , min { z 12 , z 22 , . . . , z m 2 } , . . . , min { z 1 n , z 2 n , . . . , z m n } ) ∣ 最小值(z^{-}1,z^{-}2 ...z^{-}n) = \left.\left(\min\begin{Bmatrix}z{11},z{21},...,z{m1}\end{Bmatrix},\min\begin{Bmatrix}z_{12},z_{22},...,z_{m2}\end{Bmatrix},...,\min\begin{Bmatrix}z_{1n},z_{2n},...,z_{mn}\end{Bmatrix}\right)\right| 最小值(z1−,z2−...zn−)=(min{z11,z21,...,zm1},min{z12,z22,...,zm2},...,min{z1n,z2n,...,zmn})
D i + = ∑ j = 1 m ( z j + − z i j ) 2 D_{i}^{+}=\sqrt{\sum_{j=1}^{m}(z_{j}^{+}-z_{ij})^{2}} Di+=j=1∑m(zj+−zij)2
D i − = ∑ j = 1 m ( z j − − z i j ) 2 {\cal D}{i}^{-}=\sqrt{\sum{j=1}^{m}(z_{j}^{-}-z_{ij})^{2}} Di−=j=1∑m(zj−−zij)2
- 计算出第 i i i 个评价对象未归一化后的得分: S i S_i Si ,很明显 0 < = S i < = 1 0<= S_i <=1 0<=Si<=1,且 S i S_i Si 越大 D i + D^{+}_i Di+ 越小,越接近最大值。
S i = D i − D i + + D i − S_i=\frac{D_i^-}{D_i^++D_i^-} Si=Di++Di−Di−
- 计算归一化后的得分:即每分数除以所有分数之和:
s t a n d _ S = S i ∑ i = 1 n S i stand\S=\frac{S_i}{\sum{i=1}^nS_i} stand_S=∑i=1nSiSi
程序代码
matlab
function [score]=mfunc_TOPSIS(data,W)
% TOPSIS方法:求解每个对象的综合评价得分
% paramts:
% data: 原始数据矩阵,(m,n) m为评价对象,n为评价指标
% W: 每个指标的初始权重
% returns:
% Score:每个评价对象的综合得分
%X输入的数据,W各指标的权重
[n,~]=size(data);
%Z=zscore(X);
Z = data ./ repmat(sum(data.*data) .^ 0.5, n, 1); %矩阵标准化
V_D = sum(((Z - repmat(max(Z),n,1)) .^ 2 ) .* repmat(W,n,1) ,2) .^ 0.5;
V_X = sum(((Z - repmat(min(Z),n,1)) .^ 2 ) .* repmat(W,n,1) ,2) .^ 0.5;
S = V_X ./ (V_D+V_X); %未归一化得分
Score_S = S / sum(S); %归一化得分,即为每个企业的投资风险评分,值越大,投资风险也越大
% score=Score_S;
score=100*Score_S/max(Score_S);
end