AHP(层次分析法)python实现

一、源代码
输入正互反矩阵,先进行一致性检验,判断是否通过,通过后返回权重。

def AHP(A) -> np.array:
    # 平均随机一致性指标。
    RI_dict = {1: 0, 2: 0, 3: 0.58, 4: 0.90, 5: 1.12, 6: 1.24, 7: 1.32, 8: 1.41, 9: 1.45, 10: 1.49}
    n = len(A)
    for i in range(1, n):
        for k in range(i):
            A[i][k] = 1 / A[k][i]
    A = np.array(A)
    w, v = np.linalg.eig(A)
    lambda_max = np.max(abs(w))
    index = list(w).index(abs(w).max())
    CI = (lambda_max - n) / (n - 1)
    RI = RI_dict[n]
    CR = CI / RI
    y = 0
    if CR < 0.1:
        print("随机一致性指标为{},判断矩阵具有满意的一致性。".format(CR))
        x = v[:, index].sum(axis=0)  # 对列向量求和,对于第一列求和
        y = v[:, index] / x  # 第一列进行归一化处理
        print("最大的特征值为:", lambda_max)
        print("对应的特征向量为:", abs(y).round(3))
    else:
        print("随机一致性指标为{},判断矩阵不具有满意的一致性。".format(CR))
    print("各指标权重为:", abs(y))
    return abs(y)

二、例子

X = [[1, 1 / 5, 1, 1 / 3, 1, 1],
     [5, 1, 5, 3, 7, 7],
     [1, 1 / 5, 1, 3, 5, 5],
     [3, 1 / 3, 1 / 3, 1, 1, 1],
     [1, 1 / 7, 1 / 5, 1, 1, 1],
     [1, 1 / 7, 1 / 5, 1, 1, 1]]
W = AHP(X)
print()
print(W)

输出

随机一致性指标为0.0993908598585786,判断矩阵具有满意的一致性。
最大的特征值为: 6.616223331123187
对应的特征向量为: [0.083 0.475 0.205 0.108 0.065 0.065]
各指标权重为: [0.0828432  0.47512185 0.2046549  0.10769012 0.06484497 0.06484497]

[0.0828432  0.47512185 0.2046549  0.10769012 0.06484497 0.06484497]

你可能感兴趣的:(python,线性代数,算法)