前言
本篇章主要学习评价类模型,内容还是蛮多的,
那就咬牙切齿地啃书吧 >_< !
不断完善,持续充电,坚持更新。
原理讲解涉及多个矩阵、建议结合图表分析。
详尽内容跳转支持开源项目 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. 死亡率越高,则编的秩数值越小
对于效益型指标(指标越大越好):
对于成本型指标 / 代价型指标(指标越小越好):
7 主成分分析法
Read more
- 数学建模导论 intro-mathmodel
(知识密度大、代码理论兼备)
https://datawhalechina.github.io/intro-mathmodel/#/ - Python科学计算 scientific-computing(数学建模导论的前置课程)
(知识密度小、代码实操强悍)
https://datawhalechina.github.io/scientific-computing/#/