天天看点

python实现模糊层次分析法(FAHP)

作者:我不爱机器学习

1 模糊层次分析法简介

AHP通过明确问题目标,建立递阶层次结构模型,形成各级判断矩阵,层次单排序和层次总排序等步骤计算各层次构成要素对总目标的组合权重,从而得到不同可行方案的综合评价值,为选择最优方案提供依据。

层次分析法的关键是建立判断矩阵,其直接影响AHP的效果,但存在以下问题:

  • 当判断矩阵的阶数大于3时,很难保证矩阵一致性。
  • 当判断矩阵不具有一致性时需要对元素进行调整,重新检查,直到满足一致性。
  • 1-9标度法不符合人的思维,不像0.4:0.6更符合人的思维。
  • 一致性判断标准目前还是经验结论,缺乏科学论证。

针对以上缺点,提出了模糊层次分析法。

FAHP分为2类:基于模糊数和基于模糊判断矩阵。本文主要讲解第二种。

FAHP和AHP思路基本一致,但有3点不同:

  • 比较标度法不同,层次采用1-9,模糊层次采用0.1-0.9。
  • 层次通过两两比较得到判断矩阵,模糊层次通过比较得到判断矩阵。
  • 权重求解方法不同。

FAHP和AHP相比具有如下优点:模糊一致矩阵易达到一致性要求,且调整简单。

  • 一致性检验标准更科学可靠,且易于检验。
  • 0.1-0.9标度法更符合人的思维判断方式。
  • 排序计算公式简单。

除了以上标度法,还有0-1标度法、0.1-0.9五标度法、0.1-0.9九标度法。

2 模糊一致判断矩阵

在递阶层次结构模型中,每种具体的影响指标之间相对于与之相关的上一层因素的重要度是不同的。如在不同季节,不同气象要素的影响不同。

模糊层次分析法根据模糊数学中的模糊一致矩阵的定义,将标度法进行改进形成模糊一致判断矩阵。

模糊数学中定义如下:

python实现模糊层次分析法(FAHP)

FAHP根据上述定义,将1-9标度法转换为0.1-0.9五标度法:

python实现模糊层次分析法(FAHP)

模糊一致判断矩阵表示针对上一层元素,本层与之有关的各元素之间的相对重要程度的比较。假设上一层元素与下一层元素相关联,则可得到如下判断列表:

python实现模糊层次分析法(FAHP)

数值表示元素和元素相对于元素进行比较时,元素和元素重要的程度,即可得到模糊一致判断矩阵:

python实现模糊层次分析法(FAHP)

模糊矩阵具有如下性质:

  • A的第i行和第i列元素之和为n。
  • A的转置=A的余矩阵,且两者相等。
  • 从A中划掉任意一行和其对应的列后所得的子矩阵仍然时模糊一致矩阵。
  • A是模糊一致矩阵的充要条件是任意两行的对应元素之差为常数。

模糊判断矩阵一致性调整步骤:

  • 首先选择相对重要性权重判断比较有把握的一行作为基准行
  • 然后其他的各行分别减去基准行,若对应差值不完全相等,则调整该行,使差值全部相等为止。

3 权重求解方法

  • 方根法

设模糊一致判断矩阵:

python实现模糊层次分析法(FAHP)

则排序值 为:

python实现模糊层次分析法(FAHP)
python实现模糊层次分析法(FAHP)

该方法的结果同AHP的最大特征根法。

  • 行和归一排序法
python实现模糊层次分析法(FAHP)
python实现模糊层次分析法(FAHP)
python实现模糊层次分析法(FAHP)

对R归一化,结果同:

python实现模糊层次分析法(FAHP)
python实现模糊层次分析法(FAHP)
  • 新型权重
python实现模糊层次分析法(FAHP)

a = (n-1)/2。

4 案列

对2001和2002年的多个预测方法的电量预测值进行决策(类似加权、集成)。

1)建立层次结构模型

python实现模糊层次分析法(FAHP)

2)确定标准层对目标层的判断矩阵

由于电量具有时间规律,因此历史拟合度权重大于其他因素。

python实现模糊层次分析法(FAHP)

3)确定历史拟合度判断矩阵

根据模型预测值,看那个方法更符合趋势或者误差更小,那权重就大一些。

python实现模糊层次分析法(FAHP)

4)确定指标层对标准层的判断矩阵

以经济发展因素为例,GDP影响最大,用电方式调整影响最小。

python实现模糊层次分析法(FAHP)

5)确定方案层对目标层的判断矩阵

以GDP对不同预测方法的判断矩阵为例:

python实现模糊层次分析法(FAHP)

对判断矩阵进行权重计算并组合,得到下表:

python实现模糊层次分析法(FAHP)

由表可知,FAHP预测优于单一方法。

5 python 实现

这里只写了权重的计算:

# 方根法
def root_method(A):
    n = A.shape[0]
    R = np.prod(A,axis=1)**(1/n)
    W = R/R.sum()
    return W

# 行和归一化排序法
def row_sum(A):
    n = A.shape[0]
    r = np.sum(A,axis=1)
    a = 2*(n-1)
    R = np.zeros_like(A)
    for i in range(n):
        for j in range(n):
            R[i][j] = (r[i]-r[j])/a+0.5
    R = np.sum(A,axis=1)-0.5
    W = R/R.sum()
    return W

def row_sum2(A):
    n = A.shape[0]
    alpha=1/np.square(n-1)
    beta=(n**2/2-2*n+1)/(n*(n-1)**2)
    W = alpha*(np.sum(A,axis=1))+beta
    W = W/W.sum()
    return W

# 新型权重
def new_method(A):
    n = A.shape[0]
    a = (n-1)/2
    W = 1/n-1/(2*a)+1/(n*a)*A.sum(axis=1)
    W = W/W.sum()
    return W
           

参考:层次分析法在电力负荷预测中的应用研究-赵云飞.