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通过PIL获取图片主要颜色并和颜色库进行对比的方法
Mar 19 Python
使用Python的Bottle框架写一个简单的服务接口的示例
Aug 25 Python
python脚本设置系统时间的两种方法
Feb 21 Python
Python实现冒泡排序的简单应用示例
Dec 11 Python
python 对txt中每行内容进行批量替换的方法
Jul 11 Python
Python实现手写一个类似django的web框架示例
Jul 20 Python
Python-numpy实现灰度图像的分块和合并方式
Jan 09 Python
在Tensorflow中查看权重的实现
Jan 24 Python
pytorch实现MNIST手写体识别
Feb 14 Python
python matplotlib包图像配色方案分享
Mar 14 Python
Python求凸包及多边形面积教程
Apr 12 Python
python爬取天气数据的实例详解
Nov 20 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
Apache下禁止php文件被直接访问的解决方案
2013/04/25 PHP
php利用cookies实现购物车的方法
2014/12/10 PHP
PHP实现路由映射到指定控制器
2016/08/13 PHP
发两个小东西,ASP/PHP 学习工具。 用JavaScript写的
2007/04/12 Javascript
JS 非图片动态loading效果实现代码
2010/04/09 Javascript
jquery ajax例子返回值详解
2012/09/11 Javascript
基于jquery的has()方法以及与find()方法以及filter()方法的区别详解
2013/04/26 Javascript
基于MVC3方式实现下拉列表联动(JQuery)
2013/09/02 Javascript
JavaScript使用cookie记录临时访客信息的方法
2015/04/07 Javascript
JavaScript实现打字效果的方法
2015/07/10 Javascript
CSS3实现动态背景登录框的代码
2015/07/28 Javascript
jquery判断复选框选中状态以及区分attr和prop
2015/12/18 Javascript
Angular+Bootstrap+Spring Boot实现分页功能实例代码
2017/07/21 Javascript
微信小程序图片选择区域裁剪实现方法
2017/12/02 Javascript
mpvue小程序仿qq左滑置顶删除组件
2018/08/03 Javascript
JavaScript中concat复制数组方法浅析
2019/01/20 Javascript
javascript二维数组和对象的深拷贝与浅拷贝实例分析
2019/10/26 Javascript
vue实现单一筛选、删除筛选条件
2020/10/26 Javascript
[14:21]VICI vs EG (BO3)
2018/06/07 DOTA
详解Python的Django框架中inclusion_tag的使用
2015/07/21 Python
python实现简单神经网络算法
2018/03/10 Python
python无限生成不重复(字母,数字,字符)组合的方法
2018/12/04 Python
详解Python装饰器
2019/03/25 Python
详细整理python 字符串(str)与列表(list)以及数组(array)之间的转换方法
2019/08/30 Python
pytorch 获取tensor维度信息示例
2020/01/03 Python
在python3.64中安装pyinstaller库的方法步骤
2020/06/02 Python
探索HTML5本地存储功能运用技巧
2016/03/02 HTML / CSS
英国领先的瓷砖专家:Walls and Floors
2018/04/27 全球购物
党员自我批评与反省材料
2014/02/10 职场文书
班主任班级寄语大全
2014/04/04 职场文书
电视节目策划方案
2014/05/16 职场文书
个性车贴标语
2014/06/24 职场文书
个人汇报材料范文
2014/12/30 职场文书
公司地址变更通知
2015/04/25 职场文书
门卫管理制度范本
2015/08/05 职场文书
vue组件vue-esign实现电子签名
2022/04/21 Vue.js