3. 层次分析法(AHP)基础:原理、矩阵、检验与权重

层次分析法,圈里人常叫它 AHP。说白了,就是把那些说不清、道不明的复杂决策,拆成一层一层的比较。你想想看,故障定位时,我们经常要判断“哪个指标更重要”——是响应延迟更关键,还是丢包率更致命?AHP 就是干这个的。

我个人习惯,在开始任何多准则故障评分之前,先拿 AHP 把权重定下来。不然你拍脑袋给个权重,回头别人一问“为什么这个因子占 0.3”,你答不上来,那就尴尬了。

3.1 AHP 的核心原理

AHP 是 Thomas Saaty 在 70 年代提出的。它的核心就三句话:

  • 分解:把问题拆成目标、准则、方案三层。
  • 比较:同一层的元素,两两比,看谁更重要。
  • 综合:把比较结果算成权重,排个序。

我在项目中遇到过一件事:有个同事直接拿专家打分求平均,结果两个专家意见完全相反,平均下来变成了“中等重要”。这合理吗?不合理。AHP 的好处就是,它通过一致性检验,能揪出这种矛盾。

核心思想: 决策不是比“值”,而是比“相对值”。你不需要说“延迟重要 0.6”,你只需要说“延迟比丢包稍微重要一点”。

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,这就矛盾了。人的判断不可能完全一致,但也不能太离谱。

一致性检验的步骤:

  1. 计算一致性指标 CI:
    CI = (λmax - n) / (n - 1)
    其中 λmax 是矩阵的最大特征值,n 是矩阵阶数。
  2. 查平均随机一致性指标 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
  1. 计算一致性比率 CR:
    CR = CI / RI
  2. 判断:如果 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,通过。说明我的判断还算靠谱。

避坑指南: 我曾经遇到一个 5 阶矩阵,CR 算出来 0.15。当时图省事没改,结果后面算出来的权重排序跟实际经验完全相反。后来老老实实回去调矩阵,把几个矛盾比较大的比值重新评估,CR 降到 0.08 才通过。所以,一致性检验不是走形式,它直接决定权重是否可信。

3.4 权重计算

权重计算有几种方法。最常用的是 特征向量法 和 几何平均法。我个人偏爱几何平均法,因为它计算简单,手算也能搞定。

几何平均法步骤:

  1. 对矩阵的每一行,计算所有元素的几何平均数。
  2. 将这些几何平均数归一化(加起来等于 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%。这个权重就可以直接用到后续的故障评分里。

代码实现小贴士: 如果你用 Python,NumPy 可以帮你快速算特征值和权重。但注意,numpy.linalg.eig 返回的特征值可能是复数,要取实部。我一般这样写:
lambda_max = np.max(np.linalg.eigvals(matrix).real)

3.5 知识结构图

下面这张图把 AHP 的完整流程串起来了。从构建矩阵到一致性检验,再到权重计算,每一步都有对应的数学工具。

AHP 核心流程与知识结构 AHP 层次分析法核心流程 构建判断矩阵 1-9 标度法,两两比较 计算 λmax 最大特征值 一致性检验 CI / RI → CR CR < 0.1 ? 计算权重向量 几何平均法 / 特征向量法 调整判断矩阵 重新评估矛盾项 输出:权重向量 用于故障评分 / 决策 💡 关键点 • 判断矩阵必须满足互反性:aij = 1 / aji • CR < 0.1 是硬门槛,不可妥协

3.6 避坑与经验总结

做了这么多年故障诊断,我用 AHP 踩过不少坑。这里列几个最常见的:

  • 矩阵阶数不要太大:n > 7 时,两两比较的次数是 n(n-1)/2,人脑根本顾不过来。我一般控制在 5 阶以内。
  • 不要用平均值代替判断:多个专家打分时,先让每个专家各自构建矩阵,算权重,再对权重取平均。而不是先平均矩阵元素。
  • CR 不通过怎么办?:先检查最大矛盾项。比如 A > B 给了 5,B > C 给了 3,但 A > C 只给了 2,这明显不一致。调整 A > C 到 7 左右,通常就能通过。
一句话总结: AHP 不是数学游戏,它是把人的经验“量化”成可计算的权重。矩阵是工具,一致性是门槛,权重是结果。三者缺一不可。