评价决策类-层次分析法

admin2024-05-15  1

师从江北

问题引出

评价决策类-层次分析法,第1张

归一化处理:指标的数组[a b c]归一化处理得到[a/(a+b+c),b/(a+b+c),c/(a+b+c)]

评价决策类-层次分析法,第2张

因为每个指标的重要性不同,所以要加上一个权重

评价决策类-层次分析法,第3张

如何科学的确定权重,就要用到层次分析法(AHP)

模型原理

评价决策类-层次分析法,第4张

建立递阶层次结构模型

评价决策类-层次分析法,第5张

构造出各层次中的所有判断矩阵

评价决策类-层次分析法,第6张

构造判断矩阵

评价决策类-层次分析法,第7张

评价决策类-层次分析法,第8张

因两两比较的过程中忽略了其他因素,导致最后的结果可能出现矛盾

所以需要一致性检验

一致性检验

评价决策类-层次分析法,第9张

一致性检验的证明过程

评价决策类-层次分析法,第10张

一致性检验的步骤

评价决策类-层次分析法,第11张

回到最初问题

评价决策类-层次分析法,第12张

求权重

算术平均法求权重

评价决策类-层次分析法,第13张

几何平均法求权重

评价决策类-层次分析法,第14张

特征值法求权重

评价决策类-层次分析法,第15张

求评分

评价决策类-层次分析法,第16张

过程总结

构造判断矩阵->进行一致性检验->求权重 

Python代码实现

Numpy是Python中用于科学计算和数值操作的基础库,提供了很多高性能的多维数组对象

Pandas是用来提供高性能易于使用的数据结构和数据分析工具所用的库

Matplotib是创建可视化的库,即用来绘图的

一致性检验

定义矩阵A,np.array是numpy库中的一个函数,用于创建数组,它将输入的对象(如列表,元组,其他数组等)转化为Numpy数组
"""
A=np.array([[1,2,3,5],[1/2,1,1/2,2],[1/3,2,1,2],[1/5,1/2,1/2,1]])

"""
求最大特征值(Max_eig)以及对应的特征向量(eig_vec)
np.linalg.eig是Numpy库中的一个函数,用于计算方阵的特征值和特征向量
"""
eig_val,eig_vec=np.linalg.eig(A)
Max_eig=max(eig_val)

"""
获取A的行为0,获取列为1,shape是获取形状信息
"""
n=A.shape[0]

"""
注:这里的RI最多支持n=15
这里n=2时一定是一致矩阵,所以CI=0,我们为了避免分母为0,将这里的第二个元素改为很接近0的正数
"""
CI=(Max_eig-n)/(n-1)
RI=[0,0.0001,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]

CR=CI/RI[n-1]

print('一致性指标CI=',CI)
print('一致性比例CR=',CR)

if CR<0.10:
    print('因为CR<0.10,所以该判断矩阵A的一致性可以接受!')
else:
    print('因为CR>0.10,所以该判断矩阵A的一致性不可以接受!')

算术平均法求权重

import numpy as np

A=np.array([[1,2,3,5],[1/2,1,1/2,2],[1/3,2,1,2],[1/5,1/2,1/2,1]])

"""
计算每列的和
np.sum函数可以计算一维数组中所有元素的总和
还可以通过指定axis参数来计算多维数组的某个维度上的元素总和,例如,在二维数组中,axis=0表示按列计算总和,axis=1表示行计算总和
"""
Asum=np.sum(A,axis=0)

#获取A的行
n=A.shape[0]

"""
归一化,二维数组除以一维数组,会自动将一维数组扩展为与二维数组相同的形状,然后进行逐元素的除法运算
"""
Stand_A=A/Asum

"""
各列相加到同一行
"""
Asumr=np.sum(Stand_A,axis=1)

"""
计算权重向量
"""
weights=Asumr/n

print(weights)

几何平均法求权重

import numpy as np

A=np.array([[1,2,3,5],[1/2,1,1/2,2],[1/3,2,1,2],[1/5,1/2,1/2,1]])

#获取A的行
n=A.shape[0]

"""
将A中每一行元素相乘得到一列向量
np.prod函数可以计算一维数组中所有元素的乘积
还可以通过指定axis参数来计算多维数组的某个维度上的元素总和,例如,在二维数组中,axis=0表示按列计算总和,axis=1表示行计
"""
prod_A=np.prod(A,axis=1)

"""
将新的向量的每个向量开n次方等价求1/n次方
np.power是Numpy库中的一个函数,用于对数组中元素进行 幂运算
,可以使用np.power(a,b)对数组a中的每一个元素都按照b指数进行运算
"""
prod_n_A=np.power(prod_A,1/n)

#归一化处理
re_prod_A=prod_n_A/np.sum(prod_n_A)

#展示权重结果
print(re_prod_A)

特征值法求权重

import numpy as np

A=np.array([[1,2,3,5],[1/2,1,1/2,2],[1/3,2,1,2],[1/5,1/2,1/2,1]])

#获取A的行
n=A.shape[0]

#求出特征值和特征向量
eig_values,eig_vectors=np.linalg.eig(A)

#找出最大特征值的索引,np.argmax是Numpy库中的一个函数,用于返回数组中最大值的索引
max_index=np.argmax(eig_values)

#找出相应的特征向量
max_vector=eig_vectors[:,max_index]

#找到对应的特征向量
weights=max_vector/np.sum(max_vector)

#输出权重
print(weights)

若有侵权,请联系作者

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明原文出处。如若内容造成侵权/违法违规/事实不符,请联系SD编程学习网:675289112@qq.com进行投诉反馈,一经查实,立即删除!