层次分析法(AHP)实战:用Python手把手教你做决策分析(附完整代码)

张开发
2026/5/19 16:47:01 15 分钟阅读
层次分析法(AHP)实战:用Python手把手教你做决策分析(附完整代码)
层次分析法AHP实战用Python手把手教你做决策分析附完整代码当面临多个备选方案需要做出决策时如何科学地量化各因素的权重层次分析法Analytic Hierarchy Process, AHP提供了一套系统化的解决方案。本文将带你从零开始通过Python代码实现完整的AHP分析流程涵盖判断矩阵构建、一致性检验到权重计算的每个细节。1. AHP基础与核心概念AHP的核心思想是将复杂决策问题分解为目标、准则和方案三个层次通过两两比较构建判断矩阵最终计算出各元素的相对权重。这种方法特别适合处理定性因素较多的决策场景比如企业供应商选择价格、质量、交货期等维度个人职业规划发展空间、薪资、地理位置等因素产品功能优先级排序用户需求、开发成本等考量关键术语解析判断矩阵反映元素间相对重要性的方阵采用1-9标度法如下表标度值含义1两个因素同等重要3前者比后者稍重要5前者比后者明显重要7前者比后者强烈重要9前者比后者极端重要2,4,6,8上述相邻判断的中间值一致性比率(CR)衡量判断逻辑一致性的指标当CR0.1时矩阵可接受权重向量反映各元素相对重要性的归一化数值2. Python实现AHP全流程2.1 环境准备与数据初始化首先确保安装必要的科学计算库pip install numpy pandas我们以选择办公软件为例构建如下层次结构目标层选择最佳办公软件准则层功能、价格、服务方案层软件A、软件B、软件Cimport numpy as np # 准则层判断矩阵功能、价格、服务 criteria_matrix np.array([ [1, 3, 5], # 功能比价格稍重要比服务明显重要 [1/3, 1, 2], # 价格比服务稍不重要 [1/5, 1/2, 1] ]) # 各准则下的方案判断矩阵 function_matrix np.array([ # 功能维度 [1, 4, 2], [1/4, 1, 1/2], [1/2, 2, 1] ]) price_matrix np.array([ # 价格维度 [1, 1/3, 1/5], [3, 1, 1/2], [5, 2, 1] ]) service_matrix np.array([ # 服务维度 [1, 2, 3], [1/2, 1, 2], [1/3, 1/2, 1] ])2.2 一致性检验实现判断矩阵必须通过一致性检验才有意义以下是关键步骤def consistency_check(matrix): n matrix.shape[0] # 计算最大特征值和特征向量 eigenvalues, _ np.linalg.eig(matrix) max_eigenvalue max(eigenvalues.real) # 一致性指标 CI (max_eigenvalue - n) / (n - 1) # 随机一致性指标n3~15 RI_table [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] RI RI_table[n-1] # 一致性比率 CR CI / RI return CR 0.1, CR # 检验所有矩阵 print(准则层CR:, consistency_check(criteria_matrix)[1]) print(功能矩阵CR:, consistency_check(function_matrix)[1]) print(价格矩阵CR:, consistency_check(price_matrix)[1]) print(服务矩阵CR:, consistency_check(service_matrix)[1])提示当CR≥0.1时需要调整判断矩阵。常见调整方法是检查极端比值如9:1是否合理或重新评估相对重要性。2.3 三种权重计算方法对比方法一算术平均法def weight_arithmetic(matrix): norm_matrix matrix / matrix.sum(axis0) weights norm_matrix.mean(axis1) return weights / weights.sum() criteria_weights weight_arithmetic(criteria_matrix) print(准则层权重(算术平均):, criteria_weights)方法二几何平均法def weight_geometric(matrix): product matrix.prod(axis1) geometric_mean product ** (1/len(matrix)) weights geometric_mean / geometric_mean.sum() return weights print(准则层权重(几何平均):, weight_geometric(criteria_matrix))方法三特征值法def weight_eigenvalue(matrix): eigenvalues, eigenvectors np.linalg.eig(matrix) max_idx np.argmax(eigenvalues.real) weights eigenvectors[:, max_idx].real return weights / weights.sum() print(准则层权重(特征值):, weight_eigenvalue(criteria_matrix))实际应用中建议综合三种方法的结果。以下是组合实现def integrated_weights(matrix): w1 weight_arithmetic(matrix) w2 weight_geometric(matrix) w3 weight_eigenvalue(matrix) return (w1 w2 w3) / 3 final_criteria_weights integrated_weights(criteria_matrix) print(综合权重:, final_criteria_weights)3. 完整决策分析流程3.1 计算方案层权重# 计算各准则下的方案权重 function_weights integrated_weights(function_matrix) price_weights integrated_weights(price_matrix) service_weights integrated_weights(service_matrix) # 组合成权重矩阵 solution_weights np.vstack([function_weights, price_weights, service_weights]) # 计算最终得分 final_scores solution_weights.T final_criteria_weights software_names [软件A, 软件B, 软件C] for name, score in zip(software_names, final_scores): print(f{name}综合得分: {score:.4f})3.2 结果可视化分析import matplotlib.pyplot as plt plt.figure(figsize(10, 5)) plt.bar(software_names, final_scores, color[#3498db, #2ecc71, #e74c3c]) plt.title(办公软件选择AHP分析结果) plt.ylabel(综合得分) plt.grid(axisy, linestyle--, alpha0.7) plt.show()4. 实战技巧与常见问题4.1 判断矩阵构建经验标度选择技巧先确定最重要和最不重要的元素采用如果A比B重要X倍那么B比A重要1/X的对称性避免同时出现多个极端比值如多个9:1一致性优化方法使用AHP专用工具如Expert Choice辅助调整采用德尔菲法收集多位专家意见对CR略高于0.1的矩阵可微调最不一致的元素4.2 代码优化建议class AHP: def __init__(self, criteria, alternatives): self.criteria criteria self.alternatives alternatives self.ri_table [...] # RI值表 def add_judgment(self, matrix, name): # 实现矩阵校验和存储 pass def calculate(self): # 整合计算流程 pass def sensitivity_analysis(self): # 实现权重敏感性分析 pass注意实际项目中建议将AHP实现为类方便管理多个判断矩阵和进行敏感性分析。4.3 决策敏感性分析通过微调准则层权重观察最终排名变化def sensitivity_test(base_weights, variations): results [] for var in variations: new_weights base_weights * var new_weights / new_weights.sum() scores solution_weights.T new_weights results.append(scores) return np.array(results) # 测试价格权重±20%的影响 variations [1, 1.2, 0.8] sensitivity_results sensitivity_test(final_criteria_weights, variations)这个分析能帮助识别对决策结果影响最大的准则在实际商业决策中尤为重要。

更多文章