Python实现层次分析法
一、层次分析法有三种求法
- 算术平均权重
- 几何平均权重
- 特征值求权重
通常情况下,我们会将这几种方法结合使用,来增加说服力
**【划重点】**下面我直接分享可执行的代码,读者可直接使用,有基础的也可以拿去研究,整个代码我已重构,虽然手法可能略显粗糙,但是逻辑还是清楚的。
import numpy as np
from numpy import linalg
def s_s_a(n, C):
"""算术平均值求权重"""
w_1 = sum(C) / n
print("算术平均权重为:\n", w_1)
print("")
def j_h_a(n, A):
"""几何平均值求权重"""
B_2 = pow(np.prod(A, 1), 1/n) # 0是按行,1是按列
w_2 = B_2 / sum(B_2)
print("几何平均值权重:\n", w_2)
print("")
def t_v(V,eig_max,D):
"""特征值法求权重"""
c = np.where(V == eig_max)
B_3 = D[:, c.index(0)]
w_3 = B_3 / sum(B_3)
print("特征值法求权重:\n", w_3)
def main(A,B_z,C_z,D_z,R_I,n):
"""主程序"""
if D_z[1,:].all() == (np.array(B_z)*np.array(C_z)).all():
print("该矩阵是正互反矩阵!\n")
V,D = np.linalg.eig(A)
eig_max = max(V)
CI = (eig_max-n) / (n-1)
RI = R_I[n-1]
CR = CI / RI
if CR < 0.1:
print("一致性检验通过!\n")
B_1 = np.zeros([n,n])
for i in range(0,n):
B_1[0:n,i] = A[0:n,i] / sum(A[0:n,i])
C = B_1.T
s_s_a(n, C)
j_h_a(n, A)
t_v(V,eig_max,D)
else:
print("一致性检验失败,请修改!")
else:
print("您输入的矩阵非正互反矩阵")
R_I = np.array([0, 0 , 0.52, 0.89, 1.12, 1.26, 1.36, 1.41,
1.46, 1.49, 1.52, 1.54, 1.56, 1.58, 1.59])
A = np.array([[1, 1, 4, 1/3, 3],
[1, 1, 4, 1/3 ,3],
[1/4, 1/4, 1, 1/3, 1/2,],
[3, 3, 3, 1, 3],
[1/3, 1/3, 2, 1/3, 1]])
n = len(A)
B_z = []
C_z = []
for i in range(0,n):
for j in range(0,n):
B_z.append(A[i,j])
C_z.append(A[j,i])
D_z = np.ones([len(B_z), len(B_z)])
main(A,B_z,C_z,D_z,R_I,n)
程序运行的截图
结语
至此,层次分析法就已经分享完了,如果你觉得有用就辛苦点个赞,毕竟劳动是光荣的,应该值得被尊重;此外,如果你有不懂的地方,欢迎留言,因为这个部分我没有做理论以及代码的解释,实在是有点时间不够,敬请谅解。