层次分析法步骤
- 建立递阶层次结构模型
- 构造出各层次中的所有判断矩阵
- 层次单排序及一致性检验
- 层次总排序及一致性检验
层次分析法的层次
- 目标层:决策目标,要解决的问题,一般只有一个目标
- 准则层:决策标准变量,为了达到目标,需要关注和对比的准则,一般有多个准则,最好不要超过9个
- 方案层:解决方案
成对比较矩阵
性质:
- 对角线元素为1:自己和自己比较
- 对称元素求乘积为1
- 比较值尽可能取奇数
层次单排序一致性检验 RI-CI检验
层次单排序
对比较矩阵进行特征值分解,最大的特征值为,与其对应的特征向量,对进行归一化后即为同一层次相应元素对于上一层次某因素相对重要性的排序权值(权重)。
一致性检验
定义CI:并定义RI表格,计算CR值: 一般,当一致性比率时,认为A的不一致程度在容许范围内,有满意的一致性,通过一致性检验 。
正互反矩阵
若矩阵满足 称之为正互反矩阵
定理:正互返矩阵的最大特征根必为正实数,其对应的特征向量的所有分量均为正实数。的其余特征值的模严格小于。
层次总排序一致性检验
自顶向下将单准则下的的权重进行合成,合成表,每列之和等于1,上一层次权重之和等于1,进行数乘,加权。
代码示例
import numpy as np
A = np.array([[1, 1/3, 1/4, 1/5],
[3, 1, 3/4, 3/5],
[4, 4/3, 1, 4/5],
[5, 5/3, 5/4, 1]])
m = len(A) # 获取指标个数
n = len(A[0])
RI = [0, 0, 0.58, 0.90, 1.12, 1.24, 1.32, 1.41, 1.45, 1.49, 1.51] # RI是给定的数量
rank = np.linalg.matrix_rank(A) # 求判断矩阵的秩
eigen_value,eigen_vector = np.linalg.eig(A) # 求判断矩阵的特征值eigen_value,特征向量eigen_vector
list1 = list(eigen_value)
largest_d = np.max(list1) # 求最大特征值
index = list1.index(largest_d)
C = eigen_vector[:,index] # 对应特征向量
CI = (largest_d - n) / (n-1)
CR = CI / RI[n-1]
if CR < 0.10:
print('CI = ', CI)
print('CR = ', CR)
print('对比矩阵A通过一致性检验,各向量权重向量Q为:')
sum = np.sum(C)
Q = C / sum # 特征向量标准化
print(Q) # 输出权重向量
else:
print('对比矩阵A未通过一致性检验,需对对比矩阵重新构造')