小工具知识网

当前位置: 首页 > 行业知识 > AHP分析法(python代码实现)

行业知识

AHP分析法(python代码实现)

2026-10-30 17:01:14 来源:互联网转载

AHP的简介

层���分析法(Analytic Hierarchy Process (AHP))是的一种主观赋值评价方法,将与决策有关的元素分解成目标、准则、方案等多个层次,并在此基础上进行定性和定量分析,是一种系统、简便、灵活有效的决策方法。

简单来说,AHP常用于解决评价类问题,评价类问题例子:购买一个物品的时候会跟其他店的同款商品进行比较,最终确定一个商品。

AHP经常将一个决策(一个决定)分解为目标层,准侧层,方案层。例子如图所示。

而且AHP中涉及的矩阵都需要是一致矩阵。

AHP的局限

  1. 评价的决策层(方案层)和准则层不能过多,因为如果决策层和准则层过多,一致性检验难以实现(最大为n=15),而且判断矩阵和一致矩阵差异较大。从而难以通过一致性检验。

  1. 决策层的指标和数据已知,我们如何更好的利用已知的数据进行构造一致性矩阵。

AHP的基础知识

    • 正互反矩阵成立条件

  1. 矩阵中的每个元素都要大于0

  1. 任意,满足这两个条件即为正互反矩阵。

    • 一致矩阵成立条件

  1. 矩阵中的每个元素都要大于0

  1. 任意

  1. 任意

3. 一致性检验

AHP的的代码

在这里只需要修改准则层对于目标层的判断矩阵,以及对于方案层对于准则层矩阵的判断矩阵即可。其他都为现成的代码。可直接应用,但是需要按照对应进行修改方案层对于准则层矩阵的判断矩阵的个数。

全部代码

import numpy as npimport pandas as pdimport warnings# 这里的意思是求权重之前我们需要进行一致性检验# 参考:https://zhuanlan.zhihu.com/p/101505929# 参考:https://blog.csdn.net/knighthood2001/article/details/127519604?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2-127519604-blog-98480769.pc_relevant_recovery_v2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2-127519604-blog-98480769.pc_relevant_recovery_v2&utm_relevant_index=3# 一致性检验def calculate_weight(data):    RI = (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)    # 转化为array类型的对象    in_matrix = np.array(data)    n, n2 = in_matrix.shape    # 判断矩阵是否为方阵,而且矩阵的大小为n,n2    if n != n2:        print("不是一个方阵,所以不能进行接下来的步骤")        return None    for i in range(0, n):        for j in range(0, n2):            if np.abs(in_matrix[i, j] * in_matrix[j, i] - 1) > 1e-7:                raise ValueError("不为正互反矩阵")    eig_values, eig_vectors = np.linalg.eig(in_matrix)    # eigvalues为特征向量,eigvectors为特征值构成的对角矩阵(而且其他位置都为0,对角元素为特征值)    max_index = np.argmax(eig_values)    # argmax为获取最大特征值的下标,而且这里是获取实部    max_eig = eig_values[max_index].real    # 这里max_eig是最大的特征值    eig_ = eig_vectors[:, max_index].real    eig_ = eig_ / eig_.sum()    if n > 15:        CR = None        warnings.warn(("无法判断一致性"))    else:        CI = (max_eig - n) / (n - 1)        if RI[n - 1] != 0:            CR = CI / RI[n - 1]        if CR 

上一篇:怎么无法获取服务器列表?

下一篇:王者小助手,游戏玩家的神器利器!