python 层次分析(AHP)

文章目录

  • 一、算法原理
  • 二、案例分析
    • 2.1 构建指标层判断矩阵
    • 2.2 求各指标权重
      • 2.2.1 算术平均法(和积法)
      • 2.2.2 几何平均法(方根法)
    • 2.3 一致性检验
      • 2.3.1 求解最大特征根值
      • 2.3.2 求解CI、RI、CR值
      • 2.3.3 一致性判断
    • 2.4 分别求解方案层权重向量及一致性检验
      • 2.4.1 景色
      • 2.4.2 吃住
      • 2.4.3 价格
      • 2.4.4 人文
    • 2.5 计算各方案得分
  • 三、python 代码
    • 3.1 和积法计算权重
    • 3.2 方根法计算权重
    • 3.3 python库 np.linalg.eig

一、算法原理

  • 层次分析法(analytic hierarchy process),简称AHP,是指将与决策总是有关的元素分解成目标、准则、方案等层次,在此基础之上进行定性和定量分析的决策方法。该方法是美国运筹学家匹茨堡大学教授萨蒂于20世纪70年代初,在为美国国防部研究"根据各个工业部门对国家福利的贡献大小而进行电力分配"课题时,应用网络系统理论和多目标综合评价方法,提出的一种层次权重决策分析方法

  • 传统定性分析方法类似专家打分、专家判断等,仅能将指标简单地划分为几个层级(类似非常重要、比较重要、一般、比较不重要、非常不重要),这样导致部分存在差别但是不大的指标得到了同样的权重,受主观因素影响,无法对最终决策做出更好的帮助。层次分析法将不同指标间一一比对,主观与客观相结合,很好地解决了以上问题。

  • 判断矩阵量化值参照表:

因素i比因素j量化值
同等重要1
稍微重要3
较强重要5
强烈重要7
极端重要9
两相邻判断的中间值2,4,6,8
倒数假设因素i相比因素j重要程度量化值为3,相反就是1/3

二、案例分析

目的:选择某个城市旅游

方案:南京、桂林、三亚

考虑因素:景色、吃住、价格、人文
在这里插入图片描述

2.1 构建指标层判断矩阵

在这里插入图片描述
构建判断矩阵,理论上需要专家打分。

2.2 求各指标权重

2.2.1 算术平均法(和积法)

  1. 按列求和:如 1 + 4 + 1 / 2 + 3 = 8.5 1+4+1/2+3 = 8.5 1+4+1/2+3=8.5
    在这里插入图片描述

  2. 将指标层判断矩阵按列归一化(即按列求占比),如:
    0.12 = 1 / 8.5 0.12 = 1 / 8.5 0.12=1/8.5
    0.47 = 4 / 8.5 0.47 = 4 / 8.5 0.47=4/8.5
    0.06 = 1 / 2 / 8.5 0.06 = 1/2 / 8.5 0.06=1/2/8.5
    0.35 = 3 / 8.5 0.35 = 3 / 8.5 0.35=3/8.5
    在这里插入图片描述

  3. 将归一化后的矩阵按行求平均,得到权重向量w
    在这里插入图片描述

2.2.2 几何平均法(方根法)

  1. 每行各元素相乘(行乘积),如 1 ∗ 1 / 4 ∗ 2 ∗ 1 / 3 = 0.1667 1*1/4*2*1/3 = 0.1667 11/421/3=0.1667
    在这里插入图片描述

  2. 对乘积列每个元素开n次方(n为矩阵阶数,此处n=4),如 0.1667 4 = 0.6389 \sqrt[4]{0.1667}=0.6389 40.1667 =0.6389.
    在这里插入图片描述

  3. 然后对开方列求列占比,得到权重向量w,如 0.1171 = 0.6389 / 5.4566 0.1171=0.6389 / 5.4566 0.1171=0.6389/5.4566.
    在这里插入图片描述

2.3 一致性检验

2.3.1 求解最大特征根值

得到权重向量后,可以计算出原判断矩阵的最大特征根值,公式为:

λ m a x = 1 n ∑ i = 1 n ( A W i ) W i \lambda_{max}=\dfrac{1}{n}\sum_{i=1}^{n}{\dfrac{(AW_{i})}{W_{i}}} λmax=n1i=1nWi(AWi)

其中,n为矩阵阶数,此处n=4。

求解步骤(以和积法求解权重为例)

  1. A W AW AW,其中 0.4705 = 1 ∗ 0.1176 + 1 4 ∗ 0.5175 + 2 ∗ 0.0611 + 1 3 ∗ 0.3038 0.4705=1*0.1176+\dfrac{1}{4}*0.5175+2*0.0611+\dfrac{1}{3}*0.3038 0.4705=10.1176+410.5175+20.0611+310.3038
    在这里插入图片描述

  2. A W W \dfrac{AW}{W} WAW,如 4.0016 = 0.4705 / 0.1176 4.0016=0.4705/0.1176 4.0016=0.4705/0.1176
    在这里插入图片描述

  3. 1 n s u m ( A W W ) \dfrac{1}{n}sum(\dfrac{AW}{W}) n1sum(WAW),此处 s u m ( A W W ) = 16.0621 sum(\dfrac{AW}{W})=16.0621 sum(WAW)=16.0621
    在这里插入图片描述

  4. 综上求得 λ m a x = 1 4 ∗ 16.0621 = 4.0155 \lambda_{max}=\dfrac{1}{4}*16.0621=4.0155 λmax=4116.0621=4.0155

2.3.2 求解CI、RI、CR值

  • 计算CI

C I = λ − n n − 1 = 4.0155 − 4 4 − 1 = 0.0052 CI=\dfrac{\lambda-n}{n-1}=\dfrac{4.0155-4}{4-1}=0.0052 CI=n1λn=414.01554=0.0052

  • 计算RI

根据查表,得知 R I RI RI为0.89

img

  • 计算CR

C R = C I R I = 0.0052 0.89 = 0.0058 CR=\dfrac{CI}{RI}=\dfrac{0.0052}{0.89}=0.0058 CR=RICI=0.890.0052=0.0058

2.3.3 一致性判断

CR = 0.0058 < 0.1,即通过一致性检验。

2.4 分别求解方案层权重向量及一致性检验

2.4.1 景色

  1. 构建判断矩阵
    在这里插入图片描述

  2. 计算权重向量以及一致性检验.(步骤如上文,为了简便文章,本次计算采用python代码,以和积法求解权重,下文将详细介绍)
    在这里插入图片描述

2.4.2 吃住

  1. 构建判断矩阵
    在这里插入图片描述

  2. 计算权重向量以及一致性检验.(步骤如上文,为了简便文章,本次计算采用python代码,以和积法求解权重,下文将详细介绍)
    在这里插入图片描述

2.4.3 价格

  1. 构建判断矩阵
    在这里插入图片描述

  2. 计算权重向量以及一致性检验.(步骤如上文,为了简便文章,本次计算采用python代码,以和积法求解权重,下文将详细介绍)
    在这里插入图片描述

2.4.4 人文

  1. 构建判断矩阵
    在这里插入图片描述

  2. 计算权重向量以及一致性检验.(步骤如上文,为了简便文章,本次计算采用python代码,以和积法求解权重,下文将详细介绍)
    在这里插入图片描述

2.5 计算各方案得分

综合得分 = s u m ( 单项得分 ∗ 对应指标权重 ) 综合得分=sum(单项得分*对应指标权重) 综合得分=sum(单项得分对应指标权重)
在这里插入图片描述

可以看出,南京得分0.5675为最高,最终方案应选择南京。

三、python 代码

3.1 和积法计算权重

import numpy as np
import pandas as pd''' 层次分析法判断矩阵权重向量计算--和积法 '''
def get_w_anc(factors_matrix):# RI字典RI_dict = {1:0,2:0,3:0.52,4:0.89,5:1.12,6:1.26,7:1.36,8:1.41,9:1.46,10:1.49,11:1.52,12:1.54,13:1.56,14:1.58,15:1.59}# 矩阵阶数shape = factors_matrix.shape[0]# 按列求和column_sum_vector = np.sum(factors_matrix, axis=0)# 指标层判断矩阵归一化normalization_matrix = factors_matrix / column_sum_vector# 按行求归一化后的判断矩阵平均值,得到权重WW_vector = np.mean(normalization_matrix, axis=1)# 原判断矩阵 乘以 权重向量AW_vector = np.dot(factors_matrix, W_vector)# 原判断矩阵 ✖️ 权重向量 / 权重AW_w = AW_vector / W_vector# 求特征值lamda = sum(AW_w) / shape# 求CI值CI = (lamda - shape) / (shape - 1)# 求CR值CR = CI / RI_dict[shape]print("权重向量为:",list(W_vector))print("最大特征值:",lamda)print("CI值为:",CI)print("RI值为:",RI_dict[shape])print("CR值为:",CR)if CR < 0.1:print('矩阵通过一致性检验')else:print('矩阵未通过一致性检验')print("---------------------------")return W_vectorif __name__ == "__main__":# 指标层判断矩阵factors_matrix = np.array([[1,1/4,2,1/3],[4,1,8,2],[1/2,1/8,1,1/5],[3,1/2,5,1]])# 景色view_matrix = np.array([[1,1/4,2],[4,1,8],[1/2,1/8,1]])# 吃住board_matrix = np.array([[1,5,2],[1/5,1,1/2],[1/2,2,1]])# 价格price_matrix = np.array([[1,1/3,2],[3,1,5],[1/2,1/5,1]])# 人文humanity_matrix = np.array([[1,5,7],[1/5,1,2],[1/7,1/2,1]])w_A = get_w_anc(factors_matrix)print("景色:")w_view = get_w_anc(view_matrix)print("吃住:")w_board = get_w_anc(board_matrix)print("价格:")w_price = get_w_anc(price_matrix)print("人文:")w_humanity = get_w_anc(humanity_matrix)# 将景色、吃住、价格、人文权重向量合并w_B = np.vstack((w_view, w_board,w_price,w_humanity))# 求出最终得分score = np.dot(w_A,w_B)print("最终得分向量:",score)
  • 运行结果
    在这里插入图片描述

3.2 方根法计算权重

这里只列出计算权重部分

  • 原指标层判断矩阵
# 指标层判断矩阵
factors_matrix = np.array([[1,1/4,2,1/3],[4,1,8,2],[1/2,1/8,1,1/5],[3,1/2,5,1]
])
  1. 求行乘积
# 求行乘积
array1 = factors_matrix.prod(axis=1, keepdims=True)
  1. 对乘积列每个元素开n次方(n为矩阵阶数,此处n=4)
n = 4
array2 = np.power(array1, 1/n)
  1. 对开方列求列占比,得到权重向量w
array2 / np.sum(array2)

3.3 python库 np.linalg.eig

# 计算特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(factors_matrix)# 需要注意的是,对于一个nxn的矩阵,最多可能有n个特征值和特征向量,因此,需要挑选出最大的特征值进行一致性判断
# 找到最大特征值的索引
max_eigenvalue_index = np.argmax(eigenvalues)# 提取最大特征值和对应的特征向量
max_eigenvalue = eigenvalues[max_eigenvalue_index]
max_eigenvector = eigenvectors[:, max_eigenvalue_index]print("最大特征值:", max_eigenvalue)
print("对应的特征向量:", max_eigenvector)

在这里插入图片描述

  • 参考:层次分析法(AHP)步骤详解-哔哩哔哩
  • 参考:层次分析法原理及计算过程详解)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/696966.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用Ubuntu22.04启动U盘对电脑磁盘进行格式化

概要&#xff1a; 本篇演示利用Ubuntu22.04启动U盘的Try Ubuntu模式对电脑磁盘进行格式化 一、说明 1、电脑 笔者的电脑品牌是acer(宏碁/宏基) 开机按F2进入BIOS 开机按F12进入Boot Manager 2、Ubuntu22.04启动U盘 制作方法参考笔者的文章&#xff1a; Ubuntu制作Ubun…

【OpenAI官方课程】第五课:ChatGPT文本转换Transforming

欢迎来到ChatGPT 开发人员提示工程课程&#xff08;ChatGPT Prompt Engineering for Developers&#xff09;&#xff01;本课程将教您如何通过OpenAI API有效地利用大型语言模型&#xff08;LLM&#xff09;来创建强大的应用程序。 本课程由OpenAI 的Isa Fulford和 DeepLearn…

缓存篇—缓存雪崩

什么是缓存雪崩 通常我们为了保证缓存中的数据与数据库中的数据一致性&#xff0c;会给 Redis 里的数据设置过期时间&#xff0c;当缓存数据过期后&#xff0c;用户访问的数据如果不在缓存里&#xff0c;业务系统需要重新生成缓存&#xff0c;因此就会访问数据库&#xff0c;并…

QEMU源码全解析 —— virtio(22)

接前一篇文章&#xff1a;QEMU源码全解析 —— virtio&#xff08;21&#xff09; 前几回讲解了virtio驱动的加载。本回开始讲解virtio驱动的初始化。 在讲解virtio驱动的初始化之前&#xff0c;先要介绍virtio配置的函数集合变量virtio_pci_config_ops。实际上前文书也有提到…

c# HttpCookie操作,建立cookie工具类

HttpCookie 是一个在.NET Framework中用于管理和操作HTTP Cookie的类。它提供了一种方便的方式来创建、设置、读取和删除Cookie。 Cookie是一种在客户端和服务器之间传递数据的机制&#xff0c;用于跟踪用户的会话状态和存储用户相关的信息。它通常由服务器发送给客户端&#…

万字干货-京东零售数据资产能力升级与实践

开篇 京东自营和商家自运营模式&#xff0c;以及伴随的多种运营视角、多种组合计算、多种销售属性等数据维度&#xff0c;相较于行业同等量级&#xff0c;数据处理的难度与复杂度都显著增加。如何从海量的数据模型与数据指标中提升检索数据的效率&#xff0c;降低数据存算的成…

parallels配置centos虚拟环境

parallels Desktop M1/M2芯片Parallels Desktop 19虚拟机安装使用教程&#xff08;超详细&#xff09;-CSDN博客 下镜像记得找和mac芯片匹配的 安装就选第一个centos7不要选第二个 安装有问题就选回退重启 parallel desktop 18/19安装centos7.2009教程_parallels desktop 19…

echarts多y轴样式重叠问题

1、主要属性设置 yAxis: [{//y轴1nameTextStyle: {align: "right",padding: 0}},{//y轴2nameTextStyle: {align: "left",padding: 0}},{//y轴3axisLabel: {margin: 50},nameTextStyle: {align: "left",padding: [0, 0, 0, 50]},axisPointer: {l…

Python Web开发记录 Day2:CSS

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 二、CSS1、CSS-初始入门①快速了解②CSS应用方式…

【C语言】sizeof()函数

前言 sizeof函数用于获取数据类型或变量在内存中所占的字节数。 sizeof函数返回的是编译时确定的值&#xff0c;不会计算动态分配的内存大小。 sizeof函数可以用于多种类型的数据&#xff0c;包括数组、指针、结构体、枚举等。 1.数组 int arr[5];printf("%zu ", siz…

文件上传与下载

文件上传与下载 1. 文件上传 为了能上传文件&#xff0c;必须将表单的 method 设置为 POST&#xff0c;并将 enctype 设置为 multipart/form-data 。 有两种实现文件上传的方式&#xff1a; 底层使用 Apache Commons FileUpload 包 底层使用 Servlet 3.1 内置的文件上传功能…

如何计算文件哈希值(MD5值)

生成文件hash值的用途 哈希值&#xff0c;即HASH值&#xff0c;是通过对文件内容进行加密运算得到的一组二进制值&#xff0c;主要用途是用于文件校验或签名。正是因为这样的特点&#xff0c;它常常用来判断两个文件是否相同。 比如&#xff0c;从网络上下载某个文件&#xff0…

MySQL主从同步

MySQL主从同步&#xff08;复制&#xff09;是一种数据复制技术&#xff0c;用于将数据从一个MySQL数据库&#xff08;称为“主”&#xff09;复制到另一个或多个MySQL数据库&#xff08;称为“从”&#xff09;。这个过程通常用于负载均衡、数据备份、灾难恢复和其他类似场景。…

C++ Primer Plus 笔记(持续更新)

编译器的正解 数据&#xff0b;算法程序 赋值从右向左进行 cin&#xff0c;cout的本质也是对象 类和对象的解释

centerOS docker搭建flowable,流程引擎

1、准备一个mysql数据库&#xff0c;库名为flowable 2、mysql驱动下载&#xff0c;下载地址为&#xff1a; https://mvnrepository.com/artifact/mysql/mysql-connector-java此处使用的是8.0.22版本的驱动&#xff0c;且数据库必须使用版本8&#xff0c;否则第二次启动报错 3、…

OpenAI文生视频大模型Sora概述

Sora&#xff0c;美国人工智能研究公司OpenAI发布的人工智能文生视频大模型&#xff08;但OpenAI并未单纯将其视为视频模型&#xff0c;而是作为“世界模拟器” &#xff09;&#xff0c;于2024年2月15日&#xff08;美国当地时间&#xff09;正式对外发布。 Sora可以根据用户…

samber/lo 库的使用方法:type

samber/lo 库的使用方法&#xff1a;type samber/lo 是一个 Go 语言库&#xff0c;提供了一些常用的集合操作函数&#xff0c;如 Filter、Map 和 FilterMap。 这个库函数太多&#xff0c;因此我决定按照功能分别介绍&#xff0c;本文介绍的是 samber/lo 库中type相关的函数。汇…

Redis中的AOF重写到底是怎么一回事

首先我们知道AOF和RDB都是Redis持久化的方法。RDB是Redis DB&#xff0c;一种二进制数据格式&#xff0c;这样就是相当于全量保存数据快照了。AOF则是保存命令&#xff0c;然后恢复的时候重放命令。 AOF随着时间推移&#xff0c;会越来越大&#xff0c;因为不断往里追加命令。…

哪些行业适合做小程序?零售电商、餐饮娱乐、旅游酒店、教育生活、医疗保健、金融社交、体育健身、房产汽车、企管等,你的行业在其中么?

引言 在当今数字化时代&#xff0c;小程序成为了各行各业快速发展的数字工具之一。它的轻便、灵活的特性使得小程序在多个行业中找到了广泛的应用。本文将探讨哪些行业适合开发小程序&#xff0c;并介绍各行业中小程序的具体应用。 一、零售和电商 在当今数字化的商业环境中&…

C++ RAII

RAII定义 RAII&#xff08;Resource Acquisition Is Initialization&#xff09;是C编程中的一种重要的资源管理技术。它的核心思想是&#xff1a;资源的获取应该在对象的构造阶段进行&#xff0c;而资源的释放则应该在对象的析构阶段进行。通过利用C对象的生命周期和析构函数…