3. 层次分析法(AHP)基础:原理、矩阵、检验与权重
层次分析法,圈里人常叫它 AHP。说白了,就是把那些说不清、道不明的复杂决策,拆成一层一层的比较。你想想看,故障定位时,我们经常要判断“哪个指标更重要”——是响应延迟更关键,还是丢包率更致命?AHP 就是干这个的。
我个人习惯,在开始任何多准则故障评分之前,先拿 AHP 把权重定下来。不然你拍脑袋给个权重,回头别人一问“为什么这个因子占 0.3”,你答不上来,那就尴尬了。
3.1 AHP 的核心原理
AHP 是 Thomas Saaty 在 70 年代提出的。它的核心就三句话:
- 分解:把问题拆成目标、准则、方案三层。
- 比较:同一层的元素,两两比,看谁更重要。
- 综合:把比较结果算成权重,排个序。
我在项目中遇到过一件事:有个同事直接拿专家打分求平均,结果两个专家意见完全相反,平均下来变成了“中等重要”。这合理吗?不合理。AHP 的好处就是,它通过一致性检验,能揪出这种矛盾。
3.2 判断矩阵的构建
这是 AHP 最实操的一步。你要构建一个 n × n 的矩阵,矩阵里的元素 aij 表示“第 i 个因素相对于第 j 个因素的重要程度”。
怎么量化这个“重要程度”?Saaty 给出了 1-9 标度法:
| 标度 | 含义 |
|---|---|
| 1 | 两个因素同等重要 |
| 3 | 前者比后者稍微重要 |
| 5 | 前者比后者明显重要 |
| 7 | 前者比后者强烈重要 |
| 9 | 前者比后者极端重要 |
| 2,4,6,8 | 上述相邻判断的中间值 |
| 倒数 | 若 i 与 j 比较得 a,则 j 与 i 比较得 1/a |
举个例子。假设我们要评估三个故障指标:响应延迟 (L)、丢包率 (P)、CPU 使用率 (C)。我凭经验觉得:
- 延迟比丢包稍微重要 → 3
- 延迟比 CPU 明显重要 → 5
- 丢包比 CPU 介于稍微和明显之间 → 4
那么判断矩阵就是:
L P C
L [ 1.0, 3.0, 5.0 ]
P [ 0.33, 1.0, 4.0 ]
C [ 0.2, 0.25, 1.0 ]
3.3 一致性检验
为什么需要一致性检验?你想想看,如果你说 A > B,B > C,但又说 C > A,这就矛盾了。人的判断不可能完全一致,但也不能太离谱。
一致性检验的步骤:
- 计算一致性指标 CI:
CI = (λmax - n) / (n - 1)
其中 λmax 是矩阵的最大特征值,n 是矩阵阶数。 - 查平均随机一致性指标 RI:
| n | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|
| RI | 0 | 0 | 0.58 | 0.90 | 1.12 | 1.24 | 1.32 | 1.41 | 1.45 | 1.49 |
- 计算一致性比率 CR:
CR = CI / RI - 判断:如果 CR < 0.1,一致性可以接受;否则需要调整矩阵。
拿刚才的 3x3 矩阵举例。我算过它的 λmax ≈ 3.086,那么:
CI = (3.086 - 3) / (3 - 1) = 0.043
CR = 0.043 / 0.58 ≈ 0.074
0.074 < 0.1,通过。说明我的判断还算靠谱。
3.4 权重计算
权重计算有几种方法。最常用的是 特征向量法 和 几何平均法。我个人偏爱几何平均法,因为它计算简单,手算也能搞定。
几何平均法步骤:
- 对矩阵的每一行,计算所有元素的几何平均数。
- 将这些几何平均数归一化(加起来等于 1),就得到权重向量。
还是用刚才的矩阵:
行 1 (L): (1 × 3 × 5)^(1/3) = 15^(1/3) ≈ 2.466
行 2 (P): (0.33 × 1 × 4)^(1/3) = 1.32^(1/3) ≈ 1.097
行 3 (C): (0.2 × 0.25 × 1)^(1/3) = 0.05^(1/3) ≈ 0.368
总和 = 2.466 + 1.097 + 0.368 = 3.931
权重:
W_L = 2.466 / 3.931 ≈ 0.627
W_P = 1.097 / 3.931 ≈ 0.279
W_C = 0.368 / 3.931 ≈ 0.094
结果很清楚:延迟占 62.7%,丢包占 27.9%,CPU 占 9.4%。这个权重就可以直接用到后续的故障评分里。
numpy.linalg.eig 返回的特征值可能是复数,要取实部。我一般这样写:lambda_max = np.max(np.linalg.eigvals(matrix).real)
3.5 知识结构图
下面这张图把 AHP 的完整流程串起来了。从构建矩阵到一致性检验,再到权重计算,每一步都有对应的数学工具。
3.6 避坑与经验总结
做了这么多年故障诊断,我用 AHP 踩过不少坑。这里列几个最常见的:
- 矩阵阶数不要太大:n > 7 时,两两比较的次数是 n(n-1)/2,人脑根本顾不过来。我一般控制在 5 阶以内。
- 不要用平均值代替判断:多个专家打分时,先让每个专家各自构建矩阵,算权重,再对权重取平均。而不是先平均矩阵元素。
- CR 不通过怎么办?:先检查最大矛盾项。比如 A > B 给了 5,B > C 给了 3,但 A > C 只给了 2,这明显不一致。调整 A > C 到 7 左右,通常就能通过。