层次分析法 AHP 实战Python 实现 3 种权重计算与一致性检验决策分析中经常面临多准则权衡的复杂场景传统的主观赋权方法难以避免人为偏差。1971年由运筹学家T.L.Saaty提出的层次分析法AHP通过构建判断矩阵将主观判断转化为定量计算为这类问题提供了系统化的解决方案。本文将聚焦Python工程化实现提供可直接集成到实际项目中的代码工具集。1. AHP核心原理与实现框架层次分析法的数学本质是将n个要素的相对重要性转化为正互反矩阵的特征向量问题。其核心流程可分为四个阶段构建层次结构→构造判断矩阵→计算权重向量→一致性验证。Python实现需要重点解决以下技术难点判断矩阵的规范化处理特征向量的数值稳定性一致性检验的自动化实现与Pandas数据结构的无缝对接我们构建的AHPProcessor类将封装这些核心功能import numpy as np import pandas as pd from typing import List, Tuple, Union class AHPProcessor: def __init__(self, criteria: List[str]): self.criteria criteria self.n len(criteria) self.ri_dict {1:0, 2:0, 3:0.52, 4:0.89, 5:1.11, 6:1.25, 7:1.35, 8:1.40, 9:1.45}2. 权重计算的三种实现方法2.1 算术平均法和法算术平均法通过对归一化后的判断矩阵按行求均值得到权重计算过程直观稳定def calculate_weights_am(self, matrix: np.ndarray) - np.ndarray: 算术平均法计算权重 norm_matrix matrix / matrix.sum(axis0) weights norm_matrix.mean(axis1) return weights / weights.sum()该方法特别适合处理存在零值的稀疏矩阵但未考虑矩阵的乘法关系。2.2 几何平均法根法几何平均法通过乘积方根计算反映要素间的几何关系def calculate_weights_gm(self, matrix: np.ndarray) - np.ndarray: 几何平均法计算权重 row_products np.prod(matrix, axis1) ** (1/self.n) weights row_products / row_products.sum() return weights注意当矩阵存在零值时需进行平滑处理建议添加微小值ε1e-72.3 特征值法特征值法是AHP的理论基础通过求解主特征向量获得最优权重def calculate_weights_ev(self, matrix: np.ndarray) - np.ndarray: 特征值法计算权重 eigenvalues, eigenvectors np.linalg.eig(matrix) max_idx np.argmax(eigenvalues) weights np.real(eigenvectors[:, max_idx]) return weights / weights.sum()三种方法对比结果示例假设3×3判断矩阵方法权重1权重2权重3算术平均法0.53960.16340.2970几何平均法0.54760.15650.2959特征值法0.54870.15560.29573. 一致性检验的自动化实现一致性比率CR是验证判断矩阵逻辑合理性的关键指标def check_consistency(self, matrix: np.ndarray, weights: np.ndarray) - Tuple[float, float, float]: 计算一致性指标 aw matrix weights lambda_max np.mean(aw / weights) ci (lambda_max - self.n) / (self.n - 1) cr ci / self.ri_dict.get(self.n, 1.45) return ci, cr, lambda_max典型的一致性检验结果处理逻辑ci, cr, lambda_max ahp.check_consistency(matrix, weights) if cr 0.1: print(f警告CR值{cr:.3f}≥0.1建议调整判断矩阵) # 自动识别问题元素 consistency_ratio (aw / weights) / lambda_max problematic np.where(np.abs(consistency_ratio - 1) 0.2)[0]4. Pandas集成与工程实践为提升实际项目的易用性我们实现与Pandas的深度集成def analyze_dataframe(self, df: pd.DataFrame) - pd.DataFrame: 处理包含多个判断矩阵的DataFrame results [] for _, row in df.iterrows(): matrix np.array([row[fc{i}] for i in range(1, self.n1)]) weights_am self.calculate_weights_am(matrix) weights_ev self.calculate_weights_ev(matrix) ci, cr, _ self.check_consistency(matrix, weights_ev) results.append({ matrix_id: row[id], weights_am: weights_am, weights_ev: weights_ev, ci: ci, cr: cr, passed: cr 0.1 }) return pd.DataFrame(results)典型应用场景——电商平台供应商评估构建准则层价格、质量、交货期、服务采集专家打分构建判断矩阵计算各准则权重对供应商在各准则下评分计算综合得分排序# 示例供应商评估 criteria [价格, 质量, 交货期, 服务] ahp AHPProcessor(criteria) # 构建判断矩阵 judgment_matrix np.array([ [1, 1/3, 5, 3], [3, 1, 7, 5], [1/5, 1/7, 1, 1/3], [1/3, 1/5, 3, 1] ]) # 计算综合权重 final_weights 0.4 * weights_am 0.6 * weights_ev5. 性能优化与边界处理针对大规模矩阵的计算优化策略def optimized_eigenvector(matrix: np.ndarray, max_iter100, tol1e-6): 幂迭代法求主特征向量 n matrix.shape[0] v np.ones(n) / n for _ in range(max_iter): new_v matrix v new_v / np.linalg.norm(new_v) if np.linalg.norm(new_v - v) tol: break v new_v return v常见异常处理场景矩阵非互反assert np.allclose(matrix, 1/matrix.T)CR值超标自动建议调整幅度最大的3个元素零值处理matrix np.where(matrix0, 1e-7, matrix)实际项目中建议将权重计算过程封装为微服务通过REST API提供计算服务。对于需要频繁更新的场景可以考虑使用Redis缓存最近使用的判断矩阵特征向量。
层次分析法 AHP 实战:Python 实现 3 种权重计算与一致性检验
发布时间:2026/7/9 21:09:10
层次分析法 AHP 实战Python 实现 3 种权重计算与一致性检验决策分析中经常面临多准则权衡的复杂场景传统的主观赋权方法难以避免人为偏差。1971年由运筹学家T.L.Saaty提出的层次分析法AHP通过构建判断矩阵将主观判断转化为定量计算为这类问题提供了系统化的解决方案。本文将聚焦Python工程化实现提供可直接集成到实际项目中的代码工具集。1. AHP核心原理与实现框架层次分析法的数学本质是将n个要素的相对重要性转化为正互反矩阵的特征向量问题。其核心流程可分为四个阶段构建层次结构→构造判断矩阵→计算权重向量→一致性验证。Python实现需要重点解决以下技术难点判断矩阵的规范化处理特征向量的数值稳定性一致性检验的自动化实现与Pandas数据结构的无缝对接我们构建的AHPProcessor类将封装这些核心功能import numpy as np import pandas as pd from typing import List, Tuple, Union class AHPProcessor: def __init__(self, criteria: List[str]): self.criteria criteria self.n len(criteria) self.ri_dict {1:0, 2:0, 3:0.52, 4:0.89, 5:1.11, 6:1.25, 7:1.35, 8:1.40, 9:1.45}2. 权重计算的三种实现方法2.1 算术平均法和法算术平均法通过对归一化后的判断矩阵按行求均值得到权重计算过程直观稳定def calculate_weights_am(self, matrix: np.ndarray) - np.ndarray: 算术平均法计算权重 norm_matrix matrix / matrix.sum(axis0) weights norm_matrix.mean(axis1) return weights / weights.sum()该方法特别适合处理存在零值的稀疏矩阵但未考虑矩阵的乘法关系。2.2 几何平均法根法几何平均法通过乘积方根计算反映要素间的几何关系def calculate_weights_gm(self, matrix: np.ndarray) - np.ndarray: 几何平均法计算权重 row_products np.prod(matrix, axis1) ** (1/self.n) weights row_products / row_products.sum() return weights注意当矩阵存在零值时需进行平滑处理建议添加微小值ε1e-72.3 特征值法特征值法是AHP的理论基础通过求解主特征向量获得最优权重def calculate_weights_ev(self, matrix: np.ndarray) - np.ndarray: 特征值法计算权重 eigenvalues, eigenvectors np.linalg.eig(matrix) max_idx np.argmax(eigenvalues) weights np.real(eigenvectors[:, max_idx]) return weights / weights.sum()三种方法对比结果示例假设3×3判断矩阵方法权重1权重2权重3算术平均法0.53960.16340.2970几何平均法0.54760.15650.2959特征值法0.54870.15560.29573. 一致性检验的自动化实现一致性比率CR是验证判断矩阵逻辑合理性的关键指标def check_consistency(self, matrix: np.ndarray, weights: np.ndarray) - Tuple[float, float, float]: 计算一致性指标 aw matrix weights lambda_max np.mean(aw / weights) ci (lambda_max - self.n) / (self.n - 1) cr ci / self.ri_dict.get(self.n, 1.45) return ci, cr, lambda_max典型的一致性检验结果处理逻辑ci, cr, lambda_max ahp.check_consistency(matrix, weights) if cr 0.1: print(f警告CR值{cr:.3f}≥0.1建议调整判断矩阵) # 自动识别问题元素 consistency_ratio (aw / weights) / lambda_max problematic np.where(np.abs(consistency_ratio - 1) 0.2)[0]4. Pandas集成与工程实践为提升实际项目的易用性我们实现与Pandas的深度集成def analyze_dataframe(self, df: pd.DataFrame) - pd.DataFrame: 处理包含多个判断矩阵的DataFrame results [] for _, row in df.iterrows(): matrix np.array([row[fc{i}] for i in range(1, self.n1)]) weights_am self.calculate_weights_am(matrix) weights_ev self.calculate_weights_ev(matrix) ci, cr, _ self.check_consistency(matrix, weights_ev) results.append({ matrix_id: row[id], weights_am: weights_am, weights_ev: weights_ev, ci: ci, cr: cr, passed: cr 0.1 }) return pd.DataFrame(results)典型应用场景——电商平台供应商评估构建准则层价格、质量、交货期、服务采集专家打分构建判断矩阵计算各准则权重对供应商在各准则下评分计算综合得分排序# 示例供应商评估 criteria [价格, 质量, 交货期, 服务] ahp AHPProcessor(criteria) # 构建判断矩阵 judgment_matrix np.array([ [1, 1/3, 5, 3], [3, 1, 7, 5], [1/5, 1/7, 1, 1/3], [1/3, 1/5, 3, 1] ]) # 计算综合权重 final_weights 0.4 * weights_am 0.6 * weights_ev5. 性能优化与边界处理针对大规模矩阵的计算优化策略def optimized_eigenvector(matrix: np.ndarray, max_iter100, tol1e-6): 幂迭代法求主特征向量 n matrix.shape[0] v np.ones(n) / n for _ in range(max_iter): new_v matrix v new_v / np.linalg.norm(new_v) if np.linalg.norm(new_v - v) tol: break v new_v return v常见异常处理场景矩阵非互反assert np.allclose(matrix, 1/matrix.T)CR值超标自动建议调整幅度最大的3个元素零值处理matrix np.where(matrix0, 1e-7, matrix)实际项目中建议将权重计算过程封装为微服务通过REST API提供计算服务。对于需要频繁更新的场景可以考虑使用Redis缓存最近使用的判断矩阵特征向量。