文章首发于我的个人博客:欢迎大佬们来逛逛
TOPSIS分析法
算法流程
- 假设有m个评价对象,n个评价指标,首先需要进行指标的正向化:
- 极大型
- 极小型
- 单点型
- 区间型
- 然后对正向化后的矩阵进行标准化,得到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= x11x21⋮xm1x11x22⋮xm2……⋱…x1nx2n⋮xmn ;
Z ij = x i j ∑ i = 1nx i j2Z_{ij}=\frac{x_{ij}}{\sqrt{\sum_{i=1}^nx_{ij}^2}} Zij=∑i=1nxij2xij
- 得到标准化后的矩阵后,我们要进行打分:计算出第 iii个评价对象与最大值的距离 Di+ D^{+}_iDi+ ,和最小值的距离 Di− D^{-}_iDi−
- 计算带组合权重的 TOPSIS 分析法还需要 D i +D^{+}_i Di+ D i −D^{-}_i Di− 分别再乘以权重 WWW
然后再开方。
- 计算带组合权重的 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= z11z21⋮zm1z11z22⋮zm2……⋱…z1nz2n⋮zmn ;
最大值( 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−,z2−…zn−)=(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=1∑m(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=1∑m(zj−−zij)2
- 计算出第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++Di−Di−
- 计算归一化后的得分:即每分数除以所有分数之和:
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