机器学习——层次分析算法


参考

理论

1、说明:

为了使得平衡计分卡变得更加系统,并完善其理论的科学依据,因此使用了层次分析法对其进行指标权重的分配

2、理论依据:

层次分析法是一种带有主观色彩的多方案多目标的实用性决策方式,是一种定性与定量相结合的决策分析方法。利用决策者的经验判断各衡量指标之间能否实现的标准之间的相对重要程度,并合理给出每个决策方案的各个衡量指标的权重,利用权重求出各个方案之间的优劣次序,有利于后续的定量分析。
层次分析法能够较为有效地将定性的课题,转化为能够利用定量评价指标进行计算从而客观判断出不同指标之间重要程度以及模型的优劣的课题,具有非常广泛的实用性。

3、优点

层次分析法一共有三大优点:

系统性:将对象视作系统,按照分解、比较、判断、综合的思维方式进行决策。成为除了机理分析和统计分析方法之后的又一系统分析的重要工具

实用性:成功的将定性和定量二者相结合从而成功解决了很多之前最优化技术理论所不能够解决的实际问题,而且这种模型具有一定的主观性,因此能够很好的通过调整决策系数的权重来修改模型的使用范围,使得模型能够更加契合现实意义,从而不会出现纯理论而导致结论难以通过现实解释的情况

简洁性:层次分析方法的计算理论简单,结果也非常明确,使人在看到决策矩阵之后就能较好的理解决策者的想法。而且构建的模型层级和各个变量之间的重要程度一清二楚,并且模型可以通过查阅资料或者专家评判的方式对决策矩阵的权重进行改进,模型的可修改性很强。

4、缺点

方案的优劣度:只能够从所有原有的方案中挑选出其中最好的一个方案,而不能获得真正意义上的最优解,例如决策者本身的能力不够,其所列举的所有方案其实都不好,但是也只能选出这些所有方案中相对最好的那个方案,但决策者自己并不能够意识到这个“相对最优”的方案在实际状况中真正的优劣程度。

当然,上面的那个问题可以通过查阅文献或者请更加专业的人士构建更加合理的矩阵来解决。

要素的影响:当决策变量较多的时候,难以对其进行两两比较来确定它们之间的重要程度,而且决策变量过多还会导致无法通过一致性检验,因此最好的办法是对要素的变量进行控制(理论上推荐是将要素的变量控制在7个及以内,因此对于变量较多的状况并不友好)。另外层次分析法并没有将要素之间的相关性关系算入其中,这是其需要改进的一个比较重要的点。

5、总结

整体说下来,层次分析法可以解决难以量化的问题,并给出相对合理的量化解释。但是这种量化解释仍然具有比较强的主观性。而且对于之前没有遇到过的问题,在构建权重矩阵的时候会出现较大的偏差,更加难以给出合理的解释,最终的结果也难以被所有人所接受。

6、构建方式以及一致性检验

层次分析法系统构建模型的方式,大体可以分为四个步骤:

1)建立层次结构模型
将决策的目标、决策使用的准则和决策对象按照他们之间的相互关系分为最高层、中间层和最低层。通过这样的方式来实现系统性的决策方式。

AHP依据层级之间的关系可将层级模型分为三类:

完全相关性结构:上层的每一个因素都和下层全连接
完全独立性结构:上层每一因素与下层唯一连接
混合型结构:上面两种的混合结构,也就是组连接的方式

一般选用的为完全独立性结构。

对于相邻的两层,将相对较高的层称为目标层,而相对较低的层次称为因素层。

最高层:决策的目的、需要解决的最终问题
中间层:需要考虑的因素(主因素和考虑的因素)、决策的准则
最底层:决策时候的备选方案,同时也可能是中间层的子因子

2)构造判断一致性矩阵(这个也是最关键的步骤)

确定各层次因素之间的权重的时候,如果只是定性的结果是不能够被所有的人接受的,因此需要提出使用一致性矩阵的方式:

不把所有因素放在一起比较,而是两两相互比较

采用相对尺度,尽量减少由于性质不同的诸因素的相互比较较为困难的问题,以提高精确度
在这里插入图片描述

3)每个单层的排序以及其一致性检验

· 判断矩阵最大特征根λmax的特征向量是否满足一致性,如果满足就将其经过归一化的处理(这个地方还有个化简计算的方法)之后记为W。

· 将与W同层次元素对选定的某上层因素进行重要性排序(如果是混合连接的话就是组内排序),最终获得相对重要性的排序权值,这一过程被称之为层次单排序。

· 为衡量CI的大小,引入随机一致性指标,而且这个指标所构成的矩阵是唯一设定的。最终判断能否成功通过一致性检验。
在这里插入图片描述

定义CR = CI / RI ,一般情况下认为一致性比率CR < 0.1 时,认为原假设的矩阵的重要程度假设不在容许的范围之内,需要重新进行修改矩阵中的某些权重。
但当通过了一致性检验,就可以将其归一化,并将获得的特征向量作为权向量。
在这里插入图片描述
4)层次总排序以及其一致性检验

层间排序结束之后,对选定层次的所有因素相对于最终目标的重要性来进行的排序被称为层次总排序,而且这个过程是由上到下依次进行的。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
7、算法总结
在这里插入图片描述

代码实现

import numpy as np
class AHP:
    """
    相关信息的传入和准备
    """

    def __init__(self, array):
        ## 记录矩阵相关信息
        self.array = array
        ## 记录矩阵大小
        self.n = array.shape[0]
        # 初始化RI值,用于一致性检验
        self.RI_list = [0, 0, 0.52, 0.89, 1.12, 1.26, 1.36, 1.41, 1.46, 1.49, 1.52, 1.54, 1.56, 1.58,
                        1.59]
        # 矩阵的特征值和特征向量
        self.eig_val, self.eig_vector = np.linalg.eig(self.array)
        # 矩阵的最大特征值
        self.max_eig_val = np.max(self.eig_val)
        # 矩阵最大特征值对应的特征向量
        self.max_eig_vector = self.eig_vector[:, np.argmax(self.eig_val)].real
        # 矩阵的一致性指标CI
        self.CI_val = (self.max_eig_val - self.n) / (self.n - 1)
        # 矩阵的一致性比例CR
        self.CR_val = self.CI_val / (self.RI_list[self.n - 1])

    """
    一致性判断
    """

    def test_consist(self):
        # 打印矩阵的一致性指标CI和一致性比例CR
        print("判断矩阵的CI值为:" + str(self.CI_val))
        print("判断矩阵的CR值为:" + str(self.CR_val))
        # 进行一致性检验判断
        if self.n == 2:  # 当只有两个子因素的情况
            print("仅包含两个子因素,不存在一致性问题")
        else:
            if self.CR_val < 0.1:  # CR值小于0.1,可以通过一致性检验
                print("判断矩阵的CR值为" + str(self.CR_val) + ",通过一致性检验")
                return True
            else:  # CR值大于0.1, 一致性检验不通过
                print("判断矩阵的CR值为" + str(self.CR_val) + "未通过一致性检验")
                return False

    """
    算术平均法求权重
    """

    def cal_weight_by_arithmetic_method(self):
        # 求矩阵的每列的和
        col_sum = np.sum(self.array, axis=0)
        # 将判断矩阵按照列归一化
        array_normed = self.array / col_sum
        # 计算权重向量
        array_weight = np.sum(array_normed, axis=1) / self.n
        # 打印权重向量
        print("算术平均法计算得到的权重向量为:\n", array_weight)
        # 返回权重向量的值
        return array_weight

    """
    几何平均法求权重
    """

    def cal_weight__by_geometric_method(self):
        # 求矩阵的每列的积
        col_product = np.product(self.array, axis=0)
        # 将得到的积向量的每个分量进行开n次方
        array_power = np.power(col_product, 1 / self.n)
        # 将列向量归一化
        array_weight = array_power / np.sum(array_power)
        # 打印权重向量
        print("几何平均法计算得到的权重向量为:\n", array_weight)
        # 返回权重向量的值
        return array_weight

    """
    特征值法求权重
    """

    def cal_weight__by_eigenvalue_method(self):
        # 将矩阵最大特征值对应的特征向量进行归一化处理就得到了权重
        array_weight = self.max_eig_vector / np.sum(self.max_eig_vector)
        # 打印权重向量
        print("特征值法计算得到的权重向量为:\n", array_weight)
        # 返回权重向量的值
        return array_weight
if __name__ == "__main__":
    # 给出判断矩阵
    b = np.array([[1, 1 / 3, 1 / 8], [3, 1, 1 / 3], [8, 3, 1]])

    # 算术平均法求权重
    weight1 = AHP(b).cal_weight_by_arithmetic_method()
    # 几何平均法求权重
    weight2 = AHP(b).cal_weight__by_geometric_method()
    # 特征值法求权重
    weight3 = AHP(b).cal_weight__by_eigenvalue_method()
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值