层次分析法计算权重

初学者搞的层次分析法,先放代码再放图

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).cal_weight__by_eige
  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值