层次分析法学习笔记
(通过【数学建模模型算法速成(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)