层次分析法的Python实现--数学建模学习日志
数学建模比赛即将到来,大家应该都投身于学习当中了,b站上比较热门的一个课程是
b站数学建模学习视频
在这里讲解了数学建模常见的方法和写论文的要点,同时up主贴心地有所有方法的源码实现,但是全部都是matlab的代码。作为计算机人,python对我肯定是要比matlab熟悉的,所以我自己在学习过程中研究了如何用python实现这些方法,在这里分享给各位!
一、层次分析法
层次分析法(Analytic Hierarchy Process)是一种由美国运筹学家托马斯·萨蒂(Thomas L. Saaty)于20世纪70年代提出的多准则决策方法。它将复杂问题分解为层次结构,通过定量与定性结合的方式,对备选方案进行优先排序。核心思想是通过构建判断矩阵,量化决策者的主观判断,最终计算各元素的权重。
主要分为以下几个步骤:(图片内容来自up主的 ppt)

当然,讲解这个方法不是我这篇文章的重点,详细方法请到视频中观看,下面介绍如何使用python实现层次分析方法。
二、Python实现层次分析法
1.导入相关库
层次分析法主要对矩阵进行操作,所以主要使用的是numpy库,各位如果想详细了解numpy库的各种操作,可以见我的这篇博客:
[numpy学习笔记](https://blog.csdn.net/2401_83372039/article/details/146212725?spm=1001.2014.3001.5501)
接下来主要就是代码的实现展示,我就不一一讲解numpy的操作了,大家可以照着我上面的博客来查用法,当作字典用即可。所有涉及用法上面均有!!!
import numpy as np
2.读取矩阵
A.size返回的是矩阵的尺寸是长乘宽的结果,shape是返回以元组形式储存的长和宽。层次分析法的矩阵都是方阵,所以随便保存一个即可。
输入矩阵:
[[1,2,5],[1/2,1,2],[1/5,1/2,1]]
A=np.array(eval(input("请输入矩阵A=")))
print(A)
n=A.size #这里的size结果是3*3=9
n=A.shape[0] #这里才是获取了行数
[[1. 2. 5. ]
[0.5 1. 2. ]
[0.2 0.5 1. ]]
3.算数平均法求权重
#按照列求总值
A_sum=np.sum(A,axis=0)
stand_A=A/A_sum
print(stand_A)
print("算数平均法求权值的结果为:")
w1=np.sum(stand_A,axis=1)/n
print(w1)

4.特征值法求权重
A_elg=np.linalg.eig(A)
print(A_elg) #eigenvalues是特征值,eigenvectors是特征向量
max_elg=np.max(A_elg[0]).real
print(max_elg)
#获取最大特征值处的特征向量
w2=A_elg[1][:,A_elg[0]==max_elg]
print("特征值法求权值的结果为:")
#归一化
print(w2/np.sum(w2.real))
#我们可以将两种方法平均
w3=(w1+w2)/2
w3

层次分析法中,我们可以将两种方法结合起来,求个均值来作为我们的权重,当然要是不结合,更推荐使用特征值法求权重。
特征值和特征向量的计算会带上虚数,这里使用A.real来只是用实数部分。
注意, np.linalg.eig()函数会返回两个值,第一个是特征值第二个是特征向量,和matlab的相反。
5.计算一致性比例CR
- 注意:第一步就应该要检验矩阵是否符合一致性,写此处只是为了编程方便!!!
CI=(max_elg-n)/(n-1)
RI=np.array( [0.00, 0.00, 0.58, 0.90, 1.12, 1.24, 1.32, 1.41, 1.45, 1.49, 1.51, 1.54, 1.56, 1.58, 1.59]) #注意RI最大支持RI是n=15!!!
CR=CI/RI[n-1]
if CR<0.1:
print("一致性检验通过")
print(CR)
else:
print("一致性检验未通过")
print("请重新输入数据")
一致性检验通过
0.0047716480504293775
当然,RI是查表得到的,这个数据根据文献不同数值上可能有微小差距,影响不会太大。
层次分析法的Python实现--数学建模学习日志的更多相关文章
- 系统评价——层次分析法AHP的R语言实现(四)
对一个事物的评价往往会涉及多个因素或者多个指标,评价是在多个因素相互作用下的一个综合判断.多指标综合评价方法具有以下的特点:包含若干个指标,分别说明被评价对象的不同方面,评价方法最终要对被评价对象作出 ...
- [数学建模]层次分析法AHP
评价类问题. 问题: ① 评价的目标? ② 可选的方案? ③ 评价的指标? 分层 目标层.准则层.方案层 层次分析法可分为四个步骤建立: 第一步:标度确定和构造判断矩阵: 第二步:特征向量,特征根计算 ...
- 层次分析法、模糊综合评测法实例分析(涵盖各个过程讲解、原创实例示范、MATLAB源码公布)
目录 一.先定个小目标 二.层次分析法部分 2.1 思路总括 2.2 构造两两比较矩阵 2.3 权重计算方法 2.3.1 算术平均法求权重 2.3.2 几何平均法求权重 2.3.3 特征值法求权重 2 ...
- 基于python的数学建模---Fuzzy C-Means(模糊C均值聚类)
簇数的确定: 要用到k-means里面的轮廓系数 基于python的数学建模---轮廓系数的确定 - 坤丶 - 博客园 (cnblogs.com) 模糊c的代码 import copy import ...
- 从Elo Rating System谈到层次分析法
1. Elo Rating System Elo Rating System对于很多人来说比较陌生,根据wikipedia上的解释:Elo评分系统是一种用于计算对抗比赛(例如象棋对弈)中对手双方技能水 ...
- 层次分析法(Analytic Hierarchy Process,AHP)
昨天晚上室友问我什么是层次分析法?我当时就大概给他介绍了一下,没有细讲. 今天我仔细讲讲这个. 层次分析法是运筹学里面的一种方法,是讲与决策总是有关的元素分解成目标.准则.方案等层次,在此基础上进行定 ...
- 基于python的数学建模---多模糊评价
权重 ak的确定--频数统计法 选取正整数p的方法 画箱形图 取1/4与3/4的距离(IQR) ceil()取整 代码: import numpy as np def frequency(mat ...
- 数学建模学习笔记 | matlab基本命令及用法
前言 数学建模对matlab水平的要求 了解matlab的基本用法,如常用命令.脚本结构.矩阵的基本操作.绘图等: 熟悉matlab的程序结构,能创建和引用函数: 熟悉常见模型的求解算法和套路: 自主 ...
- Maths | 层次分析法(Analytic Hierarchy Process)
目录 1. 概述 2. AHP算法 2.1. 建立层级 2.2. 构造 成对 比较 矩阵 2.3. 成对比较矩阵的 一致性检验 与 层次单排序 2.4. 层次总排序 参考: (中文)https://z ...
- 基于python的数学建模---时间序列
JetRail高铁乘客量预测--7种时间序列方法 数据获取:获得2012-2014两年每小时乘客数量 import pandas as pd import numpy as np import mat ...
随机推荐
- 【Docker】DockerFile解析
DockerFile解析 中文官网 英文官网 是什么 Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本. 构建三步骤 注意:Dockerfile可以构建出镜像, ...
- 【Java】Math类的基本操作
Math类 Math 类是数学操作类,提供了一系列的数学操作方法,包括求绝对值.三角函数等,在 Math 类中提供的一切方法都是静态方法(类方法),所以直接由类名称调用即可. Math类的基本操作: ...
- Ink 和 TravisCI 更配哦
前言 去年还是前年,无意间接触到ink,看到是用go写的,非常小巧和精简,于是乎fork了下,还整了个供ink用的docker镜像``. 不过那时候热衷于折腾博客...结果也没折腾出什么来, 今天整理 ...
- 火焰图(Flame Graph)使用指南
火焰图(Flame Graph) 是一种可视化性能分析工具,可以帮助你快速定位 CPU.内存或 I/O 瓶颈.它看起来像火焰,因此得名. 火焰图能解决什么问题? CPU 占用高:找出哪些函数消耗了最多 ...
- Postman+Newman生成接口测试报告
1.安装node 安装完后进入cmd输入node检验版本 2.安装newman 打开cmd-->输入npm install -g newman,然后输入newman -v验证版本 3.安装htm ...
- Mybatis-Plus中的@TableName 和 table-prefix
简介 本文介绍Mybatis-Plus中的@TableName 和 table-prefix的使用. 介绍 在 MyBatis-Plus 中,@TableName 注解和 table-prefix 配 ...
- DeepSeekV3:写代码很强了
以前,我是不信AI能最先替代程序员的. DeepSeek的热度虽然在降,但是能力在悄摸的迭代. 在今年2月中旬测试DeepSeekR1的时候,虽然被它的文本处理能力惊艳到,但是当时吐槽过几句它的编程水 ...
- Nim 概念 Concept 对性能的影响
Nim 概念 Concept 对性能的影响 继上一篇文章<C# 泛型编译特性对性能的影响>后,我又研究了 Nim 语言相关的设计,由于 Nim 语言与 C# 语言有些差异,比如Nim 没有 ...
- 【经验】VMware|Win11的Ubuntu虚拟机启动虚拟化,报错此平台不支持虚拟化的 Intel VT-x/EPT(方案汇总+自己的解决方案)
2024/04/24说明:这篇暂时修改为粉丝可见,因为正在冲粉丝量,等到我弄完了粉丝量的要求,我就改回来!不方便看到全文的小伙伴不好意思!! 我开虚拟化是为了在虚拟机中运行VirtualBox,如果不 ...
- jsp技术之“如何在jsp中判断属性为空”
一.判断对象列表为空不显示某段代码 <%-- 展开子属性 --%> <c:if test="${not empty product.variations}"> ...