层次分析法python实现

层次分析法——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)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值