层次分析法(Analytic Hierarchy Process,简称AHP)
层次分析法是一种定性和定量相结合的分析方法,于20世纪70年代初由美国运筹学家Saaty提出。是用于多准则决策分析的数学方法。
这里是写的比较具体的:用人话讲明白AHP层次分析法(非常详细原理+简单工具实现)
AHP通过将复杂问题分解为多个层次、准则和子准则,建立判断矩阵,并通过对各个层次的比较和权重计算,最终得出最优的决策方案。
1.问题分解(层次结构模型的构建):
首先,将复杂的决策问题分解成一个层次结构。通常分为目标层、准则层和方案层。目标层是决策的最终目标,准则层是影响决策的因素,方案层是可能的选项或方案。
2.构建判断矩阵:
对每一层次的各个元素(行与列)进行成对比较,建立判断矩阵。这一步要求决策者根据经验或数据,对两个元素的相对重要性进行判断。判断矩阵中的元素值通常是1到9的标度值,1表示两个元素同等重要,9表示一个元素比另一个元素极端重要。
3.层次单排序:
通过判断矩阵的特征向量计算各个元素的相对权重。这个过程通常涉及到数学运算,如矩阵的特征值计算和特征向量的归一化处理。
计算权重
方法:
方根法:计算每行乘积的m次方得到一个m维向量,再将向量标准化得到权重向量
和法:矩阵每列进行标准化(归一化),再将各元素按行求和,再将求和结果标准化
求解最大特征根与CI值
对于不是一致矩阵的矩阵,Saaty等人建议用其最大特征根𝜆𝑚𝑎𝑥对应的归一化特征向量作为权向量W,W={w₁,w₂,w₃,…,wn},AW=λW。
公式为:
4.一致性检验:
检查判断矩阵的逻辑一致性。由于人工判断可能会存在不一致性,因此需要通过一致性比率(Consistency Ratio,CR)的计算来确定判断矩阵是否可以接受。
用一致性指标 CI 来检验判断的一致性指标:
C.I.=0 表示判断矩阵完全一致,C.I.越大,判断矩阵的不一致性程度越严重。为衡量CI 的大小,引入随机一致性指标 RI,Satty 模拟 1000 次得到的随机一致性指标 R.I.取值表:
根据CI、RI值求解CR值,判断其一致性是否通过。
当 C.R.<0.1 时,表明判断矩阵 A 的一致性程度被认为在容许的范围内,此时可用 A 的特征向量开展权向量计算;若 C.R.≥0.1, 则应考虑对判断矩阵 A 进行修正。
5.计算综合权重:
将各个层次的权重进行综合,最终计算出每个决策方案的总权重,帮助决策者选择最优方案。
层次分析法的应用场景:
层次分析法广泛应用于管理决策、政策制定、项目选择、风险评估、资源分配等领域。例如,在一个项目选择问题中,可以将项目的经济性、技术可行性、环境影响等作为准则,并对多个备选项目进行评价,最终确定最优方案。
优缺点:
优点:
能够处理复杂决策问题,尤其是当定性和定量因素混合时。
结构清晰,易于理解和应用。
可以在决策过程中充分考虑专家的经验和主观判断。
缺点:
判断矩阵的构建和权重的计算依赖于决策者的主观判断,可能导致偏差。
当问题过于复杂时,构建判断矩阵可能变得非常繁琐。
层次分析法是一种有效的决策工具,特别适用于多准则决策问题。通过将复杂问题分解为多个层次,并通过逐层分析和比较,AHP为决策者提供了科学的决策支持。
第一步:建立层次结构模型
我们将首先定义目标、准则和方案层。目标层是评估各个因素对累产气的影响。准则层将包含你列出的各个可能影响累产气的指标,例如段的厚度、自然伽马、补偿声波等。方案层是具体的数据记录,例如不同井号和段号的数据。
在实际代码中,我们将定义一个层次结构模型,并加载Excel数据。让我们开始吧:
- 加载Excel数据
import pandas as pd
import numpy as np
# 加载Excel数据
file_path = '你的数据文件.xlsx' # 替换为你的Excel文件路径
data = pd.read_excel(file_path)
# 检查数据,确保数据正常加载
print(data.head())
- 定义层次结构模型
在层次分析法中,我们需要确定目标和准则。假设我们关注的目标是“累产气量”,准则是数据中的各个指标。
目标层: 确定哪个因素对累产气影响最大。
准则层: 选择你认为对累产气影响可能最大的指标。
# 选择目标变量和准则变量
target = '...' # 假设这个是目标变量的名称
criteria = [
...
]
- 构建判断矩阵
这一过程通常依赖于专家意见来评估各个准则的重要性。由于直接从数据中得出准确的判断矩阵比较困难,尤其是当准则较多时,我们可以采用以下几种方式:
专家打分法:邀请相关领域的专家根据经验打分,来确定各准则的重要性。
数据相关性分析:使用统计方法,如相关系数分析,来评估各个准则与目标(累产气量)的相关性。
机器学习方法:使用特征重要性分析(如随机森林或XGBoost中的特征重要性)来评估各准则的相对重要性。
使用统计方法来分析各准则对累产气的影响,可以通过计算每个准则与累产气量之间的相关性系数。常用的相关性分析方法有:
皮尔逊相关系数(Pearson Correlation Coefficient):用于衡量两个连续变量之间的线性关系,适用于正态分布的数据。
斯皮尔曼秩相关系数(Spearman Rank Correlation Coefficient):用于衡量两个变量之间的单调关系,适用于非正态分布或有序数据。
偏相关分析(Partial Correlation):用于衡量某个变量在控制其他变量的影响后的相关性。
# 数据预处理:删除缺失值或进行填补
data = data.dropna(subset=[target] + criteria) # 删除包含缺失值的行
# 计算相关性系数
correlation_matrix = data[criteria + [target]].corr(method='pearson') # 皮尔逊相关系数矩阵
# 提取准则与目标之间的相关性
correlations = correlation_matrix[target].drop(target)
# 按相关性绝对值排序
correlations_sorted = correlations.abs().sort_values(ascending=False)
# 输出排序后的相关性
print('准则与累产气量的相关性排序:')
print(correlations_sorted)
计算判断矩阵
# 提取相关性值和准则名称
correlation_values = correlations_series.values
criteria_names = correlations_series.index.tolist()
# 构建判断矩阵
n = len(correlation_values)
judgment_matrix = np.ones((n, n))
# 填充判断矩阵
for i in range(n):
for j in range(n):
if correlation_values[j] != 0:
judgment_matrix[i, j] = correlation_values[i] / correlation_values[j]
else:
judgment_matrix[i, j] = 1
# 打印判断矩阵
print("\n判断矩阵:")
print(judgment_matrix)
- 计算权重
根据判断矩阵,通过特征向量法或其他方法计算每个准则的权重。权重反映了每个准则对累产气影响的相对重要性。
# 计算判断矩阵的归一化矩阵
normalized_matrix = judgment_matrix / judgment_matrix.sum(axis=0)
# 计算权重向量(每行的平均值)
weights = normalized_matrix.mean(axis=1)
# 打印权重向量
print("\n权重向量:")
print(weights)
- 一致性检验
层次分析法要求判断矩阵的一致性,否则结果可能不可靠。需要计算一致性比率(CR):
CR = CI / RI
CI 是一致性指标,CI = (λ_max - n) / (n - 1)
λ_max 是判断矩阵的最大特征值,n 是矩阵的阶数
RI 是随机一致性指标,可以查表获得
如果CR < 0.1,矩阵具有可接受的一致性。
# 计算最大特征值
eigenvalues, _ = np.linalg.eig(judgment_matrix)
lambda_max = np.max(eigenvalues.real)
# 一致性指标 CI
CI = (lambda_max - n) / (n - 1)
# 随机一致性指标 RI
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}
RI = RI_dict.get(n, 1.49) # 默认使用 10 的 RI
# 计算一致性比率 CR
CR = CI / RI
# 打印一致性检验结果
print("\n一致性指标 CI:", CI)
print("随机一致性指标 RI:", RI)
print("一致性比率 CR:", CR)
# 检查一致性
if CR < 0.1:
print("判断矩阵的一致性可以接受")
else:
print("判断矩阵的一致性不可以接受,请检查数据")
- 计算综合得分并排序
将每个方案(样本点)的各项指标值乘以相应的权重,求和得到综合得分。然后按综合得分对方案排序,以判断哪个因素对累产气的影响最大。