深入解析 AHP 层次分析法 中的逻辑校验机制,掌握 CR 值、CI 值 与 RI 值 的精准计算方法,解决专家打分中的逻辑矛盾难题。
在进行多准则决策分析(MCDM)时,尤其是使用 AHP 层次分析法(Analytic Hierarchy Process)时,专家或决策者需要对不同方案进行两两比较,构建判断矩阵。然而,人类的思维往往存在主观性和局限性,导致给出的评分可能出现逻辑上的“循环矛盾”。
例如:若专家认为方案 A 比 B 重要(A>B),B 比 C 重要(B>C),按照逻辑传递性,A 理应比 C 更重要。但如果专家直接打分时,却认为 C 比 A 更重要,这就构成了逻辑不一致。为了量化这种不一致的程度,我们需要引入一致性检验计算公式。
要完成一致性检验,必须依次计算三个关键指标:CI(一致性指标)、RI(平均随机一致性指标)和CR(一致性比率)。
这是最繁琐的一步。设判断矩阵为 A,其阶数为 n。我们需要找到满足方程 Aw = λ_max w 的最大特征值 λ_max 及其对应的特征向量 w(即权重向量)。
在实际应用中,通常采用和积法或方根法来近似计算,无需使用复杂的线性代数软件,具体步骤如下:
一旦获得最大特征值,即可计算 CI 值。该指标反映了矩阵偏离完全一致性的程度。
其中:
• λ_max:判断矩阵的最大特征值。
• n:矩阵的阶数(即因素的数量)。
注意: 当矩阵完全一致时,,此时 。CI 值越大,不一致程度越严重。
由于不同阶数的矩阵产生随机不一致的概率不同,我们需要一个基准值来进行修正,这个基准就是 RI(Random Index)。RI 是通过随机生成大量同阶矩阵并计算其平均 CI 值得到的。
| 矩阵阶数 n | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|
| RI 值 | 0.00 | 0.00 | 0.58 | 0.90 | 1.12 | 1.24 | 1.32 | 1.41 | 1.45 | 1.49 |
注:当 n=1 或 n=2 时,判断矩阵永远是一致的,因此 RI=0。
最后一步是将 CI 与 RI 相比,得到 CR 值。
判定标准:
假设我们要评估三个候选方案 A、B、C,构建了如下 3 阶判断矩阵:
| 方案 | A | B | C |
|---|---|---|---|
| A | 1 | 3 | 5 |
| B | 1/3 | 1 | 2 |
| C | 1/5 | 1/2 | 1 |
使用和积法:
计算 :
Row 1: 10.633 + 30.264 + 50.103 = 0.633 + 0.792 + 0.515 = 1.940
Row 2: 0.3330.633 + 10.264 + 20.103 = 0.211 + 0.264 + 0.206 = 0.681
Row 3: 0.20.633 + 0.50.264 + 10.103 = 0.127 + 0.132 + 0.103 = 0.362
计算 分量:
求平均值得到
已知 ,查表得 。
这通常意味着计算过程中出现了严重的浮点数误差,或者输入的判断矩阵本身就不符合正互反矩阵的定义(如 )。请检查原始数据是否录入错误。
这说明专家的打分逻辑非常混乱。例如,A 比 B 强很多,B 比 C 强很多,但 C 却被认为比 A 强很多。此时不能强行使用结果,必须重新组织专家会议,指出逻辑矛盾点,要求修正打分。
务必确认矩阵的阶数 n。如果是 4 个因素,必须查 n=4 对应的 RI 值(0.90),而不是默认的 0.58。阶数不同,容忍度完全不同。
对于大规模矩阵,手动计算效率极低且容易出错。以下是基于 NumPy 库的一键计算脚本:
import numpy as np
def check_consistency(matrix):
"""
计算判断矩阵的一致性检验
:param matrix: 二维 numpy 数组
:return: lambda_max, CI, RI, CR, is_pass
"""
n = len(matrix)
matrix = np.array(matrix, dtype=float)
# 1. 计算权重 (使用特征值法)
eigenvalues, eigenvectors = np.linalg.eig(matrix)
# 取最大特征值及其对应的特征向量
max_idx = np.argmax(np.real(eigenvalues))
lambda_max = np.real(eigenvalues[max_idx])
w = np.real(eigenvectors[:, max_idx])
# 归一化权重
w = w / np.sum(w)
# 2. 计算 CI
if n <= 2:
CI = 0
else:
CI = (lambda_max - n) / (n - 1)
# 3. 定义 RI 表
ri_table = {1: 0.00, 2: 0.00, 3: 0.58, 4: 0.90, 5: 1.12,
6: 1.24, 7: 1.32, 8: 1.41, 9: 1.45, 10: 1.49}
RI = ri_table.get(n, 1.49) # 默认取最大值
# 4. 计算 CR
CR = CI / RI if RI != 0 else 0
return {
"lambda_max": lambda_max,
"weights": w.tolist(),
"CI": CI,
"RI": RI,
"CR": CR,
"is_pass": CR < 0.1
}
示例调用
matrix_data = [[1, 3, 5], [1/3, 1, 2], [1/5, 1/2, 1]]
result = check_consistency(matrix_data)
print(f"最大特征值:{result['lambda_max']:.4f}")
print(f"一致性比率 CR: {result['CR']:.4f}")
print(f"检验结果:{'通过' if result['is_pass'] else '未通过'}")
A: 这种情况通常是因为打分过于接近临界状态。建议稍微调整矩阵中差异最大的那个元素,或者增加样本量(更多专家打分)来平滑数据。不要试图通过凑数字让 CR 刚好小于 0.1,那样会失去数据的真实性。
A: 熵权法是基于客观数据变异程度的,不需要一致性检验。但TOPSIS 法、模糊综合评价法等如果涉及主观赋权(如结合 AHP 权重),则必须对主观部分进行一致性检验。
A: 绝对不可以!直接修改权重是造假行为。正确的做法是回到判断矩阵层面,找出逻辑矛盾的条目,要求专家重新审视并修正原始打分,直到 CR < 0.1 为止。