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实现多线程的方式及多条命令并发执行
Jun 07 Python
itchat和matplotlib的结合使用爬取微信信息的实例
Aug 25 Python
Python数据结构之哈夫曼树定义与使用方法示例
Apr 22 Python
python中yaml配置文件模块的使用详解
Apr 27 Python
Sanic框架请求与响应实例分析
Jul 16 Python
利用Python模拟登录pastebin.com的实现方法
Jul 12 Python
用Python徒手撸一个股票回测框架搭建【推荐】
Aug 05 Python
python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)
Jan 08 Python
NumPy排序的实现
Jan 21 Python
Python基于locals返回作用域字典
Oct 17 Python
matplotlib部件之矩形选区(RectangleSelector)的实现
Feb 01 Python
Numpy ndarray 多维数组对象的使用
Feb 10 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 Memcached + APC + 文件缓存封装实现代码
2010/03/11 PHP
php打印输出棋盘的实现方法
2014/12/23 PHP
PHP答题类应用接口实例
2015/02/09 PHP
PHP使用HTML5 FormData对象提交表单操作示例
2019/07/02 PHP
PHP实现微信提现(企业付款到零钱)
2019/08/01 PHP
js加解密 脚本解密
2008/02/22 Javascript
JavaScript arguments 多参传值函数
2010/10/24 Javascript
潜说js对象和数组
2011/05/25 Javascript
jquery如何把参数列严格转换成数组实现思路
2013/04/01 Javascript
jquery取消选择select下拉框示例代码
2014/02/22 Javascript
使用js判断TextBox控件值改变然后出发事件
2014/03/07 Javascript
jq实现酷炫的鼠标经过图片翻滚效果
2014/03/12 Javascript
JS阻止用户多次提交示例代码
2014/03/26 Javascript
JQuery下拉框应用示例介绍
2014/04/23 Javascript
jquery对象和javascript对象即DOM对象相互转换
2014/08/07 Javascript
重写document.write实现无阻塞加载js广告(补充)
2014/12/12 Javascript
jquery实现动态操作select选中
2015/02/11 Javascript
优化RequireJS项目的相关技巧总结
2015/07/01 Javascript
分享几种比较简单实用的JavaScript tabel切换
2015/12/31 Javascript
Webpack 实现 AngularJS 的延迟加载
2016/03/02 Javascript
Angular学习笔记之angular的$filter服务浅析
2016/11/12 Javascript
基于AngularJS的拖拽文件上传的实例代码
2017/07/15 Javascript
layui 动态设置checbox 选中状态的例子
2019/09/02 Javascript
Python使用正则匹配实现抓图代码分享
2015/04/02 Python
django实现前后台交互实例
2017/08/07 Python
Matplotlib中文乱码的3种解决方案
2018/11/15 Python
python开发准备工作之配置虚拟环境(非常重要)
2019/02/11 Python
python爬取内容存入Excel实例
2019/02/20 Python
python集合的创建、添加及删除操作示例
2019/10/08 Python
浅析PEP570新语法: 只接受位置参数
2019/10/15 Python
python 如何将office文件转换为PDF
2020/09/22 Python
python如何快速拼接字符串
2020/10/28 Python
canvas生成带二维码海报的踩坑记录
2019/09/11 HTML / CSS
应用化学专业职业生涯规划书
2014/01/22 职场文书
认错检讨书
2014/10/02 职场文书
用Python将GIF动图分解成多张静态图片
2021/06/11 Python