【数学建模导论】Task02 权重生成与评价模型

前言

本篇章主要学习评价类模型,内容还是蛮多的,
那就咬牙切齿地啃书吧 >_< !
不断完善,持续充电,坚持更新。

原理讲解涉及多个矩阵、建议结合图表分析。
详尽内容跳转支持开源项目 intro-mathmodel
尽信书不如无书。一定要勤思考、多探索。
注意在实现代码之外,更不能忽视对结果的解释!
所以掌握各种评价方法的流程尤为重要。

在这里插入图片描述

在此之前我们需要明白:

评价类问题
对于一个目标不同方案之间比较 or 不同影响因素之间比较

注:最常用的其实就是前 3 种评价方法。
即层次分析法(AHP)、熵权分析法、理想解法(TOPSIS分析法,优劣解距离法)。

❤️ ❤️

系列文章导航

【数学建模导论】Task01 数据处理与拟合模型
【数学建模导论】Task02 权重生成与评价模型
【数学建模导论】Task03 时间序列与投资模型
【数学建模导论】Task04 机器学习
【数学建模导论】Task05 多模数据与智能模型

1 层次分析法(AHP)

在这里插入图片描述

1.1.选择指标,构建层次模型

在这里插入图片描述
在这里插入图片描述

选择指标

指标:使用层次分析法解决问题的时候所评价的准则量(准则)

指标的选取

  • 查找以往文献得到
  • 社会调查(发放调查问卷或者使用德尔菲法去征求专家意见)
构建层次模型

目标层:评价类问题的目标

准则层:将指标按照一定的层级结构组织起来构成的指标体系

方案层:给出多个方案(对象)进行比较

1.2 构建判断矩阵

在这里插入图片描述
在这里插入图片描述

判断矩阵

两个相邻的层次之间是需要构建成对比较矩阵

矩阵每一项的取值:aij 描述了 i 比 j 的重要程度(依照表格主观地填写矩阵)

1.3 CR检验(一致性检验)

在这里插入图片描述
在这里插入图片描述

1.4 归一化得到权重向量,组成最终矩阵排布

在这里插入图片描述
在这里插入图片描述

归一化的方法

在这里插入图片描述

1.5 计算出不同方案的评分进行比较

通过加权折算
计算出最终评分

Python 案例代码

案例
某日从三条河流的基站处抽检水样,得到了水质的四项检测指标如表所示。
请根据提供数据对三条河流的水质进行评价。
在这里插入图片描述
其中,
DO代表水中溶解氧含量,越大越好;
CODMn表示水中高锰酸盐指数,NH3-N表示氨氮含量,这两项指标越小越好;
pH值没有量纲,在6~9区间内较为合适。

代码

import numpy as np
 
 
# 计算权重类
# 首先初始化判断矩阵,检验其CR是否<0.1,如果小于则计算权重,否则提示调整矩阵内数值。
class Calculate_weights:
 
    # 初始化判断矩阵
    def __init__(self, array):
        self.array = array
        # n为矩阵维度
        self.n = array.shape[0]
        # 矩阵的特征值和特征向量
        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_value = (self.max_eig_val - self.n) / (self.n - 1)
        # 平均随机一致性指标RI值列表,用于一致性检验。
        self.RI_list = [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]
        # 矩阵的一致性比例CR
        self.CR_value = self.CI_value / (self.RI_list[self.n - 1])
 
    # 一致性判断 返回布尔类型
    def test_consist(self):
        # 打印矩阵的一致性指标CI和一致性比例CR
        # 进行一致性检验判断
        if self.n == 2 or self.CR_value < 0.1:  # 二阶矩阵或CR值小于0.1,可以通过一致性检验。
            return True
        else:  # CR值大于0.1, 一致性检验不通过。
            print("判断矩阵的CR值为:" + str(self.CR_value) + ",未通过一致性检验。")
            return False
 
    # 算术平均法求权重
    def cal_weight_by_arithmetic_method(self):
        # 求矩阵的每列的和
        col_sum = np.sum(self.array, axis=0)
        # 将判断矩阵按照列归一化
        array_normed = self.array / col_sum
        # 计算权重向量
        array_weight = np.sum(array_normed, axis=1) / self.n
        # 打印权重向量
        #print("算术平均法计算得到的权重为:\n", array_weight)
        # 返回权重向量的值
        return array_weight
 
    # 几何平均法求权重
    def cal_weight_by_geometric_method(self):
        # 求矩阵的每列的积
        col_product = np.product(self.array, axis=1)
        # 将得到的积向量的每个分量进行开n次方
        array_power = np.power(col_product, 1 / self.n)
        # 将列向量归一化
        array_weight = array_power / np.sum(array_power)
        # 打印权重向量
        #print("几何平均法计算得到的权重为:\n", array_weight)
        # 返回权重向量的值
        return array_weight
 
    # 特征值法求权重
    def cal_weight_by_eigenvalue_method(self):
        # 将矩阵最大特征值对应的特征向量进行归一化处理就得到了权重
        array_weight = self.max_eig_vector / np.sum(self.max_eig_vector)
        # 打印权重向量
        #print("特征值法计算得到的权重为:\n", array_weight)
        # 返回权重向量的值
        return array_weight
 
 
class AHP:
 
    def __init__(self, *args):
        self.col = args[0]
        self.row = args[1]
        self.array = args[2:]
        # 初始化最终矩阵
        self.finally_matrix = np.empty((len(self.row),len(self.col),))
 
    # 生成全部填好后的最终矩阵
    def f_matrix(self):
        # matrix 为每个判断矩阵,记得注意顺序,如权重在第一列。
        col = 0
        row = 0
        for matrix in self.array:
            weights_obj = Calculate_weights(matrix)
            if weights_obj.test_consist():
                # 特征值法求权重
                weight3 = weights_obj.cal_weight_by_eigenvalue_method()
                if col == 0: # 权重的权重放在列(竖着放在第一列)
                    self.finally_matrix[:, col] = weight3
                    col += 1
                else: # 剩下的都放在行(每行横着放)
                    self.finally_matrix[row, col:] = weight3
                    row += 1
 
        return self.finally_matrix
 
    def result(self):
        self.f_matrix()
        res = []
        for i in range(len(self.col)-1):
            tem_res = np.sum(self.finally_matrix[:,0]*self.finally_matrix[:,i+1])
            res.append(tem_res)
        return res
 
 
 
if __name__ == "__main__":
    # 给出判断矩阵
 
    col = ['权重', '四川攀枝花龙洞', '重庆朱沱', '湖北宜昌南津关']
    row = ['PH*', 'DO', 'CODMn', 'NH3-N']
 
    weighting = np.array([[1,1/5,1/3,1],
                          [5,1,3,5],
                          [3,1/3,1,3],
                          [1,1/5,1/3,1]])
 
    Metrics1 = np.array([[1, 2, 4], [1 / 2, 1, 3], [1 / 4, 1 / 3, 1]])
 
    Metrics2 = np.array([[1, 4, 7], [1 / 4, 1, 4], [1 / 7, 1 / 4, 1]])
 
    Metrics3 = np.array([[1, 1 / 4, 4], [4, 1, 7], [1 / 4, 1 / 7, 1]])
 
    Metrics4 = np.array([[1, 9, 7], [1 / 9, 1, 1 / 3], [1 / 7, 3, 1]])
 
 
    score_result = AHP(col, row, weighting, Metrics1, Metrics2, Metrics3, Metrics4).result()
    print('不同方案的评分:',score_result)
    print('选择评分最高的方案:{}'.format(col[np.argmax(score_result)+1]))

回显

不同方案的评分: [0.5746349923087866, 0.33848837196743015, 0.08687663572378307]
选择评分最高的方案:四川攀枝花龙洞

2 熵权分析法

在这里插入图片描述

2.1 正向化矩阵

在这里插入图片描述

2.2 标准化矩阵

在这里插入图片描述

2.3 准则の权重向量

在这里插入图片描述

3 理想解法(TOPSIS分析法,优劣解距离法)

在这里插入图片描述

4 CRITIC方法

在这里插入图片描述

5 模糊综合评价法

鼠标右键 -> 在新标签页中打开图像
在这里插入图片描述

在这里插入图片描述

6 秩和比综合评价法(RSR)

鼠标右键 -> 在新标签页中打开图像
在新标签页中打开图像

整次秩和比法

对于效益型指标(指标越大越好)

  • 从小到大编秩

对于成本型指标 / 代价型指标(指标越小越好)

  • 从大到小编秩
    eg. 死亡率越高,则编的秩数值越小
非整次秩和比法

对于效益型指标(指标越大越好)
在这里插入图片描述

对于成本型指标 / 代价型指标(指标越小越好)
- 从大到小编秩
eg. 死亡率越高,则编的秩数值越小

7 主成分分析法

在这里插入图片描述

Read more

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机动人心

解密未来,一文解锁一周动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值