背景:(评价决策类)
日常生活中有很多的决策问题。决策是指在面临多种方案时需要依据一定的标准选择某一种方案
买衣服,一般要依据质量、颜色、价格、款式等方面的因素选择
概念:
层次分析法(AnalyticHierarchyProcess,简称AHP)是对一些较为复杂、较为模糊的问题作出决策的简易方法,它特别适用于那些难于完全定量分析的问题。它是美国运筹学家T.L.Saaty教授于上世纪70年代初期提出的一种简便、灵活而又实用的多准则决策方法。
举例:XX微博要选出一个明星作为微博之星
现在有三个候选明星A、B、C,该选择哪位明星呢?
考虑一个明星的成就可以看其粉丝数、颜值、作品数量、作品质量(考)虑用作品某瓣平均评分代替)
A、B、C的相关数据如下
观察到每个指标数量级相差较大,怎样能够将指标弄到同一数量级进行比较呢(还要保证它们的差距不变)
可以进行归一化处理
归一化处理:指标的数组[abc]归一化处理得到
此时还不能直接进行比较,因为实际上每个指标对于评选的重要性是不同的,也就是赋给每个指标相应的权重不同。
应用AHP分析决策问题时,首先要把问题条理化、层次化,构造出一个有层次的结构模型。在这个模型下,复杂问题被分解为元素的组成部分。这些元素又按其属性及关系形成若干层次。上一层次的元素作为准则对下一层次有关元素起支配作用
- 最高层:这一层次中只有一个元素,一般它是分析问题的预定目标或理想结果因此也称为目标
- 中间层:这一层次中包含了为实现目标所涉及的中间环节,它可以由若干个层次组成,包括所需
- 考虑的准则、子准则,因此也称为准则层。
- 最底层:这一层次包括了为实现目标可供选择的各种措施、决策方案等,因此也称为措施层或方案层
步骤:
- 建立递阶层次结构模型
- 构造判断矩阵(aij-重要程度)aij代表第i个指标相对于第j个指标的重要程度
- 进行一致性检验
- 求权重
判断矩阵:
依次对变量进行两两比较,得到完整的判断矩阵,如下表所示
因两两比较的过程中忽略了其他因素,导致最后的结果可能出现矛盾,所以需要一致性检验
易得aij=aik*akj且矩阵各行(列)成倍数关系,满足这两条的矩阵是一致矩阵,不会出现矛盾的情况
注意:在使用判断矩阵求权重之前,必须对其进行一致性检验,以免产生矛盾。
一致性检验原理:检验我们构造的判断矩阵和一致矩阵是否有太大差别
- 引理:A为n阶方阵,且r(A)=1,则A有一个特征值为tr(A),其余特征值均为0
- 因为一致矩阵的各行成比例且不是零矩阵,所以一致矩阵的的秩一定为1
- 由引理可知:一致矩阵有一个特征值为n,其余特征值均为00
- 易得,特征值为n时,对应的特征向量刚好为k
- 引理:n阶正互反矩阵A为一致矩阵时当且仅当最大特征值入max=n。且当正互反矩阵A非一致
- 时,一定满足入max>n,判断矩阵越不一致时,最大特征值与相差就越大。
一致性检验的步骤
1、计算一致性指标CI
![](https://img-blog.csdnimg.cn/direct/62b21c9b716149afb11a693faf0c7155.png)
2、查找对应的平均随机一致性指标RI
注:RI我们只需要会查表即可,不用管怎么来的。在实际运用中,n很少超过10,如果指标的个数大于10,
则可考虑建立二级指标体系,或使用我们以后要学习的模糊综合评价模型。
3、计算一致性比例CR
![](https://img-blog.csdnimg.cn/direct/e86339f8ffa0480eacbc9390070b0d37.png)
求权重
- 算术平均法求权重
- 第一步:将判断矩阵按照列归一化(每一个元素除以其所在在列的和
- 第二步:将归一化的各列相加(按行求和)
- 第三步:将相加后得到的向量中每个元素除以n即可得到权重向量
一致矩阵有一个特征值n,其余特征值均为0
- 假如我们的到断矩阵一致性可以接受,那么我们可以仿照-一致矩阵权重的求法。
- 第一步:求出矩阵A的最大特征值以及其对应的特征向量
- 第二步:对求出的特征向量进行归一化即可得到我们的权重
求出权重后就是进行对应求和
具体代码:
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)
推荐网课:数模加油站,该博客均为作者本人学习笔记,仅供参考,如有错误,请及时指出。