美文网首页topsis
层次分析法(AHP)——算数平均值法、几何平均值法、特征值法(P

层次分析法(AHP)——算数平均值法、几何平均值法、特征值法(P

作者: XHHP | 来源:发表于2019-08-05 23:22 被阅读0次

    (1)、算数平均值法求权重

    步骤:

    1. 判断矩阵按列求和,得到新矩阵a_axis_0_sum
    2. 把判断矩阵中的每一个数都除以列和,得到新的矩阵b
    3. 计算新矩阵b行和,得到新矩阵b_axis_1_sum
    4. 将b_axis_1_sum每一个值除以总和,获得权重W
    5. 求解最大特征值
    6. 计算C_R判断矩阵的一致性,如果检验通过就输出结果
    # -*- coding: utf-8 -*-
    """
    Created on Thu Jul 25 21:01:54 2019
    
    @author: lenovo
    """
    
    import numpy as np
    
    #  建立平均随机一致性指标R.I
    RI_dict = {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 get_w(array):
        # 1、计算出阶数 看这个数组是几维的 也就是后面对应字典查询!
        row = array.shape[0]  
        # 2、按列求和
        a_axis_0_sum = array.sum(axis=0) 
        # 3、得到新的矩阵b 就是把每一个数都除以列和 
        b = array / a_axis_0_sum  
        # 4、计算新矩阵b行和
        b_axis_1_sum = b.sum(axis=1)  
        # 5、将b_axis_1_sum每一个值除以总和
        W = b_axis_1_sum / sum(b_axis_1_sum)
        # 6、将原始矩阵乘以W
        a_W = np.dot(array, W)
        # 7、求解最大特征值 
        lambda_max = 0
        for i in range(len(a_W)):
            lambda_max += (a_W[i] / W[i])
        lambda_max = lambda_max / len(a_W)      #求最大特征值
        # 8、检验判断矩阵的一致性
        C_I = (lambda_max - row) / (row - 1)
        R_I = RI_dict[row] 
        C_R = C_I / R_I 
        if C_R < 0.1:
            print('矩阵 %s 一致性检验通过' % (array))
            print('判断矩阵对应的指标的权重为:%s' % W)
            print('判断矩阵对应的最大特征值为 %.2f' % lambda_max)
            print('大功告成!!!')
            return W
        else:
            print('矩阵 %s 一致性检验未通过,需要重新进行调整判断矩阵' % (array))
        
    def main(array):
        if type(array) is np.ndarray:
            return get_w(array)
        else:
            print('请输入正确的numpy对象')
    
    
    if __name__ == '__main__':
        a = np.array([[1, 1 / 3, 1 / 8], [3, 1, 1 / 3], [8, 3, 1]])
    #    b = np.array([[1, 3, 6], [1 / 3, 1, 4], [1 / 5, 1 / 2, 1]])
    #    c = np.array([[1, 1, 3], [1, 1, 3], [1 / 3, 1 / 3, 1]])
    #    d = np.array([[1, 3, 4], [1 / 3, 1, 1], [1 / 4, 1, 1]])
    #    e = np.array([[1, 2, 7, 5, 5], [1 / 2, 1, 4, 3, 3], [1 / 7, 1 / 4, 1, 1 / 2, 1 / 3], [1 / 5, 1 / 3, 2, 1, 1], [1 / 5, 1 / 3, 3, 1, 1]])
    #    f = np.array([[1, 4, 1 / 2], [1 / 4, 1, 1 / 4], [2, 4, 1]])
        
        main(a)
    #    main(b)
    #    main(c)
    #    main(d)
    #    main(e)
    #    main(f)
    
    

    (2)、几何平均值法求权重

    步骤:

    1. 将判断矩阵array的元素按照行相乘得到一个新的列向量
    2. 将新的向量的每个分量开n次方
    3. 对列向量求和
    4. 归一化处理,得到权重
    5. 求解最大特征值
    6. 计算C_R判断矩阵的一致性,如果检验通过就输出结果
    # -*- coding: utf-8 -*-
    """
    Created on Thu Jul 25 21:01:54 2019
    
    @author: lenovo
    """
    
    import numpy as np
    
    #  建立平均随机一致性指标R.I
    RI_dict = {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 get_w(array):
        row = array.shape[0]    #计算个数
        x_list = np.prod(array,axis = 1)        #axis=1,将array的元素按照行相乘得到一个新的列向量
        y_list = np.power(x_list, 1/np.size(array,1))   #将新的向量的每个分量开n次方
        y_sum = y_list.sum(axis=0)      #对列向量求和
        answer_sum = y_list/y_sum       #归一化处理,得到权重
        a,b=np.linalg.eig(array)        #a是特征值数组,b是特征值向量
        lambda_max=np.max(a)            #求最大特征值
        # 8、检验判断矩阵的一致性
        C_I = (lambda_max - row) / (row - 1)
        R_I = RI_dict[row]
        C_R = C_I / R_I 
        if C_R < 0.1:
            print('矩阵 %s 一致性检验通过' % (array))
            print('判断矩阵对应的指标的权重为:%s' % answer_sum)
            print('判断矩阵对应的最大特征值为 %.2f' % lambda_max)
            print('大功告成!!!')
            return answer_sum
        else:
            print('矩阵 %s 一致性检验未通过,需要重新进行调整判断矩阵' % (array))
        
    def main(array):
        if type(array) is np.ndarray:
            return get_w(array)
        else:
            print('请输入正确的numpy对象')
    
    
    if __name__ == '__main__':
        # 由于地方问题,矩阵我就写成一行了
        # 检验以下判断矩阵的一致性并输出权重
        a = np.array([[1,2,5], [1/2,1,2], [1/5,1/2,1]])
        b = np.array([[1, 3, 6], [1 / 3, 1, 4], [1 / 5, 1 / 2, 1]])
        c = np.array([[1, 1, 3], [1, 1, 3], [1 / 3, 1 / 3, 1]])
        d = np.array([[1, 3, 4], [1 / 3, 1, 1], [1 / 4, 1, 1]])
        e = np.array([[1, 2, 7, 5, 5], [1 / 2, 1, 4, 3, 3], [1 / 7, 1 / 4, 1, 1 / 2, 1 / 3], [1 / 5, 1 / 3, 2, 1, 1], [1 / 5, 1 / 3, 3, 1, 1]])
        f = np.array([[1, 4, 1 / 2], [1 / 4, 1, 1 / 4], [2, 4, 1]])
        
        main(a)
    #    main(b)
    #    main(c)
    #    main(d)
    #    main(e)
    #    main(f)
    
    
    

    (2)、特征值法

    步骤:

    1. 求出判断矩阵array的最大特征值以及特征向量
    2. 求解最大特征值
    3. 计算C_R判断矩阵的一致性,如果检验通过就继续下一步
    4. 对求出的特征向量进行归一化处理,即可得到权重
    # -*- coding: utf-8 -*-
    """
    Created on Thu Jul 25 20:42:58 2019
    
    @author: lenovo
    """
    
    import numpy as np
    
    #  建立平均随机一致性指标R.I
    RI_dict = {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 get_w(array):
        row = array.shape[0]    #计算个数
        a,b=np.linalg.eig(array)        #a是特征值数组,b是特征值矩阵
        lambda_max=np.max(a)            #求最大特征值
         #8、检验判断矩阵的一致性
        C_I = (lambda_max - row) / (row - 1)
        R_I = RI_dict[row]
        C_R = C_I / R_I 
        if C_R < 0.1:
            x = b[:,0].sum(axis=0)      #对列向量求和,对于第一列求和
            y = b[:,0]/x            #第一列进行归一化处理
            print('矩阵 %s 一致性检验通过' % (array))
            print('判断矩阵对应的指标的权重为:%s' % y)
            print('判断矩阵对应的最大特征值为 %.2f' % lambda_max)
            print('大功告成!!!')
            return y
        else:
            print('矩阵 %s 一致性检验未通过,需要重新进行调整判断矩阵' % (array))
        
    def main(array):
        if type(array) is np.ndarray:
            return get_w(array)
        else:
            print('请输入正确的numpy对象')
    
    
    if __name__ == '__main__':
        # 由于地方问题,矩阵我就写成一行了
        # 检验以下判断矩阵的一致性并输出权重
        a = np.array([[1,2,5], [1/2,1,2], [1/5,1/2,1]])
    #    b = np.array([[1, 3, 6], [1 / 3, 1, 4], [1 / 5, 1 / 2, 1]])
    #    c = np.array([[1, 1, 3], [1, 1, 3], [1 / 3, 1 / 3, 1]])
    #    d = np.array([[1, 3, 4], [1 / 3, 1, 1], [1 / 4, 1, 1]])
    #    e = np.array([[1, 2, 7, 5, 5], [1 / 2, 1, 4, 3, 3], [1 / 7, 1 / 4, 1, 1 / 2, 1 / 3], [1 / 5, 1 / 3, 2, 1, 1], [1 / 5, 1 / 3, 3, 1, 1]])
    #    f = np.array([[1, 4, 1 / 2], [1 / 4, 1, 1 / 4], [2, 4, 1]])
        
        main(a)
    #    main(b)
    #    main(c)
    #    main(d)
    #    main(e)
    #    main(f)
    
    
    

    相关文章

      网友评论

        本文标题:层次分析法(AHP)——算数平均值法、几何平均值法、特征值法(P

        本文链接:https://www.haomeiwen.com/subject/gthbdctx.html