目录

1 概述

2 AHP的基本步骤

 3 简单入门算例

4 升级入门算例

4.1 算例

4.2 Matlab代码实现

5 Python代码实现


1 概述

适用于解决多个备选方案决策以及在选择过程中各个因素的重要性比较,比如要选择旅游地,有3个选择方案,苏杭、北戴河和桂林。选择过程需要考虑多个因素,比如景色、费用、居住、饮食和旅途。

AHP对人们的主观判断加以形式化地表达和处理,逐步剔除主观性,从而尽可能地转化成客观描述。其正确与成功.取决于客观成分能否达到足够合理的地步。由于理论研究的遍历与工程实现的采样之间总是存在着(或大或小,往往又是巨大的}差距.在借助于判断矩阵计算出相对权重后,欲克服两两相比未能穷尽的不足,对判断矩阵做一致性检验,成为不可或缺的环节。

2 AHP的基本步骤

运用AHP方法解决问题,大体可按如下步骤进行:

1)将问题分解.建立层次结构;
2)构造两两比较判断矩阵:
3)由判断矩阵计算比较元素的相对权重:

4)计算各层元素的组合权重。

现举例说明上述过程。

3 简单入门算例

参考:(1条消息) 层次分析法详解(matlab)_黑脉金的博客-CSDN博客_层次分析法matlab程序

4 升级入门算例

4.1 算例

银行在国家经济社会发展过程中扮演者重要的决策,银行的破产会对企业和个人造成众多不利的影响。相比国内的银行,国际银行的倒闭频次更高,因此国际银行倒闭原因的分析与预测受到众多管理者与学术研究者的广泛关注。附件1中提供了波兰2017年至2021年的现存或倒闭银行的64项指标数据,各项数据指标具有对应的解释。

请你从这64项数据中整理出适合的投入产出数据,并对各银行的效率展开对应评价,同时提供银行倒闭效率的分界线;

思路:使用二分类的类值

  • ·0 - 在预测期内没有破产的公司
  • 1 - 破产公司

4.2 Matlab代码实现

clear
clc
%% 加载数据
%load data.txt
load data.txt
X=data(:,3:end); %第一列和第二列:X1净利润/总资产 ;X2 总负债/总资产
%% 归一化
X=mapminmax(X',0,1)';
mapping.mean = mean(X, 1);
C = cov(X);%协方差矩阵
C(isnan(C)) = 0;
C(isinf(C)) = 0;
[M, lambda] = eig(C);%求C矩阵特征向量及特征值
[lambda, ind] = sort(diag(lambda), 'descend');%排序
lambda=lambda./sum(lambda);%特征值归一化
a=lambda;
lambda=cumsum(lambda);%累计贡献率
mapping.lambda = lambda;
M=M(:,ind);
Z=[];
A=[];
%% 第一列和第二列净利润/总资产 ;X2 总负债/总资产
for i=1:size(M,2)[~,z]=max(abs(M(:,i)));if length(find(Z==z))==0Z=[Z,z];A=[A,a(i)];end
end
%% 五年
Z=Z(1:5);
W=A(1:5)./sum(A(1:5));%% 确定主要指标
disp('主要指标序号')
disp(Z)%指标序号
disp('权重')
disp(W)
%% 评价值
P=[data(:,1:2),X(:,Z)*W'];%检验
disp('整体在预测期内没有破产的公司和破产公司的分别求平均值')
[mean(P(find(P(:,2)==0),3)),mean(P(find(P(:,2)==1),3))]
disp('2017年在预测期内没有破产的公司和破产公司的分别求平均值')
[mean(P(find(P(find(P(:,2)==0),1)==2017),3)),mean(P(find(P(find(P(:,2)==1),1)==2017),3))]
disp('2018年在预测期内没有破产的公司和破产公司的分别求平均值')
[mean(P(find(P(find(P(:,2)==0),1)==2018),3)),mean(P(find(P(find(P(:,2)==1),1)==2018),3))]
disp('2019年在预测期内没有破产的公司和破产公司的分别求平均值')
[mean(P(find(P(find(P(:,2)==0),1)==2019),3)),mean(P(find(P(find(P(:,2)==1),1)==2019),3))]
disp('20120年在预测期内没有破产的公司和破产公司的分别求平均值')
[mean(P(find(P(find(P(:,2)==0),1)==2020),3)),mean(P(find(P(find(P(:,2)==1),1)==2020),3))]
disp('2021年在预测期内没有破产的公司和破产公司的分别求平均值')
[mean(P(find(P(find(P(:,2)==0),1)==2021),3)),mean(P(find(P(find(P(:,2)==1),1)==2021),3))]%检验通过后,接下来就是求分界线,其实就是依次分类统计下均值在取个中间值就好了
%求每个主要指标的
M=[];
for i=1:length(Z);M(i,:)=[mean(X(find(data(:,2)==0),Z(i))),mean(X(find(data(:,2)==1),Z(i)))];
end
disp('主要指标分界点')
M=mean(M,2)

结果:

主要指标序号29    33    34     3    16权重0.6047    0.1617    0.1008    0.0720    0.0608整体class=0和1的分别求平均值ans =0.4434    0.41812017年class=0和1的分别求平均值ans =0.4503    0.47032018年class=0和1的分别求平均值ans =0.4464    0.46892019年class=0和1的分别求平均值ans =0.4362    0.470620120年class=0和1的分别求平均值ans =0.4371    0.45432021年class=0和1的分别求平均值ans =0.4502    0.4360主要指标分界点M =0.54620.04110.15930.87650.2415>> 

本部分来源于我的男神川川,参考链接点这里:川川

5 Python代码实现

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# 矩阵的一致性指标CIself.CI_val = (self.max_eig_val - self.n) / (self.n - 1)# 矩阵的一致性比例CRself.CR_val = self.CI_val / (self.RI_list[self.n - 1])"""一致性判断"""def test_consist(self):# 打印矩阵的一致性指标CI和一致性比例CRprint("判断矩阵的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 Trueelse:  # 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_weightif __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()

【数学建模】层次分析(MatlabPython代码实现)相关推荐

  1. 数学建模——层次分析法Python代码

    数学建模--层次分析法Python代码 import numpy as np class AHP: """ 相关信息的传入和准备 """ d ...

  2. [清风数学建模]层次分析法(AHP)笔记及代码实现

    本文章是学习清风老师数学建模视频后所做的笔记,其中一些图片及代码实现来源于清风老师的B站视频: [强烈推荐]清风:数学建模算法.编程和写作培训的视频课程以及Matlab等软件教学_哔哩哔哩_bilib ...

  3. 数学建模 层次分析法

    层次分析法介绍 层次分析法是对一些较为复杂而且模糊的问题做出分析的一种简易方法,它适用于解决难以完全定量的问题. 该方法在数学建模中运用较多,但是主观因素很大,特别是构造成对比较矩阵的时候,必须要有完 ...

  4. 数学建模层次分析法例题及答案_斩获国际特等奖!兰理工数学建模团队为百年校庆献礼...

    近日,2019年美国大学生数学建模竞赛(MCM-ICM)成绩正式公布. 兰州理工大学数学建模团队再创佳绩,分别获得国际特等奖(Outstanding Winner)1项.一等奖(Meritorious ...

  5. 数学建模 --- 层次分析法(AHP模型)

    层次分析法 评价类问题 该问题思路 选出相关指标,求各个指标之间的权重 和 对某个指标而言各个选择权重(分而治之思想) 计算每个方案的得分 层次分析法 层次分析法第一步 --- 层次结构图 层次分析法 ...

  6. 数学建模层次分析法例题及答案_【热门推荐】影响力意志力创新力、数学建模简明教程...

    <影响力•意志力•创新力> 索书号:B848.4-49/1028 作者:邢群麟编著 出版社:浙江工商大学出版社,2018 馆藏地:新馆304室 简介:本书在总结众多成功人士经验的基础上, ...

  7. 数学建模层次分析法一致性检验建立

    2023年2月11日,备赛美赛复习建模需要使用的算法.在复习层次分析法的过程可以发现,层次分析法建立判断矩阵时具有强主观性,这个时候就需要建立一致性检验,对模型的差异性进行评估. 计算一致性比例: ​ ...

  8. 数学建模 层次分析法 python计算权重

    这里用python语言来计算判断矩阵的权重,网上大部分是matlab语言,里面也包含一致性检验的函数,具体各函数使用方法详见代码注释的部分 import numpy as np a=np.array( ...

  9. 数学建模-层次分析法

    决策 层次分析法原理 相对重要权值的确定 算法步骤 目标层 准则层 方案层 层次分析法解决旅游问题 B1~B5表示 5个属性对于三地的各个重要性 通过层次分析矩阵 得到 各个属性相对于目标的权重. 最 ...

  10. 数学建模|层次分析法笔记

    一.什么是层次分析法?  定义: 由目标.方案.指标三部分组成. 框架图: 1.含子准则: 2.方案多种(方案交叉): 3.一对多(一准则多方案,方案不交叉): 二.层次分析法如何设计? 层次分析法步 ...

最新文章

  1. 减少过敏反应的生活细节
  2. 如何验证自己的网络是否支持ipv6
  3. JAVA中获取当前运行的类名,方法名,行数
  4. 计算机入域时域控用到的端口,【ADDC】域控需要开放的端口
  5. 2018.11.14成立我的博客
  6. 【转】php利用mkdir创建多级目录
  7. easyui php 拖动排序,Easyui 自定义排序_EasyUI 教程
  8. ARMv8 MMU及Linux页表映射:TLB
  9. java计算信息熵_Java计算文本字符的信息熵
  10. 什么是PHP,如何快速运行PHP文件
  11. 高频面试题解析:jmeter 面试题剖析实战
  12. [UE4] Spawn Emitter Attached 特效消失的问题的解决方法:ParticleSystem 必须附着在角色的 Mesh 上
  13. dhtmlxgantt pro 7.1.10 | dhtmlxgantt 专业版 7.1.10
  14. 网络安全学习资料总汇
  15. 面试——路径、转发与重定向的区别
  16. idea 的Igonre 设置
  17. linux ubuntu开放端口查看,ubuntu/linux下查看端口使用情况
  18. c#堆栈跟踪;c#异常原因查找打印;c#打印错误日志
  19. python 时间格式datetime、str与date的相互转换
  20. RestCloudETL数据集成平台,轻量级的数据中台

热门文章

  1. LaTex入门教程-中文版-免费下载.pdf
  2. face-api.js、webcamjs实现人脸比对
  3. xdoj 上机题 小球下落问题
  4. Python+matplotlib画爱心
  5. 2022-2028年全球与中国热流量计行业市场前瞻与投资战略规划分析
  6. (4)(4.2.3) NAVIO2的组装和布线快速入门
  7. 刘芸担任A.O.史密斯明星体验官,直播介绍“斯”家好物
  8. 微信小程序实现非常简单的数字时钟
  9. EasyExcel 分Sheet实现大数据量导出
  10. 淮北打造智慧城管新模式