层次分析法(内含python完整代码)

背景:(评价决策类)

日常生活中有很多的决策问题。决策是指在面临多种方案时需要依据一定的标准选择某一种方案
买衣服,一般要依据质量、颜色、价格、款式等方面的因素选择


概念:

层次分析法(AnalyticHierarchyProcess,简称AHP)是对一些较为复杂、较为模糊的问题作出决策的简易方法,它特别适用于那些难于完全定量分析的问题。它是美国运筹学家T.L.Saaty教授于上世纪70年代初期提出的一种简便、灵活而又实用的多准则决策方法。

举例:XX微博要选出一个明星作为微博之星

现在有三个候选明星A、B、C,该选择哪位明星呢?
考虑一个明星的成就可以看其粉丝数、颜值、作品数量、作品质量(考)虑用作品某瓣平均评分代替)
A、B、C的相关数据如下

层次分析法(内含python完整代码)_第1张图片

观察到每个指标数量级相差较大,怎样能够将指标弄到同一数量级进行比较呢(还要保证它们的差距不变)

可以进行归一化处理

归一化处理:指标的数组[abc]归一化处理得到[a+b+c),b/(a+b+c),b/(a+b+c),c/(a+b+c)]

层次分析法(内含python完整代码)_第2张图片
此时还不能直接进行比较,因为实际上每个指标对于评选的重要性是不同的,也就是赋给每个指标相应的权重不同。

应用AHP分析决策问题时,首先要把问题条理化层次化,构造出一个有层次的结构模型。在这个模型下,复杂问题被分解为元素的组成部分。这些元素又按其属性及关系形成若干层次。上一层次的元素作为准则对下一层次有关元素起支配作用

  • 最高层:这一层次中只有一个元素,一般它是分析问题的预定目标或理想结果因此也称为目标
  • 中间层:这一层次中包含了为实现目标所涉及的中间环节,它可以由若干个层次组成,包括所需
  • 考虑的准则、子准则,因此也称为准则层。
  • 最底层:这一层次包括了为实现目标可供选择的各种措施、决策方案等,因此也称为措施层或方案层

层次分析法(内含python完整代码)_第3张图片

层次分析法(内含python完整代码)_第4张图片

步骤:

  • 建立递阶层次结构模型
  • 构造判断矩阵(aij-重要程度)aij代表第i个指标相对于第j个指标的重要程度
  • 进行一致性检验
  • 求权重

判断矩阵:

层次分析法(内含python完整代码)_第5张图片

依次对变量进行两两比较,得到完整的判断矩阵,如下表所示

层次分析法(内含python完整代码)_第6张图片

因两两比较的过程中忽略了其他因素,导致最后的结果可能出现矛盾,所以需要一致性检验

易得aij=aik*akj且矩阵各行(列)成倍数关系,满足这两条的矩阵是一致矩阵,不会出现矛盾的情况

层次分析法(内含python完整代码)_第7张图片层次分析法(内含python完整代码)_第8张图片

注意:在使用判断矩阵求权重之前,必须对其进行一致性检验,以免产生矛盾。
一致性检验原理:检验我们构造的判断矩阵和一致矩阵是否有太大差别

层次分析法(内含python完整代码)_第9张图片

  • 引理:A为n阶方阵,且r(A)=1,则A有一个特征值为tr(A),其余特征值均为0
  • 因为一致矩阵的各行成比例且不是零矩阵,所以一致矩阵的的秩一定为1
  • 由引理可知:一致矩阵有一个特征值为n,其余特征值均为00
  • 易得,特征值为n时,对应的特征向量刚好为k
  • 引理:n阶正互反矩阵A为一致矩阵时当且仅当最大特征值入max=n。且当正互反矩阵A非一致
  • 时,一定满足入max>n,判断矩阵越不一致时,最大特征值与相差就越大。

一致性检验的步骤

1、计算一致性指标CI

2、查找对应的平均随机一致性指标RI

注:RI我们只需要会查表即可,不用管怎么来的。在实际运用中,n很少超过10,如果指标的个数大于10,
则可考虑建立二级指标体系,或使用我们以后要学习的模糊综合评价模型。


3、计算一致性比例CR
层次分析法(内含python完整代码)_第10张图片

层次分析法(内含python完整代码)_第11张图片层次分析法(内含python完整代码)_第12张图片

求权重

  • 算术平均法求权重
  • 第一步:将判断矩阵按照列归一化(每一个元素除以其所在在列的和
  • 第二步:将归一化的各列相加(按行求和)
  • 第三步:将相加后得到的向量中每个元素除以n即可得到权重向量层次分析法(内含python完整代码)_第13张图片层次分析法(内含python完整代码)_第14张图片

层次分析法(内含python完整代码)_第15张图片层次分析法(内含python完整代码)_第16张图片

一致矩阵有一个特征值n,其余特征值均为0

  • 假如我们的到断矩阵一致性可以接受,那么我们可以仿照-一致矩阵权重的求法。
  • 第一步:求出矩阵A的最大特征值以及其对应的特征向量
  • 第二步:对求出的特征向量进行归一化即可得到我们的权重

层次分析法(内含python完整代码)_第17张图片层次分析法(内含python完整代码)_第18张图片

求出权重后就是进行对应求和

层次分析法(内含python完整代码)_第19张图片

具体代码:

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)

推荐网课:数模加油站,该博客均为作者本人学习笔记,仅供参考,如有错误,请及时指出。

你可能感兴趣的:(算法)