欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 艺术 > python实现层次分析法(AHP)权重设置与稳健性检验完整解决方案

python实现层次分析法(AHP)权重设置与稳健性检验完整解决方案

2025/6/13 17:22:07 来源:https://blog.csdn.net/huanghm88/article/details/148619583  浏览:    关键词:python实现层次分析法(AHP)权重设置与稳健性检验完整解决方案

层次分析法(AHP)权重设置与稳健性检验完整解决方案

一、问题描述

本任务需实现以下目标:

  1. 使用层次分析法(AHP)设置评价指标权重
  2. 通过蒙特卡洛模拟检验权重稳健性
  3. 使用Spearman相关系数分析指标独立性
  4. 提供完整公式和计算过程
  5. 使用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. 实现步骤
  1. 在原始判断矩阵中加入随机扰动
  2. 生成N个随机判断矩阵
  3. 计算每个矩阵的权重向量
  4. 分析权重分布特性
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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词