层次分析法——AHP
python实现
# 导入相关库
import numpy as np
from matplotlib import pyplot as plt
import pandas as pd
#解决中文乱码
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
#构造判断矩阵
def judge_matrix():
A = np.array([
[1, 2, 0.3 , 0.25],
[0.5, 1, 0.25 , 0.2],
[3, 4, 1 , 0.5],
[4, 5, 2, 1]
])
return A
#利用几何平均法求解最大特征值和特征向量
def feature_1(A):
(n, m) = A.shape
M_i = np.ones((n, 1))
# a.按行累乘
for i in range(m):
M_i = M_i * A[:, i].reshape((n, 1))
# b.n次方根
W_i = M_i ** (1 / m)
# c.归一化 - 得出特征向量
w = W_i / np.sum(W_i)
# 计算最大特征值
lambda1 = (1 / m) * np.sum((A @ w) / w)
return [w, lambda1]
# 利用numpy计算最大特征值和特征向量
def feature(A):
a, b = np.linalg.eig(A)
# 计算最大特征值
print(a[0])
lambda1 = a[0]
# 计算特征向量
w = b[:, 0] / np.sum(b[:, 0])
return [w, lambda1]
#对判断矩阵进行一致性检验
def checkout(lambda1, A, w):
#求解一致性指标CI
(n, m) = A.shape
CI = (lambda1 - n) / (n - 1)
#平均随机一致性指标RI
RI = np.array([0, 0, 0.58, 0.90, 1.12, 1.24, 1.32, 1.41, 1.45])
index = []
for k in range(np.size(RI)):
index.append(k + 1)
data = {
"阶数": index,
"RI": RI
}
pd.DataFrame(data)
#一致性比率CR
CR = CI / RI[n - 1]
# 一致性检验
if CR < 0.1:
print("通过一致性检验")
print("CI={0}".format(CI))
print("CR={0}".format(CR))
print("最大特征值:{0}".format(lambda1))
print("特征值向量:")
print(w)
else:
print("判断矩阵一致性检验失败")
#主程序
if __name__=="__main__":
#构造判断矩阵
A = judge_matrix()
#求解判断矩阵的最大特征值和特征向量
[w, lambda1] = feature_1(A)
#矩阵的一致性检验
checkout(A=A, lambda1=lambda1, w=w)