python实现AHP算法的方法实例(层次分析法)


Posted in Python onSeptember 09, 2020

一、层次分析法原理

层次分析法(Analytic Hierarchy Process,AHP)由美国运筹学家托马斯·塞蒂(T. L. Saaty)于20世纪70年代中期提出,用于确定评价模型中各评价因子/准则的权重,进一步选择最优方案。该方法仍具有较强的主观性,判断/比较矩阵的构造在一定程度上是拍脑门决定的,一致性检验只是检验拍脑门有没有自相矛盾得太离谱。

相关的理论参考可见:wiki百科

二、代码实现

需要借助Python的numpy矩阵运算包,代码最后用了一个b1矩阵进行了调试,相关代码如下,具体的实现流程已经用详细的注释标明,各位小伙伴有疑问的欢迎留言和我一起讨论。

import numpy as np
class AHP:
  """
  相关信息的传入和准备
  """

  def __init__(self, array):
    ## 记录矩阵相关信息
    self.array = array
    ## 记录矩阵大小
    self.n = array.shape[0]
    # 初始化RI值,用于一致性检验
    self.RI_list = [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]
    # 矩阵的特征值和特征向量
    self.eig_val, self.eig_vector = np.linalg.eig(self.array)
    # 矩阵的最大特征值
    self.max_eig_val = np.max(self.eig_val)
    # 矩阵最大特征值对应的特征向量
    self.max_eig_vector = self.eig_vector[:, np.argmax(self.eig_val)].real
    # 矩阵的一致性指标CI
    self.CI_val = (self.max_eig_val - self.n) / (self.n - 1)
    # 矩阵的一致性比例CR
    self.CR_val = self.CI_val / (self.RI_list[self.n - 1])

  """
  一致性判断
  """

  def test_consist(self):
    # 打印矩阵的一致性指标CI和一致性比例CR
    print("判断矩阵的CI值为:" + str(self.CI_val))
    print("判断矩阵的CR值为:" + str(self.CR_val))
    # 进行一致性检验判断
    if self.n == 2: # 当只有两个子因素的情况
      print("仅包含两个子因素,不存在一致性问题")
    else:
      if self.CR_val < 0.1: # CR值小于0.1,可以通过一致性检验
        print("判断矩阵的CR值为" + str(self.CR_val) + ",通过一致性检验")
        return True
      else: # CR值大于0.1, 一致性检验不通过
        print("判断矩阵的CR值为" + str(self.CR_val) + "未通过一致性检验")
        return False

  """
  算术平均法求权重
  """

  def cal_weight_by_arithmetic_method(self):
    # 求矩阵的每列的和
    col_sum = np.sum(self.array, axis=0)
    # 将判断矩阵按照列归一化
    array_normed = self.array / col_sum
    # 计算权重向量
    array_weight = np.sum(array_normed, axis=1) / self.n
    # 打印权重向量
    print("算术平均法计算得到的权重向量为:\n", array_weight)
    # 返回权重向量的值
    return array_weight

  """
  几何平均法求权重
  """

  def cal_weight__by_geometric_method(self):
    # 求矩阵的每列的积
    col_product = np.product(self.array, axis=0)
    # 将得到的积向量的每个分量进行开n次方
    array_power = np.power(col_product, 1 / self.n)
    # 将列向量归一化
    array_weight = array_power / np.sum(array_power)
    # 打印权重向量
    print("几何平均法计算得到的权重向量为:\n", array_weight)
    # 返回权重向量的值
    return array_weight

  """
  特征值法求权重
  """

  def cal_weight__by_eigenvalue_method(self):
    # 将矩阵最大特征值对应的特征向量进行归一化处理就得到了权重
    array_weight = self.max_eig_vector / np.sum(self.max_eig_vector)
    # 打印权重向量
    print("特征值法计算得到的权重向量为:\n", array_weight)
    # 返回权重向量的值
    return array_weight


if __name__ == "__main__":
  # 给出判断矩阵
  b = np.array([[1, 1 / 3, 1 / 8], [3, 1, 1 / 3], [8, 3, 1]])

  # 算术平均法求权重
  weight1 = AHP(b).cal_weight_by_arithmetic_method()
  # 几何平均法求权重
  weight2 = AHP(b).cal_weight__by_geometric_method()
  # 特征值法求权重
  weight3 = AHP(b).cal_weight__by_eigenvalue_method()

总结

到此这篇关于python实现AHP算法(层次分析法)的文章就介绍到这了,更多相关python AHP算法(层次分析法)内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python 随机数生成的代码的详细分析
May 15 Python
用Python3创建httpServer的简单方法
Jun 04 Python
python实现NB-IoT模块远程控制
Jun 20 Python
使用Python的datetime库处理时间(RPA流程)
Nov 24 Python
python文件绝对路径写法介绍(windows)
Dec 25 Python
Tensorflow 1.0之后模型文件、权重数值的读取方式
Feb 12 Python
pandas实现excel中的数据透视表和Vlookup函数功能代码
Feb 14 Python
浅谈python 中的 type(), dtype(), astype()的区别
Apr 09 Python
简单了解python shutil模块原理及使用方法
Apr 28 Python
django 模型字段设置默认值代码
Jul 15 Python
python进行OpenCV实战之画图(直线、矩形、圆形)
Aug 27 Python
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
Jun 09 Python
Pytorch 扩展Tensor维度、压缩Tensor维度的方法
Sep 09 #Python
Python列表推导式实现代码实例
Sep 09 #Python
利用Python中的Xpath实现一个在线汇率转换器
Sep 09 #Python
pytorch使用horovod多gpu训练的实现
Sep 09 #Python
python,Java,JavaScript实现indexOf
Sep 09 #Python
python 5个顶级异步框架推荐
Sep 09 #Python
python PyAUtoGUI库实现自动化控制鼠标键盘
Sep 09 #Python
You might like
php调用Google translate_tts api实现代码
2013/08/07 PHP
PHP基于简单递归函数求一个数阶乘的方法示例
2017/04/26 PHP
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
php微信公众号开发之图片回复
2018/10/20 PHP
PHP+swoole+linux实现系统监控和性能优化操作示例
2019/04/15 PHP
PHP 构造函数和析构函数原理与用法分析
2020/04/21 PHP
top.location.href 没有权限 解决方法
2008/08/05 Javascript
默认让页面的第一个控件选中的javascript代码
2009/12/26 Javascript
基于jQuery实现的Ajax 验证用户名是否存在的实现代码
2011/04/06 Javascript
分享精心挑选的23款美轮美奂的jQuery 图片特效插件
2012/08/14 Javascript
Javascript中 关于prototype属性实现继承的原理图
2013/04/16 Javascript
JS 修改URL参数(实现代码)
2013/07/08 Javascript
jquery放大镜效果超漂亮噢
2013/11/15 Javascript
Nodejs关于gzip/deflate压缩详解
2015/03/04 NodeJs
jQuery插件实现静态HTML验证码校验
2015/11/06 Javascript
使用jquery.qrcode.js生成二维码插件
2016/10/17 Javascript
利用python分析access日志的方法
2016/10/26 Javascript
深入理解react-router@4.0 使用和源码解析
2017/05/23 Javascript
js 事件的传播机制(实例讲解)
2017/07/20 Javascript
Node.js引入UIBootstrap的方法示例
2018/05/11 Javascript
JS添加或删除HTML dom元素的方法实例分析
2019/03/05 Javascript
微信小程序 生成携带参数的二维码
2019/10/23 Javascript
如何通过JS实现转码与解码
2020/02/21 Javascript
Python深入学习之对象的属性
2014/08/31 Python
wxPython窗口的继承机制实例分析
2014/09/28 Python
用Python实现通过哈希算法检测图片重复的教程
2015/04/02 Python
python实现文本文件合并
2015/12/29 Python
Python3 执行Linux Bash命令的方法
2019/07/12 Python
python提取xml里面的链接源码详解
2019/10/15 Python
聊聊python中的循环遍历
2020/09/07 Python
java关于string最常出现的面试题整理
2021/01/18 Python
Swanson中国官网:美国斯旺森健康产品公司
2021/03/01 全球购物
学校党委干部个人对照检查材料思想汇报
2014/10/09 职场文书
防溺水安全教育主题班会
2015/08/12 职场文书
保险公司2016开门红口号集锦
2015/12/24 职场文书
DIY胆机必读:各国电子管评价
2022/04/06 无线电