文章首发于我的个人博客:欢迎大佬们来逛逛

TOPSIS分析法

算法流程

  1. 假设有m个评价对象,n个评价指标,首先需要进行指标的正向化
    1. 极大型
    2. 极小型
    3. 单点型
    4. 区间型
  2. 然后对正向化后的矩阵进行标准化,得到ZZ Z 矩阵:假设XX X 为正向化后的矩阵,则 ZZ Z 是标准化后的矩阵:

X= [ x11x11…x 1 nx21x22…x 2 n⋮⋮⋱ ⋮x m 1x 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= x11x21xm1x11x22xm2x1nx2nxmn ;

Z ij = x i j ∑ i = 1nx i j2Z_{ij}=\frac{x_{ij}}{\sqrt{\sum_{i=1}^nx_{ij}^2}} Zij=i=1nxij2 xij

  1. 得到标准化后的矩阵后,我们要进行打分:计算出第 iii个评价对象与最大值的距离 Di+ D^{+}_iDi+ ,和最小值的距离 Di− D^{-}_iDi
    1. 计算带组合权重的 TOPSIS 分析法还需要 D i +D^{+}_i Di+ D i −D^{-}_i Di 分别再乘以权重 WWW
      然后再开方。

Z= [ z11z11…z 1 nz21z22…z 2 n⋮⋮⋱ ⋮z m 1z 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= z11z21zm1z11z22zm2z1nz2nzmn ;

最大值( z 1 +, z 2 +… z n +)= (max⁡ {z 11, z 21,…, z m1 },max⁡ {z 12, z 22,…, z m2 },…,max⁡ {z 1n , z 2n ,…, z mn })∣最大值(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 m1 },min⁡ {z 12, z 22,…, z m2 },…,min⁡ {z 1n , z 2n ,…, z mn })∣最小值(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,z2zn)=(min{z11,z21,,zm1},min{z12,z22,,zm2},,min{z1n,z2n,,zmn})

D i +=∑ j=1m( z j +− z ij) 2 D_{i}^{+}=\sqrt{\sum_{j=1}^{m}(z_{j}^{+}-z_{ij})^{2}} Di+=j=1m(zj+zij)2

D i −=∑ j=1m( z j −− z ij) 2 {\cal D}_{i}^{-}=\sqrt{\sum_{j=1}^{m}(z_{j}^{-}-z_{ij})^{2}} Di=j=1m(zjzij)2

  1. 计算出第ii i 个评价对象未归一化后的得分: S iS_i Si ,很明显 0<= S i<=10<= S_i <=1 0<=Si<=1,且 S iS_i Si 越大 D i +D^{+}_i Di+ 越小,越接近最大值

S i= Di− D i ++ D i − S_i=\frac{D_i^-}{D_i^++D_i^-} Si=Di++DiDi

  1. 计算归一化后的得分:即每分数除以所有分数之和:

stand_S= Si ∑ i=1n S i stand\_S=\frac{S_i}{\sum_{i=1}^nS_i} stand_S=i=1nSiSi

程序代码

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