层次分析法确定权重过程方法

Dear-linko 253 4 本文共2679个字

前言

层次分析法(简称AHP)建模比赛中最基础的模型之一,其主要用于解决评价类问题(例如:选择哪种方案最好、哪位运动员或者员工表现的更优秀)

原理

层次分析法根据问题的性质和要达到的总目标,将问题分解为不同的组成因素,并按照因素间的相互关联影响以及隶属关系将因素按不同层次聚集组合,形成一个多层次的分析结构模型,从而最终使问题归结为最低层(供决策的方案、措施等)相对于最高层(总目标)的相对重要权值的确定或相对优劣次序的排定。

确定权重过程方法

    第一步:分析系统中各因素之间的关系,建立系统的递阶层次结构
    第二步:对于同一层次的各元素关于上一层次中某一准则的重要性进行两两比较,构造两两比较矩阵(判断矩阵)
    第三步:由判断矩阵计算被比较元素对于该准则的相对权重,并进行一致性检验(检验通过权重才能用)
一致矩阵不需要进行一致性检验,只有非一致矩阵的判断矩阵才需要进行一致性检验
    第四步:根据权重矩阵计算得分,并进行排序

一致矩阵与正互反矩阵

正互反矩阵

若矩阵中每个元素\(a_{ij}>0\text{且}a_{ij}\times a_{ji}=1\),则我们称其为正互反矩阵

一致矩阵

若正互反矩阵\(a_{ij}\times a_{jk}=a_{ik}\),则我们称其为一致矩阵

在层次分析法中,我们构造的判断矩阵均是正互反矩阵。[aru_34]

一致性检验的原理及步骤

    原理:检验我们构造的判断矩阵和一致矩阵是否有太大的差别
    第一步:计算判断矩阵的一致性指标CI
    $$
    CI=\frac{\lambda _{\max}-n}{n}
    $$
    第二步:查找对应的平均随机一致性指标RI
    计算一致性比例CR
    $$
    CR=\frac{CI}{RI}
    $$

如果CR<0.1,  则可认为判断矩阵的一致性可以接受;否则需要对判断矩阵进行修正

那么如果CR>0.1怎么修正呢?那当然是往一致矩阵方向进行调整。[aru_7]

算术平均法求权重

    第一步:将判断矩阵按照列归一化(每一个元素除以其所在列的和)
    第二步:将归一化的各列相加(按行求和)
    第三步:将相加后得到的向量中每个元素除以n即可得到权重向量
import numpy as np

R_I = {1: 0, 2: 0, 3: 0.58, 4: 0.90, 5: 1.12, 6: 1.24, 7: 1.32, 8: 1.41, 9: 1.45, 10: 1.49}


def main(a):
    a_shape = a.shape[1]
    tzz, tzxl = np.linalg.eig(a)
    tzz_max = np.max(tzz)
    C_I = (tzz_max - a_shape) / (a_shape - 1)
    C_R = C_I / R_I[a_shape]
    if C_R < 0.1:
        print('通过一致性检验')
        a_sum = a.sum(axis=0)  # 判断矩阵按列求和
        b = a / a_sum  # 判断矩阵的列归一化
        c = b.sum(axis=1)  # 归一化各列相加
        suanshu_a = c / a_shape  # 求权重向量
        print('算术平均值法求权重的结果为:', suanshu_a)
    else:
        print('无法验证一致性')


if __name__ == '__main__':
    a = np.array([[1, 1 / 2, 4, 3, 3], [2, 1, 7, 5, 5], [1 / 4, 1 / 7, 1, 1 / 2, 1 / 3], [1 / 3, 1 / 5, 2, 1, 1],
                  [1 / 3, 1 / 5, 3, 1, 1]])
    main(a)

几何平均法求权重

    第一步:将判断矩阵的元素按照行相乘得到一个新的列向量
    第二步:将新的向量的每个分量开n次方
    第三步:对该列向量进行归一化即可得到权重向量
import numpy as np

R_I = {1: 0, 2: 0, 3: 0.58, 4: 0.90, 5: 1.12, 6: 1.24, 7: 1.32, 8: 1.41, 9: 1.45, 10: 1.49}


def main(a):
    a_shape = a.shape[1]
    tzz, tzxl = np.linalg.eig(a)
    tzz_max = np.max(tzz)
    C_I = (tzz_max - a_shape) / (a_shape - 1)
    C_R = C_I / R_I[a_shape]
    if C_R < 0.1:
        print('通过一致性检验')
        x_prod = np.prod(a, axis=1) ** (1 / a_shape)  # 对判断矩阵列求和及开n次方
        jihe_a = x_prod / x_prod.sum()  # 归一化的权重向量
        print('几何平均值法求权重的结果为:', jihe_a)
    else:
        print('无法验证一致性')


if __name__ == '__main__':
    a = np.array([[1, 1 / 2, 4, 3, 3], [2, 1, 7, 5, 5], [1 / 4, 1 / 7, 1, 1 / 2, 1 / 3], [1 / 3, 1 / 5, 2, 1, 1],
                  [1 / 3, 1 / 5, 3, 1, 1]])
    main(a)

特征值法求权重

    第一步:求出判断矩阵的最大特征值以及其对应的特征向量
    第二步:对求出的特征向量进行归一化即可得到我们的权重
import numpy as np

R_I = {1: 0, 2: 0, 3: 0.58, 4: 0.90, 5: 1.12, 6: 1.24, 7: 1.32, 8: 1.41, 9: 1.45, 10: 1.49}


def main(a):
    a_shape = a.shape[1]
    tzz, tzxl = np.linalg.eig(a)
    tzz_max = np.max(tzz)
    C_I = (tzz_max - a_shape) / (a_shape - 1)
    C_R = C_I / R_I[a_shape]
    if C_R < 0.1:
        print('通过一致性检验')
        tzxl_max = tzxl[:, 0]
        tzxl_max_sum = np.sum(tzxl_max)
        qzxl = tzxl_max / tzxl_max_sum
        print('一致性通过检验,特征值法求权重的结果为:', qzxl)
    else:
        print('无法验证一致性')


if __name__ == '__main__':
    a = np.array([[1, 1 / 2, 4, 3, 3], [2, 1, 7, 5, 5], [1 / 4, 1 / 7, 1, 1 / 2, 1 / 3], [1 / 3, 1 / 5, 2, 1, 1],
                  [1 / 3, 1 / 5, 3, 1, 1]])
    main(a)

层次分析法的局限性

评价的决策层不能太多,太多的话n会很大,判断矩阵和一致矩阵差异可能会很大,一般n小于15。[aru_34]

后记

在利用层次分析法解决实际问题时,都是采用其中某一种方法求权重,而不同的计算方法可能会导致结果有所偏差。为了保证结果的稳健性,建议采用了三种方法分别求出了权重后计算平均值,这样避免了采用单一方法所产生的偏差,得出的结论将更全面、更有效。

没有了,已经是最新文章
发表评论 取消回复
表情 图片 链接 代码

  1. 南小易
    南小易 Lv 1

    感谢分享![aru_53]

  2. 地诶的人
    地诶的人 Lv 1

    亲亲,满满的干货哦,爱你?

  3. 易先生
    易先生 Lv 1

    [aru_17]猜猜我想说什么

分享