层次分析法(AHP)权重设置与稳健性检验完整解决方案
一、问题描述
本任务需实现以下目标:
- 使用层次分析法(AHP)设置评价指标权重
- 通过蒙特卡洛模拟检验权重稳健性
- 使用Spearman相关系数分析指标独立性
- 提供完整公式和计算过程
- 使用Python实现
二、层次分析法(AHP)原理
1. 基本步骤
- 建立层次结构模型
- 构造判断矩阵
- 层次单排序及一致性检验
- 层次总排序及一致性检验
2. 判断矩阵构造
采用1-9标度法进行两两比较:
标度值 = {1: 同等重要, 3: 稍微重要, 5: 明显重要, 7: 强烈重要, 9: 极端重要}
3. 权重计算公式
几何平均法:
w_i = \frac{\left(\prod_{j=1}^{n} a_{ij}\right)^{\frac{1}{n}}}{\sum_{k=1}^{n}\left(\prod_{j=1}^{n} a_{kj}\right)^{\frac{1}{n}}}
特征向量法:
A\mathbf{w} = \lambda_{\max}\mathbf{w}
4. 一致性检验
一致性指标:
CI = \frac{\lambda_{\max} - n}{n - 1}
随机一致性比率:
CR = \frac{CI}{RI}
其中RI为随机一致性指标(查表获取)
三、蒙特卡洛模拟稳健性检验
1. 实现步骤
- 在原始判断矩阵中加入随机扰动
- 生成N个随机判断矩阵
- 计算每个矩阵的权重向量
- 分析权重分布特性
2. 扰动模型
a_{ij}' = a_{ij} \cdot e^{\epsilon \cdot \delta}
其中:
- ϵ \epsilon ϵ:扰动强度(通常取0.1-0.3)
- δ \delta δ:服从标准正态分布的随机变量
3. 分析指标
- 权重均值
- 权重标准差
- 95%置信区间
- 权重分布直方图
四、指标独立性分析
Spearman相关系数
\rho = 1 - \frac{6\sum d_i^2}{n(n^2 - 1)}
其中 d i d_i di为两个变量的秩次差
五、Python完整实现
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.stats import spearmanr
from scipy.linalg import eigclass AHP:"""层次分析法完整实现类"""RI_DICT = {1: 0, 2: 0, 3: 0.58, 4: 0.9, 5: 1.12, 6: 1.24, 7: 1.32, 8: 1.41, 9: 1.45, 10: 1.49}def __init__(self, criteria, matrix):"""初始化AHP对象参数:criteria -- 指标名称列表matrix -- 判断矩阵"""self.criteria = criteriaself.matrix = np.array(matrix)self.n = len(criteria)self.weights = Noneself.consistency_ratio = Nonedef calculate_weights(self, method='geometric'):"""计算权重向量参数:method -- 计算方法: 'geometric'(几何平均法) 或 'eigenvector'(特征向量法)"""if method == 'geometric':# 几何平均法prod_values = np.prod(self.matrix, axis=1) ** (1/self.n)self.weights = prod_values / np.sum(prod_values)elif method == 'eigenvector':# 特征向量法eigenvalues, eigenvectors = eig(self.matrix)max_index = np.argmax(eigenvalues.real)max_eigenvector = eigenvectors[:, max_index].realself.weights = max_eigenvector / np.sum(max_eigenvector)# 计算一致性self._check_consistency()return self.weightsdef _check_consistency(self):"""一致性检验"""# 计算最大特征值weighted_sum = np.dot(self.matrix, self.weights)lambda_max = np.mean(weighted_sum / self.weights)# 计算CI和CRCI = (lambda_max - self.n) / (self.n - 1)RI = self.RI_DICT[self.n]self.consistency_ratio = CI / RI# 输出一致性结果print(f"CI = {CI:.4f}, RI = {RI}, CR = {self