用Python解决综合评价问题_层次分析法模板

层次分析法(AHP)是一种定性和定量相结合的、系统化、层次化的决策分析方法。它通过将决策问题分解为目标、准则、方案等多个层次,通过成对比较、构建判断矩阵、计算权重和一致性比率等步骤,帮助决策者进行科学决策。以下是一个使用Python实现层次分析法的实例:

  1. 归一化处理:将判断矩阵的每一列归一化,使得每一列的和为1。
  2. 构建判断矩阵:根据决策者的偏好,构建成对比较的判断矩阵。
  3. 一致性检验:计算判断矩阵的最大特征值和对应的特征向量,并计算一致性指标(CI)和一致性比率(CR),以检验判断矩阵的一致性。
  4. 求权重:根据特征向量计算各元素的权重。
  5. 求综合评分:根据权重和各元素的评分,计算综合评分。

我们将以一个简单的例子来说明这个过程。假设我们正在从三个景点A,B,C,选择一个最优的旅游目的地,考虑的因素有:景色、文化、食物和成本。我们将使用这些因素构建判断矩阵,并计算权重和综合评分。

假设我们已有如下关于这三个景点的评分数据:

景色文化食物成本
Aabcd
Befgh
Cmjkn

接下来对上述数据用Python实现层次分析法来获取,B,C三个景点的综合评分,从而选取综合评分最高的作为结果。这个流程对于n个景点也同样使用。

一:归一化处理原始评分

由于我们对景色,文化,食物,成本四个维度的数据的评分标准可能不同,为了进行统一量纲,需要将同一列的评分进行归一化处理:

column_sums = matrix.sum(axis=0)
normalized_matrix = matrix / column_sums

这样我们就得到了归一化处理后的各个维度的评分:

景色文化食物成本
Aa/(a+e+m)b/(b+f+j)c/(c+g+k)d/(d+j+n)
Be/(a+e+m)f/(b+f+j)g/(c+g+k)

h/(d+j+n)

Cm/(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. 成对比较:判断矩阵是基于成对比较的原则构建的。决策者对每一对因素进行比较,以确定它们之间的相对重要性,比如如图中的a_{12}=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,数据分析和量化金融的实用教程和实战案例。

  • 22
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值