层次分析法(AHP)是一种定性和定量相结合的、系统化、层次化的决策分析方法。它通过将决策问题分解为目标、准则、方案等多个层次,通过成对比较、构建判断矩阵、计算权重和一致性比率等步骤,帮助决策者进行科学决策。以下是一个使用Python实现层次分析法的实例:
- 归一化处理:将判断矩阵的每一列归一化,使得每一列的和为1。
- 构建判断矩阵:根据决策者的偏好,构建成对比较的判断矩阵。
- 一致性检验:计算判断矩阵的最大特征值和对应的特征向量,并计算一致性指标(CI)和一致性比率(CR),以检验判断矩阵的一致性。
- 求权重:根据特征向量计算各元素的权重。
- 求综合评分:根据权重和各元素的评分,计算综合评分。
我们将以一个简单的例子来说明这个过程。假设我们正在从三个景点A,B,C,选择一个最优的旅游目的地,考虑的因素有:景色、文化、食物和成本。我们将使用这些因素构建判断矩阵,并计算权重和综合评分。
假设我们已有如下关于这三个景点的评分数据:
景色 | 文化 | 食物 | 成本 | |
A | a | b | c | d |
B | e | f | g | h |
C | m | j | k | n |
接下来对上述数据用Python实现层次分析法来获取,B,C三个景点的综合评分,从而选取综合评分最高的作为结果。这个流程对于n个景点也同样使用。
一:归一化处理原始评分
由于我们对景色,文化,食物,成本四个维度的数据的评分标准可能不同,为了进行统一量纲,需要将同一列的评分进行归一化处理:
column_sums = matrix.sum(axis=0)
normalized_matrix = matrix / column_sums
这样我们就得到了归一化处理后的各个维度的评分:
景色 | 文化 | 食物 | 成本 | |
A | a/(a+e+m) | b/(b+f+j) | c/(c+g+k) | d/(d+j+n) |
B | e/(a+e+m) | f/(b+f+j) | g/(c+g+k) | h/(d+j+n) |
C | m/(a+e+m) | j/(b+f+j) | k/(c+g+k) | n/(d+j+n) |
归一化后的矩阵如上所示,每列的和都为1。
二:求各个维度的权重
1:构建判断矩阵
# 构建判断矩阵
# 例如,对于景色、文化、食物和成本这四个因素,专家给出的成对比较结果如下:
# 景色 文化 食物 成本
# 景色 1 3 2 1/4
# 文化 1/3 1 1/2 1/5
# 食物 1/2 2 1 1/6
# 成本 4 5 6 1
judgment_matrix = np.array([
[1, 3, 2, 1/4],
[1/3, 1, 1/2, 1/5],
[1/2, 2, 1, 1/6],
[4, 5, 6, 1]
])
判断矩阵是层次分析法(AHP)中的一个核心概念,它用于表示决策者对各个因素之间相对重要性的判断。判断矩阵是一个方形矩阵,通常用于成对比较决策因素。以下是判断矩阵的一些关键特点:
1. 成对比较:判断矩阵是基于成对比较的原则构建的。决策者对每一对因素进行比较,以确定它们之间的相对重要性,比如如图中的=3,意思是景色的重要性是食物的三倍。
2. 标度:在成对比较中,通常使用1到9的标度来表示相对重要性。1表示两个因素同等重要,9表示一个因素比另一个因素重要得多。还有其他一些标度,如1到3的标度,用于不那么严格的比较。
3. 对称性:判断矩阵是对称的,即矩阵的上三角和下三角是对称的。
2:一致性检验
1:一致性:判断矩阵的一致性是指矩阵的所有元素是否满足逻辑上的一致性。例如,如果因素A比因素B重要,因素B比因素C重要,那么因素A也应该比因素C重要。
2. 一致性检验:为了确保判断矩阵的有效性,通常需要进行一致性检验,如计算一致性指标(CI)和一致性比率(CR)。
这些是一致性检验的具体过程,以下是代码实现:
n = judgment_matrix.shape[0] # 判断矩阵的阶数
CI = (max_eigenvalue - n) / (n - 1)
RI = {1: 0, 2: 0, 3: 0.52, 4: 0.89, 5: 1.12, 6: 1.26, 7: 1.32, 8: 1.41, 9: 1.46, 10: 1.49} # 随机一致性指标
CR = CI / RI[n]
计算得到的一致性指标CI,CR ,如果这些值是负数,这表明我们的判断矩阵可能存在一些问题,需要重新评估和调整。
如果0<CR<1,说明我们的判断矩阵是一致矩阵。
3:求权重
# 归一化处理
column_sums = judgment_matrix.sum(axis=0)
normalized_matrix = judgment_matrix / column_sums
# 计算权重
eigenvalues, eigenvectors = np.linalg.eig(normalized_matrix)
max_eigenvalue = np.max(eigenvalues)
max_eigenvector = eigenvectors[:, np.argmax(eigenvalues)]
weights = max_eigenvector / max_eigenvector.sum()
先按列归一化,再按行求和后除以n。可以得到景色,文化,食物,成本各自的权重。
最后我们得到结果为:
权重计算:计算得到的权重分别为:
- 景色:约 0.176
- 文化:约 0.101
- 食物:约 0.108
- 成本:约 0.615
三:用评分矩阵乘以权重
# normalized_matrix是我们之前得到的各个维度的评分
# 之前计算出的权重
weights = np.array([0.176, 0.101, 0.108, 0.615])
# 计算每个景点的综合评分
composite_scores = {}
for location, score in scores.items():
composite_scores[location] = np.dot(normalized_matrix, weights)
composite_scores
这个composite_scores是我们最终得到关于A,B,C三个景点的综合评分。
以上就是用Python实现层次分析法进行综合评价的全部过程,可以作为模板来使用。
点下关注,分享更多有关AI,数据分析和量化金融的实用教程和实战案例。