数模算法--层次分析法

本文介绍了层次分析法(AHP)在决策过程中的运用,包括构建递阶层次结构模型,通过归一化和加权处理确定指标重要性,以及一致性检验、权重求解(算术平均法、几何平均法和特征值法)。重点讲解了如何在数学建模竞赛中评估决策方案并确保矩阵的一致性。
摘要由CSDN通过智能技术生成

层次分析法学习笔记

(通过【数学建模模型算法速成(Matlab/Python双语言)】数学建模竞赛必学模型算法!!!数学建模国赛美赛必看推荐教程!!!!!_哔哩哔哩_bilibili途径学习得知原理以及算法)

类型:评价决策类

决策是指在面临多种方案时需要依据一定标准来选择某一套方案

处理方式:

归一化处理:[a b c]归一化处理得到[a/(a+b+c) b/(a+b+c) c/(a+b+c)])

加权处理:给某一个指标加上权重

为了更好地加权,采用层次分析法(AHP,对复杂、模糊地问题做出决策地方法,适用于难以完全定量分析地问题)

模型原理:

        把问题条理化、层次化,构造出一个有层次地结构模型,将分解出地元素分为三类:

  •         最高层:分析问题的预定目标或理想结果(上图的评分最高)
  •        中间层:实现目标所涉及的中间环节,判断方案好坏的指标(上图的粉丝数、颜值、作品质量、作品数量)
  •         最底层:为实现目标可供选择的各种措施、决策方案

基本步骤:

  • 建立递阶层次结构模型

  • 构造各层次中的所有判断矩阵(矩阵中的元素就是指标间进行两两比较,例如,就是指i对于j的重要程度)

        如果是5的话,就是1/5.

  • 一致性检验

        如果矩阵中每个元素>0,并且矩阵各行(列)成倍数关系,这个矩阵即一致矩阵.

        

                   ​​​​​​

import numpy as np

#定义矩阵A,np.array是numpy库中的函数,用于创建数组,将输入的数据转换成numpy数组
A=np.array([[.....], [.....], [.....], [.....]])

n=A.shape[0]    #获取A的行,0变为1则是获取A的列

#求出最大特征值以及对应的特征向量,np.linalg.eig是numpy库中的一个函数,用于计算方阵的特征值和特征向量
eig_val, eig_vec=np.linalg.eig(A)
#eig_val是特征值,eig_vec是特征向量
Max_eig=max(eig_val)

CI = (Max_eig - n)/(n-1)
RI = [0, 0.0001, 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]
#RI最多支持n=15
#n=2时,一定是一致矩阵,所以CI=0,为了避免分母为0,将这里转化为接近于0的正数

CR = CI / RI[n-1]

print('一致性指标CI=', CI)
print('一致性比例CR=',CR)

if CR < 0.10:
    print('由于CR小于0.10,所以该判断矩阵A的一致性可以接受!')
else:
    print('因为CR大于0.10,所以该判断矩阵需要进行修改!')

print('一致性比例CR=',CR)

if CR < 0.10:
    print('由于CR小于0.10,所以该判断矩阵A的一致性可以接受!')
else:
    print('因为CR大于0.10,所以该判断矩阵需要进行修改!')
  • 求权重后进行评价
  • 算术平均法求权重
    • 第一步:将判断矩阵按照列归一化.
    • 第二步:将归一化的各列相加.
    • 第三步:将相加后得到的向量中的每个元素除以n得到权重向量
  • 几何平均法求权重
    • 第一步:将判断矩阵的元素按行相乘得到一个新的列向量.
    • 第二步:将新的向量每个分量开n次方.
    • 第三步:对列向量进行归一化得到权重向量.
  • 特征值法求权重(前提一致化检验合格)
    • 第一步:求出矩阵A的最大特征值以及其对应的特征向量.
    • 第二步:对求出的特征向量进行归一化即可得到权重向量
import numpy as np

# #算术平均法求权重
# #定义判断矩阵A
# A = np.array([[......],[......],[......],[......]])

# #计算每列的和
# #np.sum用于计算一组中所有元素的总和
# #通过指定axis参数来计算多维数组的某个维度的元素总和,在二维数组中,axis=0表示按列计算,axis=1表示按行计算
# Asum = np.sum(A,axis=0)

# #获取A的行和列
# n = A.shape[0]

# #归一化,二维数组除以一维数组,会自动将一维数组拓展成二维数组的形式,然后按逐元素的除法计算
# Stand_A = A/Asum

# #各列相加到同一行
# Asumr = np.sum(Stand_A, axis=1)

# #计算权重向量
# weights = Asumr/n

# print(weights)



# #几何平均法求权重
# #定义判断矩阵A
# A = np.array([[......],[......],[......],[......]])

# #获取A的行与列
# n = A.shape[0]

# #将A中的每一行元素相乘得到一列向量
# #np.prod函数可以计算一维数组中所有元素的乘积
# #还可以通过指定axis参数来计算多维数组的某个维度上的元素乘积
# prod_A = np.prod(A,axis=1)

# #将新的向量的每个分量开n次方等价求1/n次方
# #np.power 是numpy库中的一个所数,用于对数组中的元素进行运算。
# #例如,可以使用np.power(a,b)对数组 a中的每个元系都按照b指数进行运算。
# prod_n_A = np.power(prod_A, 1/n)

# #归一化处理
# re_prod_A = prod_n_A / np.sum(prod_n_A)

# #展示权重结果
# print(re_prod_A)



#特征值法求权重
#定义判断矩阵A
A = np.array([[......],[......],[......],[......]])

#获取A的行和列
n = A.shape[0]

#求出特征值和特征向量
eig_values, eig_vectors = np.linalg.eig(A)

#找出最大特征值的索引,np.argmax是Py 库中的一个的数,用于返国数组中最大值的案引
max_index = np.argmax(eig_values)
#找出对应的特征向量
max_vector = eig_vectors[:, max_index]

#对特征向最进行归一化处理,得到权重
weights = max_vector / np.sum(max_vector)

#输出权重
print(weights)

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值