日常生活中有很多的决策问题。决策是指在面临多种方案时需要依据一定的标准选择某一种方案
买衣服,一般要依据质量、颜色、价格、款式等方面的因素选择
层次分析法(AnalyticHierarchyProcess,简称AHP)是对一些较为复杂、较为模糊的问题作出决策的简易方法,它特别适用于那些难于完全定量分析的问题。它是美国运筹学家T.L.Saaty教授于上世纪70年代初期提出的一种简便、灵活而又实用的多准则决策方法。
现在有三个候选明星A、B、C,该选择哪位明星呢?
考虑一个明星的成就可以看其粉丝数、颜值、作品数量、作品质量(考)虑用作品某瓣平均评分代替)
A、B、C的相关数据如下
观察到每个指标数量级相差较大,怎样能够将指标弄到同一数量级进行比较呢(还要保证它们的差距不变)
可以进行归一化处理
归一化处理:指标的数组[abc]归一化处理得到
此时还不能直接进行比较,因为实际上每个指标对于评选的重要性是不同的,也就是赋给每个指标相应的权重不同。
应用AHP分析决策问题时,首先要把问题条理化、层次化,构造出一个有层次的结构模型。在这个模型下,复杂问题被分解为元素的组成部分。这些元素又按其属性及关系形成若干层次。上一层次的元素作为准则对下一层次有关元素起支配作用
判断矩阵:
依次对变量进行两两比较,得到完整的判断矩阵,如下表所示
因两两比较的过程中忽略了其他因素,导致最后的结果可能出现矛盾,所以需要一致性检验
易得aij=aik*akj且矩阵各行(列)成倍数关系,满足这两条的矩阵是一致矩阵,不会出现矛盾的情况
注意:在使用判断矩阵求权重之前,必须对其进行一致性检验,以免产生矛盾。
一致性检验原理:检验我们构造的判断矩阵和一致矩阵是否有太大差别
注:RI我们只需要会查表即可,不用管怎么来的。在实际运用中,n很少超过10,如果指标的个数大于10,
则可考虑建立二级指标体系,或使用我们以后要学习的模糊综合评价模型。
求出权重后就是进行对应求和
import numpy as np
# 定义矩阵A
# A = np.array([[1, 2, 3, 5], [1/2, 1, 1/2, 2], [1/3, 2, 1, 1/2], [1/5, 1/2, 2, 1]])
A = np.array([[1, 2, 3, 5], [1/2, 1, 1/2, 2], [1/3, 2, 1, 2], [1/5, 1/2, 1/2, 1]])
n = A.shape[0] # 获取A的行
# 求出最大特征值以及对应的特征向量
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]
print('一致性指标CI=', CI)
print('一致性比例CR=', CR)
if CR < 0.10:
print('因为CR<0.10,所以该判断矩阵A的一致性可以接受!')
else:
print('注意:CR >= 0.10,因此该判断矩阵A需要进行修改!')
三种求权重方法的代码
import numpy as np
# 定义判断矩阵A
A = np.array([[1, 2, 3, 5], [1/2, 1, 1/2, 2], [1/3, 2, 1, 2], [1/5, 1/2, 1/2, 1]])
# 计算每列的和
ASum = np.sum(A, axis=0)
# 获取A的行和列
n, _ = A.shape
# 归一化
Stand_A = A / ASum
# 各列相加到同一行
ASumr = np.sum(Stand_A, axis=1)
# 计算权重向量
weights = ASumr / n
print(weights)
import numpy as np
# 定义判断矩阵A
A = np.array([[1, 2, 3, 5], [1/2, 1, 1/2, 2], [1/3, 2, 1, 2], [1/5, 1/2, 1/2, 1]])
# 获取A的行和列
n, _ = A.shape
# 将A中每一行元素相乘得到一列向量
prod_A = np.prod(A, axis=1)
# 将新的向量的每个分量开n次方等价求1/n次方
prod_n_A = np.power(prod_A, 1/n)
# 归一化处理
re_prod_A = prod_n_A / np.sum(prod_n_A)
# 展示权重结果
print(re_prod_A)
import numpy as np
# 定义判断矩阵A
A = np.array([[1, 2, 3, 5], [1/2, 1, 1/2, 2], [1/3, 2, 1, 2], [1/5, 1/2, 1/2, 1]])
# 获取A的行和列
n, _ = A.shape
# 求出特征值和特征向量
eig_values, eig_vectors = np.linalg.eig(A)
# 找出最大特征值的索引
max_index = np.argmax(eig_values)
# 找出对应的特征向量
max_vector = eig_vectors[:, max_index]
# 对特征向量进行归一化处理,得到权重
weights = max_vector / np.sum(max_vector)
# 输出权重
print(weights)
num = np.array([[0.40,0.42,0.29,0.25],[0.23,0.25,0.37,0.45],[0.37,0.33,0.34,0.30]])
weighted_average = num @ weights
print("加权平均值为:")
print(weighted_average)
推荐网课:数模加油站,该博客均为作者本人学习笔记,仅供参考,如有错误,请及时指出。