目录
1.算法流程简介
2.算法核心代码文章来源:https://www.toymoban.com/news/detail-695344.html
3.算法效果展示文章来源地址https://www.toymoban.com/news/detail-695344.html
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
#矩阵的一致性指标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()
3.算法效果展示
算术平均法求得的权重为: [0.07243906 0.30125047 0.62631047]
几何平均法求得的权重为: [0.7374984 0.17727613 0.08522547]
特征值权重法法求得的权重为: [0.07239208 0.30116321 0.62644471]
到了这里,关于数学建模--层次分析法(AHP)的Python实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!