赞
踩
目录
- """
- AHP:层次分析法,层次分析法还是比较偏向于主观的判断的,所以在建模的时候尽可能不要去使用层次分析法
- 不过在某些创新的评价方法上,也是能够运用层次分析使得评价变得全面一些,有可能险中求胜,获得评委的青睐的
- """
- 具体流程如下:
- #1.首先进行预备信息的求解便于一致性检验
- #2.进行一致性检验,判断是否可以使用层次分析法
- #3.求解权重的三种方法(算术平均值法,几何平均值法,特征向量法)
- """
- 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
- #矩阵的一致性指标CI
- self.CI_val = (self.max_eig_val - self.n) / (self.n - 1)
- #矩阵的一致性比例CR
- self.CR_val = self.CI_val / (self.RI[self.n - 1])
- #2.进行一致性检验,判断是否可以使用层次分析法
- def consist_test(self):
- #一致性指标CI
- print("比较矩阵的CI值为:",str(self.CI_val))
- #一致性指标CR
- 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),"<0.1,通过一致性检验!")
- return True
- else:
- 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.n
- print("算术平均法求得的权重为:",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_weighting
-
- def 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()

算术平均法求得的权重为: [0.07243906 0.30125047 0.62631047]
几何平均法求得的权重为: [0.7374984 0.17727613 0.08522547]
特征值权重法法求得的权重为: [0.07239208 0.30116321 0.62644471]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。