初学者搞的层次分析法,先放代码再放图
import numpy as np
import pandas as pd
import pymysql
import math
import time
import datetime
from sqlalchemy import create_engine
class AHP:
"""
相关信息的传入和准备
"""
def __init__(self, array):
## 记录矩阵相关信息
self.array = array
## 记录矩阵大小
self.n = array.shape[0]
# 初始化RI值,用于一致性检验
self.RI_list = [0, 0, 0.58, 0.90, 1.12, 1.24, 1.32, 1.41, 1.45, 1.49, 1.51]
# 矩阵的特征值和特征向量
self.eig_val, self.eig_vector = np.linalg.eig(self.array)
# 矩阵的最大特征值
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_list[self.n - 1])
"""
一致性判断
"""
def test_consist(self):
# 打印矩阵的一致性指标CI和一致性比例CR
print("判断矩阵的CI值为:" + str(self.CI_val))
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) + ",通过一致性检验")
return True
else: # CR值大于0.1, 一致性检验不通过
print("判断矩阵的CR值为" + str(self.CR_val) + "未通过一致性检验")
return False
"""
特征值法求权重
"""
def cal_weight__by_eigenvalue_method(self):
# 将矩阵最大特征值对应的特征向量进行归一化处理就得到了权重
array_weight = self.max_eig_vector / np.sum(self.max_eig_vector)
# 打印权重向量
for index in range(len(array_weight)):
array_weight[index] = round(array_weight[index],2)
print(array_weight)
# 返回权重向量的23
# 值
return array_weight
'''
计算权重
'''
RI = [0, 0, 0.58, 0.90, 1.12, 1.24, 1.32, 1.41, 1.45, 1.49, 1.51]
#信息准确
mes = np.array([[1,3,5],
[1/3,1,3],
[1/5, 1/3, 1]])
m1 = len(mes) # 获取指标个数
n1 = len(mes[0])
R1 = np.linalg.matrix_rank(mes) # 求判断矩阵的秩
V1, D1 = np.linalg.eig(mes) # 求判断矩阵的特征值和特征向量,V特征值,D特征向量;
list1 = list(V1)
B1 = np.max(list1) # 最大特征值
index1 = list1.index(B1)
C1 = D1[:, index1] # 对应特征向量
CI1 = (B1 - n1) / (n1 - 1) # 计算一致性检验指标CI
CI1 = CI1.real
CR1 = CI1 / RI[n1]
CR1 = CR1.real
if CR1 < 0.10:
print("信息准确权重:")
# 特征值法求权重
mes_weight = AHP(mes).