层次分析法的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 ...
随机推荐
- 代码块--java进阶day03
1.代码块 1.局部代码块 定义在方法中的一对大括号,可以提早释放内存,走完{}里的逻辑后就会被释放,在之后的编程中无法使用 2.构造代码块 位置在类中,方法外的{},在构造方法执行的时候,构造代码块 ...
- 洛谷 - B4276 [蓝桥杯青少年组国赛 2023] 八进制回文平方数 - 题解
题目传送门 主要思路 首先,这道题范围在 \(10^9\),我们不可能直接从 \(1\) 循环到 \(N\).我们不难看出,这道题是求平方数的八进制是否回文,那些不是平方数的例如 \(2\) 呀,\( ...
- linux服务器运行java项目, 监控查看内存、储存空间和cpu占用率
服务器部署方式为tomcat中运行war包的方式, 有一次重新部署时候发现报异常堆栈溢出了. 想要定位到某个war包中通过学习整理出此篇文章以作记录笔记. 关于远程调试, 可以本地对线上代码debug ...
- Unity3D教程:次表面散射的简单实现
次表面散射指的是光线射入半透明材质,在内部发生散射后再透射出来的光线传播过程,考虑到有些项目会需要使用次表面散射,下面就给大家介绍下在Unity3D中次表面散射的简单实现,希望可以帮到大家. 一.前言 ...
- Redis的淘汰机制
第一种情况:设置了过期时间的数据 a:挑选使用最少的数据淘汰 b:随机淘汰 c:选择时间快过期数据淘汰 第二种:没有设置过期时间的数据 a:挑选使用最少的数据淘汰 b:随机淘汰 第三种: a:禁止驱逐 ...
- Git撤销本地commit(未push)
查询commit日志 git log 查询到自己commit的上个版本id(commit_id) 撤销(这里是放弃自己commit的更改,直接回退到上个版本源码) git reset --hard c ...
- python操作PC版微信,给指定好友发信息(键鼠操作和复制粘贴相关库)
主要用来"pyautogui"."pyperclip"两个模块 pyautogui 主要用于控制键盘和鼠标操作.详细参考https://blog.csdn.ne ...
- MQTT服务器 apache-apollo
apache-apollo下载 下载地址 http://archive.apache.org/dist/activemq/activemq-apollo/1.7.1/ 原来的官网地址下载不到apach ...
- kali安装docker环境
Docker需要Linux内核大于 3.10 并且是 64位 的,可以用 uname -a 可以查看是否符合要求 uname -a Linux kali 4.17.0-kali1-amd64 #1 S ...
- eclipse界面混乱还原方法
WindowPerspectiveReset Perspective