目录
1.算法流程简介
2.算法核心代码
3.算法效果展示
1.算法流程简介
"""
AHP:层次分析法,层次分析法还是比较偏向于主观的判断的,所以在建模的时候尽可能不要去使用层次分析法
不过在某些创新的评价方法上,也是能够运用层次分析使得评价变得全面一些,有可能险中求胜,获得评委的青睐的
"""
具体流程如下:
#1.首先进行预备信息的求解便于一致性检验
#2.进行一致性检验,判断是否可以使用层次分析法
#3.求解权重的三种方法(算术平均值法,几何平均值法,特征向量法)
2.算法核心代码
"""
AHP:层次分析法,层次分析法还是比较偏向于主观的判断的,所以在建模的时候尽可能不要去使用层次分析法
不过在某些创新的评价方法上,也是能够运用层次分析使得评价变得全面一些,有可能险中求胜,获得评委的青睐的
"""
import numpy as np
class AHP:
#1.首先进行预备信息的求解便于一致性检验def __init__(self,cmatrix):self.arr=cmatrix#导入比较矩阵#获取比较矩阵的相关数据self.n=cmatrix.shape[0]#比较矩阵的大小#设置RI便于一致性检验self.RI= [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]#求解特征值和特征向量np.linalg.eig()会一起返回self.eig_val, self.eig_vector = np.linalg.eig(self.arr)#求解矩阵的最大特征值self.max_eig_val = np.max(self.eig_val)#矩阵最大特征值对应的特征向量self.max_eig_vector = self.eig_vector[:, np.argmax(self.eig_val)].real#矩阵的一致性指标CIself.CI_val = (self.max_eig_val - self.n) / (self.n - 1)#矩阵的一致性比例CRself.CR_val = self.CI_val / (self.RI[self.n - 1])
#2.进行一致性检验,判断是否可以使用层次分析法def consist_test(self):#一致性指标CIprint("比较矩阵的CI值为:",str(self.CI_val))#一致性指标CRprint("比较矩阵的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),"<0.1,通过一致性检验!")return Trueelse:print("比较矩阵CR值为:",str(self.CR_val),">0.1,未通过一致性检验,不能使用层次分析法!")return False
#3.求解权重的三种方法:
#1.算术平均法def Arithmetic_averaging_method(self):#求每一列的和sum_col=np.sum(self.arr,axis=0)#归一化处理array_std=self.arr/sum_col#计算权重向量weight_Arithmetic_averaging=np.sum(array_std,axis=1)/self.nprint("算术平均法求得的权重为:",weight_Arithmetic_averaging)return weight_Arithmetic_averaging#2.几何平均法def Geometric_averaging_method(self):# 求矩阵的每列的积col_plus = np.product(self.arr, axis=0)# 将得到的积向量的每个分量进行开n次方array_power = np.power(col_plus, 1 / self.n)# 将列向量归一化weight_Geometric_averaging = array_power / np.sum(array_power)# 打印权重向量print("几何平均法求得的权重为:", weight_Geometric_averaging)# 返回权重向量的值return weight_Geometric_averaging#3.特征值权重法def Eigenvalue_weighting_method(self):# 将矩阵最大特征值对应的特征向量进行归一化处理就得到了权重weight_Eigenvalue_weighting = self.max_eig_vector / np.sum(self.max_eig_vector)# 打印权重向量print("特征值权重法法求得的权重为:", weight_Eigenvalue_weighting)# 返回权重向量的值return weight_Eigenvalue_weightingdef test_run_demo():#comparsion_matrix可以随意修改comparsion_matrix=np.array([[1,1/4,1/9],[4,1,1/2],[9, 2, 1]])weight1 = AHP(comparsion_matrix).Arithmetic_averaging_method()weight2 = AHP(comparsion_matrix).Geometric_averaging_method()weight3 = AHP(comparsion_matrix).Eigenvalue_weighting_method()#运行区域:
test_run_demo()
3.算法效果展示
算术平均法求得的权重为: [0.07243906 0.30125047 0.62631047]
几何平均法求得的权重为: [0.7374984 0.17727613 0.08522547]
特征值权重法法求得的权重为: [0.07239208 0.30116321 0.62644471]