一、层次分析法原理
层次分析法(Analytic Hierarchy Process,AHP)由美国运筹学家托马斯·塞蒂(T. L. Saaty)于20世纪70年代中期提出,用于确定评价模型中各评价因子/准则的权重,进一步选择最优方案。该方法仍具有较强的主观性,判断/比较矩阵的构造在一定程度上是拍脑门决定的,一致性检验只是检验拍脑门有没有自相矛盾得太离谱。
相关的理论参考可见:wiki百科
二、代码实现
需要借助Python的numpy矩阵运算包,代码最后用了一个b1矩阵进行了调试,相关代码如下,具体的实现流程已经用详细的注释标明,各位小伙伴有疑问的欢迎留言和我一起讨论。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
import numpy as np
class AHP:
"""
相关信息的传入和准备
"""
def __init__( self , array):
## 记录矩阵相关信息
self .array = array
## 记录矩阵大小
self .n = array.shape[ 0 ]
# 初始化RI值,用于一致性检验
self .RI_list = [ 0 , 0 , 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 ]
# 矩阵的特征值和特征向量
self .eig_val, self .eig_vector = np.linalg.eig( self .array)
# 矩阵的最大特征值
self .max_eig_val = np. max ( self .eig_val)
# 矩阵最大特征值对应的特征向量
self .max_eig_vector = self .eig_vector[:, np.argmax( self .eig_val)].real
# 矩阵的一致性指标CI
self .CI_val = ( self .max_eig_val - self .n) / ( self .n - 1 )
# 矩阵的一致性比例CR
self .CR_val = self .CI_val / ( self .RI_list[ self .n - 1 ])
"""
一致性判断
"""
def test_consist( self ):
# 打印矩阵的一致性指标CI和一致性比例CR
print ( "判断矩阵的CI值为:" + str ( self .CI_val))
print ( "判断矩阵的CR值为:" + str ( self .CR_val))
# 进行一致性检验判断
if self .n = = 2 : # 当只有两个子因素的情况
print ( "仅包含两个子因素,不存在一致性问题" )
else :
if self .CR_val < 0.1 : # CR值小于0.1,可以通过一致性检验
print ( "判断矩阵的CR值为" + str ( self .CR_val) + ",通过一致性检验" )
return True
else : # CR值大于0.1, 一致性检验不通过
print ( "判断矩阵的CR值为" + str ( self .CR_val) + "未通过一致性检验" )
return False
"""
算术平均法求权重
"""
def cal_weight_by_arithmetic_method( self ):
# 求矩阵的每列的和
col_sum = np. sum ( self .array, axis = 0 )
# 将判断矩阵按照列归一化
array_normed = self .array / col_sum
# 计算权重向量
array_weight = np. sum (array_normed, axis = 1 ) / self .n
# 打印权重向量
print ( "算术平均法计算得到的权重向量为:\n" , array_weight)
# 返回权重向量的值
return array_weight
"""
几何平均法求权重
"""
def cal_weight__by_geometric_method( self ):
# 求矩阵的每列的积
col_product = np.product( self .array, axis = 0 )
# 将得到的积向量的每个分量进行开n次方
array_power = np.power(col_product, 1 / self .n)
# 将列向量归一化
array_weight = array_power / np. sum (array_power)
# 打印权重向量
print ( "几何平均法计算得到的权重向量为:\n" , array_weight)
# 返回权重向量的值
return array_weight
"""
特征值法求权重
"""
def cal_weight__by_eigenvalue_method( self ):
# 将矩阵最大特征值对应的特征向量进行归一化处理就得到了权重
array_weight = self .max_eig_vector / np. sum ( self .max_eig_vector)
# 打印权重向量
print ( "特征值法计算得到的权重向量为:\n" , array_weight)
# 返回权重向量的值
return array_weight
if __name__ = = "__main__" :
# 给出判断矩阵
b = np.array([[ 1 , 1 / 3 , 1 / 8 ], [ 3 , 1 , 1 / 3 ], [ 8 , 3 , 1 ]])
# 算术平均法求权重
weight1 = AHP(b).cal_weight_by_arithmetic_method()
# 几何平均法求权重
weight2 = AHP(b).cal_weight__by_geometric_method()
# 特征值法求权重
weight3 = AHP(b).cal_weight__by_eigenvalue_method()
|
总结
到此这篇关于python实现AHP算法(层次分析法)的文章就介绍到这了,更多相关python AHP算法(层次分析法)内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/weixin_45096408/article/details/108456488