0%

数据分析 | 层次分析法(APH)// Analytic Hierarchy Process

层次分析法 APH

层次分析法(APH,Analytic Hierarchy Process),又名专家分析法,1971年由Thomas L. Saaty(匹兹堡大学教授)提出,主要应用在不确定情况下及具有多个评估准则的决策问题上。

本质 Essence

层次分析法的本质:

  • 分层
  • 分权

整个过程可以由专家团参与完成。

分层 Hierarchy

分层,将一个复杂指标分解为若干子指标,每个子指标再各自分解为更小的子指标,逐层分解,直到可度量的末级指标。

分权 Weighting

分权,给同一层级的指标匹配权重,通过两两比较的方式降低比较难度。

步骤 Procedures

  1. 建立层次结构模型
  2. 构造指标的成对比较矩阵
  3. 计算权向量并进行一致性检验
  4. 计算组合权向量,并做组合一致性检验

建立层次结构模型

拆分为$n$个指标:$\lbrace x_1, x_2, \cdots, x_n \rbrace$

假设可拆解为3个指标/元素:$\lbrace x_1, x_2, x_3 \rbrace$

构造指标成对比较矩阵

用相对权重$a_{ij}$表示第$i$个指标/元素与第$j$个指标/元素相对上一层某个元素的重要性,构成成对比较矩阵/判断矩阵$\mathbf{A}=\left(a_{ij}\right)_{n\times n}$。其中,

  • $a_{ij} > 0$($i,j=1,\cdots,n$)
  • $a_{ii}=1$($i=1,\cdots, n$)
  • $a_{ij}=\frac{1}{a_{ji} }$($i,j=1,\cdots,n$)

对比时采用相对尺度,以尽可能减少性质不同的因素相互比较的困难,以提高准确度。由专家对同一层次内$n$个指标的相对重要性(两两因素间)打分。相对重要性的比例标度取1-9之间(可参考下表)。

比较值 定义 Meaning
1 两个因素相比,具有同等重要性
3 两个因素相比,前者比后者稍微重要
5 两个因素相比,前者比后者明显重要
7 两个因素相比,前者比后者强烈重要
9 两个因素相比,前者比后者极端重要
2,4,6,8 上述相邻判断的中间值
$x_1$$x_2$$x_3$
$x_1$157
$x_2$1/513
$x_3$1/71/31
  1. 先按列标准化
  2. 再求行平均值
$x_1$$x_2$$x_3$行平均值
$x_1$$\frac{35}{47}$$\frac{15}{19}$$\frac{7}{11}$157/217 即0.7235023
$x_2$$\frac{7}{47}$$\frac{3}{19}$$\frac{3}{11}$5693/29469 即0.1931861
$x_3$$\frac{5}{47}$$\frac{1}{19}$$\frac{1}{11}$2455/29469 即0.08330788

一致性 Consistency

一致性指标$CI$(Consistency Index):
$$CI=\frac{\lambda_{\max} - n}{ n - 1 }$$

其中,

  • $\lambda_{\max}$:指标矩阵特征值的最大值
  • $n$:指标个数

矩阵$\mathbf{A}$的特征值即行列式(determinant)$\left| \lambda \mathbf{I} - \mathbf{A} \right| = 0$的解。

\begin{equation}
\begin{aligned}
& \left| \lambda \mathbf{I} - \mathbf{A} \right| = 0 \\
\iff & \left|
\begin{array}{ccc}
\lambda - a_{11} & -a_{12} & -a_{13} \\
-a_{21} & \lambda - a_{22} & -a_{23} \\
-a_{31} & -a_{32} & \lambda - a_{33}
\end{array}
\right| = 0 \\
\iff & (\lambda - a_{11}) (-1)^{1+1} \left| \begin{array}{cc} \lambda - a_{22} & -a_{23} \\ -a_{32} & \lambda - a_{33} \end{array} \right| + (-a_{21})(-1)^{2+1} \left| \begin{array}{cc} -a_{12} & -a_{13} \\ -a_{32} & \lambda - a_{33} \end{array} \right| \\
& + (-a_{31})(-1)^{3+1} \left| \begin{array}{cc} -a_{12} & -a_{13} \\ \lambda - a_{22} & -a_{23} \end{array} \right|=0 \\
\iff & (\lambda - a_{11})\left[ (\lambda - a_{22})(\lambda - a_{33}) - a_{23}a_{32} \right] + a_{21} \left[ a_{13}a_{32} - a_{12}(\lambda - a_{33}) \right] \\
& - a_{31} \left[ a_{12}a_{23} - a_{13}(\lambda - a_{22}) \right] = 0
\end{aligned}
\end{equation}

使用Python求解矩阵的特征值:

1
2
3
4
5
6
7
8
9
import numpy as np
A = np.array(
[
矩阵元素
]
)
eigenvalue, featurevector = np.linalg.eig(mat)
print('特征值:', eigenvalue)
print('特征向量:', featurevector)

$$
\mathbf{A}=
\left(
\begin{array}{ccc}
1 & 5 & 7 \\
\frac{1}{5} & 1 & 3 \\
\frac{1}{7} & \frac{1}{3} & 1
\end{array}
\right)
$$

使用Python求解矩阵的特征值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import numpy as np

mat = np.array(
[
[1, 5, 7],
[1/5, 1, 3],
[1/7, 1/3, 1]
]
)
eigenvalue, featurevector = np.linalg.eig(mat)
print('特征值:', eigenvalue)
# 特征值: [ 3.06488758+0.j -0.03244379+0.44477021j -0.03244379-0.44477021j]
print('特征向量:', featurevector)
# 特征向量: [[ 0.96280192+0.j 0.96280192+0.j 0.96280192-0.j ]
# [ 0.24825501+0.j -0.1241275 +0.21499514j -0.1241275 -0.21499514j]
# [ 0.1066861 +0.j -0.05334305-0.09239287j -0.05334305+0.09239287j]]

则$\lambda_{\max} = 3.065$。因此一致性指标为
$$CI=\frac{3.065 - 5}{5 - 1} = -0.48375$$

随机一致性 Random Consistency

随机构造$N$个判断矩阵,并计算一致性指标$CI$,则随机一致性指标$RI$(Random Index)为
$$RI = \frac{1}{N}\sum_{i=1}^N CI_i$$

一致性检验 Consistency Check

一致性比率$CR$(Consistency Ratio):
$$CR = \frac{CI}{RI}$$

一般认为,$CR<0.1$为一致性检验通过。

实现代码

Python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
##### 自定义函数 #####
## 计算一致性指标CI
def CI_func(A):
'''
A:判断矩阵
n:指标个数
'''
n = len(A)
eigenValue, eigenVector = np.linalg.eig(A)
lambdaMax = max(eigenValue)
CI = (lambdaMax - n) / (n - 1)
return CI

## 计算随机一致性指标RI
def matrix_gen(seed):
'''
随机构造判断矩阵
'''
待补充

def RI_func(A, N):
'''
计算随机一致性指标RI
A:判断矩阵
N:随机次数
n:指标个数
'''
n = len(A)
ciRandom = []
for i in range(N):
B = matrix_gen(seed=i)
B_ci = CI_func(B)
ciRandom.append(B_ci)
RI = sum(ciRandom) / N
return RI


##### 一致性检验实操 ######
import numpy as np
## 判断矩阵
A = np.array([
矩阵元素
])
ci = CI_func(A)
N = 500 # 随机次数
ri = RI_func(A, N)
cr = ci / ri
if cr < 0.1:
print("一致性检验通过,一致性比率CR={}<0.1".format(cr))
else:
print("一致性检验不通过,一致性比率CR={}".format(cr))

参考资料 References

Thank you for your approval.

欢迎关注我的其它发布渠道