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 np
import pandas as pd
import 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,n2if n != n2:print("不是一个方阵,所以不能进行接下来的步骤")return Nonefor 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].realeig_ = eig_ / eig_.sum()if n > 15:CR = Nonewarnings.warn(("无法判断一致性"))else:CI = (max_eig - n) / (n - 1)if RI[n - 1] != 0:CR = CI / RI[n - 1]if CR < 0.1:print("矩阵的一致性可以被接受")else:print("矩阵的一致性不能被接受")return max_eig, CR, eig_# 特征值法求权重
def calculate_feature_weight(matrix, n):# 特征值法主要是通过求出矩阵的最大特征值和对应的特征向量,然后对其特征向量进行归一化,最后获得权重eigValue, eigVectors = np.linalg.eig(matrix)max_index = np.argmax(eigValue)max_eig = eigValue[max_index].realeig_ = eigVectors[:, max_index].real# 返回的是特征向量,而且max_index为最大的特征值,在这里一般为neig_ = eig_ / eig_.sum()# 这里返回的是特征向量return eig_# 算术平均法求权重
def calculate_arithemtic_mean(matrix):n = len(matrix)matrix_sum = sum(matrix)normalA = matrix / matrix_sum  # 归一化处理average_weight = []for i in range(0, n):# 按照列求和temSum = sum(normalA[i])average_weight.append(temSum / n)return np.array(average_weight)# 几何平均法求权重
def calculate_metric_mean(metrix):n = len(metrix)# 1表示按照行相乘,得到一个新的列向量,每行相乘获得一个列向量,所以用prod函数,vector = np.prod(metrix, 1)tem = pow(vector, 1 / n)# 开n次方# 归一化处理average_weight = tem / sum(tem)return average_weightif __name__ == "__main__":# 准则重要性矩阵,即为我们在这里的时候要输入准则性矩阵criteria = np.array([[1, 2, 7, 5, 5],[1 / 2, 1, 4, 3, 3],[1 / 7, 1 / 4, 1, 1 / 2, 1 / 3],[1 / 5, 1 / 3, 2, 1, 1],[1 / 5, 1 / 3, 3, 1, 1]])# 对每个准则,方案优劣排序,即为方案层也会有一个一致矩阵,所以需要判断b1 = np.array([[1, 1 / 3, 1 / 8], [3, 1, 1 / 3], [8, 3, 1]])b2 = np.array([[1, 2, 5], [1 / 2, 1, 2], [1 / 5, 1 / 2, 1]])b3 = np.array([[1, 1, 3], [1, 1, 3], [1 / 3, 1 / 3, 1]])b4 = np.array([[1, 3, 4], [1 / 3, 1, 1], [1 / 4, 1, 1]])b5 = np.array([[1, 4, 1 / 2], [1 / 4, 1, 1 / 4], [2, 4, 1]])b = [b1, b2, b3, b4, b5]matrix_in = criteriamax_eigen, CR, criteria_eigen = calculate_weight(matrix_in)print("准则层:最大特征值:{:.5f},CR={:<.5f},检验{}通过".format(max_eigen, CR, '' if CR < 0.1 else "不"))print("准则层权重为{}\n".format(criteria_eigen))max_eigen_list = []CR_list = []eigen_list = []for i in b:max_eigen, CR, eigen = calculate_weight(i)max_eigen_list.append(max_eigen)CR_list.append(CR)eigen_list.append(eigen)pd_print = pd.DataFrame(eigen_list, index=["准则" + str(i) for i in range(0, criteria.shape[0])],columns=["方案" + str(i) for i in range(0, b[0].shape[0])])pd_print.loc[:, '最大特征值'] = max_eigen_listpd_print.loc[:, 'CR'] = CR_listpd_print.loc[:, '一致性检验'] = pd_print.loc[:, 'CR'] < 0.1print("方案层")print(pd_print)# 目标层# np.dot()函数为向量点积和矩阵乘法,即为AHP最后的目的是将准则层的的特征向量和方案层的特征向量进行矩阵乘法,而且最后是1*方案层的矩阵,# criteria_eigen的shape为(1,5),而且eight_list为(5,3)的矩阵# 而且reshape类似于转置矩阵的作用,所以使得原来为(5,)变成(1,5)object = np.dot(criteria_eigen.reshape(1, -1), np.array(eigen_list))print("\n目标层", object)print("最优选择方案{}".format(np.argmax(object)))

权重求法

求权重的方法有三种,分别为几何,算术,特征值求权重法。

几何法求权重

将矩阵按行相乘,求得一个列向量,之后再将向量进行开n次方,最后进行归一化处理(归一化处理每一个元素除以其所在列的和)

# 几何平均法求权重
def calculate_metric_mean(metrix):n = len(metrix)# 1表示按照行相乘,得到一个新的列向量,每行相乘获得一个列向量,所以用prod函数,vector = np.prod(metrix, 1)tem = pow(vector, 1 / n)# 开n次方# 归一化处理average_weight = tem / sum(tem)return average_weight

算术平均法求权重

将判断矩阵按照列归一化(每一个元素除以其所在列的和),将归一化的各列相加(按行求和),将相加后得到的向量中每个元素除以n即可得到权重向量。而且也为列向量。

# 算术平均法求权重
def calculate_arithemtic_mean(matrix):n = len(matrix)matrix_sum = sum(matrix)normalA = matrix / matrix_sum  # 归一化处理average_weight = []for i in range(0, n):# 按照列求和temSum = sum(normalA[i])average_weight.append(temSum / n)return np.array(average_weight)

特征值求权重

求出矩阵A的最大特征值以及其对应的特征向量,对求出的特征向量进行归一化即可得到我们的权重。在这里我采用调用第三方库的方法直接求取。


# 特征值法求权重
def calculate_feature_weight(matrix, n):# 特征值法主要是通过求出矩阵的最大特征值和对应的特征向量,然后对其特征向量进行归一化,最后获得权重eigValue, eigVectors = np.linalg.eig(matrix)max_index = np.argmax(eigValue)max_eig = eigValue[max_index].realeig_ = eigVectors[:, max_index].real# 返回的是特征向量,而且max_index为最大的特征值,在这里一般为neig_ = eig_ / eig_.sum()# 这里返回的是特征向量return eig_

特征值和特征向量

而且特征值和特征向量的区别如图所示,特征值为标量,特征向量为一个矩阵,而且在这里特征值为一个(5)的array,特征向量为一个方阵,维基百科的解释如下,我觉得可能比较通俗易懂。

AHP的思路

  1. 分析方案层中的准则层(影响因素有几个),确定因素之间的关系,建立层次结构结构图。如图所示。

  1. 对于同一层次中的元素于上一层次的元素进行构造判断矩阵,而且需要通过一致性检验。(比如准则层对目标层求一致性矩阵)如图所示。

3.经过一致性检验之后的判断矩阵进行求解权重,然后得到相对权重,最后统一进行整理并进行排序。

  1. 计算得分,进行比较,得出方案的最优解。

参考

  1. https://zh.wikipedia.org/wiki/%E7%89%B9%E5%BE%81%E5%80%BC%E5%92%8C%E7%89%B9%E5%BE%81%E5%90%91%E9%87%8F

  1. https://zhuanlan.zhihu.com/p/101505929

AHP分析法(python代码实现)相关推荐

  1. 数学建模——层次分析法Python代码

    数学建模--层次分析法Python代码 import numpy as np class AHP: """ 相关信息的传入和准备 """ d ...

  2. 层次分析法python代码_Python 实现层次分析法

    import csv import numpy as np import tensorflow as tf #大概的思路是: #1.首先输入每个指标下面对应的对比矩阵,每个这个矩阵是由专家比较每两个 ...

  3. 【AHP层次分析法python部分实现】

    提示:仅用到AHP层次分析法的部分功能因此只完成了python的部分实现 目录 前言 一.AHP是什么? 层次分析法的特点: 层次分析法的原理: 二.使用步骤 参考视频 前言 提示:这里可以添加本文要 ...

  4. ahp层次分析法matlab代码_(案例)AHP层次决策分析Matlab编码计算

    "层次聚类分析Matlab编码计算" 01 - AHP层次决策分析计算函数 求判断矩阵最大特征根和归一化特征向量: function [maxEigVal,w] = maxEigV ...

  5. AHP层次分析法及代码

    基本原理 AHP多用于决策和评价类的模型. 应用AHP分析决策问题时,首先要把问题构造为一个有层次的结构模型. 在这个模型下,复杂问题被分解为元素的组成部分.这些元素又按其属性及关系形成若干层次.这些 ...

  6. ahp层次分析法matlab代码_Matlab数据分析实战,基于AHP高校食堂满意度调查分析

    层次分析法(Analytical Hierachy Process,AHP)是匹兹堡大学T.L.Saaty教授在20世纪70年代初期提出对定性问题进行定量分析的一种渐变灵活的多准则决策方案. 其特点是 ...

  7. AHP层次分析法python实现

    问题背景描述 某高校正在进行教师的评优工作,现应用层次分析法对待评教师的综合素质进行评价.整个层次结构分为三层,最高层即问题分析的总目标,要评选出优秀教师A:第二层是准则层,包括三种指标学识水平C1. ...

  8. 多准则决策问题评估方法 | 层次分析法(含代码)

    目前多准则决策问题的评估方法主要分为定性分析方法和定量分析方法两类.定性分析方法主要包括专家咨询.熵权法.案例研究和德尔菲法等:定量分析法主要包括层次分析法.主成分分析法.因子分析法.模糊综合评价法. ...

  9. 层次分析法——python

    原理 层次分析法根据问题的性质和要达到的总目标,将问题分解为不同的组成因素,并按照因素间的相互关联影响以及隶属关系将因素按不同层次聚集组合,形成–个多层次的分析结构模型,从而最终使问题归结为最低层(供 ...

最新文章

  1. 与时代共振,AI助力工业缺陷检测
  2. Xstream解析报文
  3. HTC解锁其Verizon和ATT等Android设备的Bootloader
  4. 圆环自带动画进度条ColorfulRingProgressView
  5. 一个产品新人的年终总结 PMcaff | 分享
  6. JS疑惑-2(作用域)
  7. iptables详解以及企业常用案例
  8. react学习(3)----不能在该位置用setstate
  9. oracle blob字段索引,在oracle 数据库中使用 Blob 字段存储 一张图片并读取
  10. android 在指定位置添加布局,Android 如何动态添加 View 并显示在指定位置。
  11. java监听器演示样例
  12. Delphi2007下cxComboBox乱码.
  13. 第四章 使用OpenCV探测来至运动的结构——Chapter 4:Exploring Structure from Motion Using OpenCV
  14. pyTorch常用工具包
  15. python做图笔记
  16. markdown基本语法.md
  17. Infopath Communicate with DB
  18. google海底光缆图_Google领头建造横跨太平洋海底光缆PLCN:连接香港,120Tbps
  19. Python《成功破解简单的 动态加载 的爬虫》
  20. 模式识别—贝叶斯决策理论

热门文章

  1. 张纪中选定潇浪饰新版《西游记》孙悟空
  2. Linux安装Docker并配置Docker镜像加速,daemon.json完整配置详解
  3. 计算机控制的分辨率,查看笔记本电脑屏幕分辨率的2种方法
  4. 服务器做热备份用重装系统吗,ftp服务器做双机热备
  5. 安装Android studio中遇到sdk工具选项缺失和HAXM安装。
  6. 大数据全套视频教程完整版
  7. 对电脑笑了二十分钟的帖子
  8. 库克和他的“后乔布斯”时代苹果
  9. tl-wdr5620虚拟服务器,TP-Link TL-WDR5620路由器怎么设置?
  10. 绝版珍藏---.net2.0框架老爷机专用