前言
-
这是去年底学数学建模老哥的建模课程笔记;
-
未来本人将陆陆续续的更新数学建模相关的一些基础算法,大家可以持续关注一下,主要在于运用;
-
提示:数学建模只有实战才能提升🔥🔥🔥🔥🔥,光学算法没有啥意义,也很难学的很懂。
概念
灰色关联分析的基本思想:是根据序列曲线几何形状的相似程度来判断其联系是否紧密。曲线越接近,相应序列之间的关联度就越大,反之就越小。
一般的抽象系统,如社会系统、经济系统、农业系统、生态系统、教育系统等都包含有许多种,多种因素共同作用的结果决定了该系统的发展态势,其中,哪些是主要因素,哪些是次要因素;哪些因素对系统发展影响大,哪些因素对系统发展影响小;哪些因素对系统发展起推动作用需强化发展,哪些因素对系统发展起阻碍作用需加以抑制,灰色关联分析中,对每个影响不同的因数进行不同权重的赋值,这也是主观性过强的原因。
灰色关联分析法则用于确定各因素对结果影响程度或随时间变化的综合评价类问题。
- 优点
- 灰色关联分析法弥补了采用数理统计方法作系统分析所导致的遗憾。它对样本量的多少和样本有无规律都同样适用,而且计算量小,十分方便,更不会出现量化结果与定性分析结果不符的情况。
- 缺点
- 要求需要对各项指标的最优值进行现行确定,主观性过强,同时部分指标最优值难以确定。
步骤
例题:
第一步、确定比较对象(评价对象)和参考数列(评价标准)
这一步就是选取评价对象,和评价对象有关系影响因素,本题中就是,通过这个地区水库含氧量、PH值、细菌总数、植物性营养物含量数据,评价那些因数对本地水质的关联大,那些小,
代码:
import numpy as np# 原始数据
data = np.array([[8, 7.2, 500, 12],[6, 7.0, 600, 15],[9, 7.5, 400, 18],[7, 7.3, 450, 11],[10, 7.1, 550, 9]
])# 无量纲化处理
min_values = data.min(axis=0)
max_values = data.max(axis=0)
normalized_data = (data - min_values) / (max_values - min_values)
normalized_data
array([[0.5 , 0.4 , 0.5 , 0.33333333],[0. , 0. , 1. , 0.66666667],[0.75 , 1. , 0. , 1. ],[0.25 , 0.6 , 0.25 , 0.22222222],[1. , 0.2 , 0.75 , 0. ]])
第二步、确定各指标的权重
确定各指标对应的权重,如:专家打分法、层次分析法…………
#设置权重
w= np.array([0.1,0.2, 0.3,0.4])
第三步、计算灰色关联系数
rho = 0.5 # 分辨系数# 计算差值
differences = normalized_data[:-1, :] - normalized_data[-1, :]# 计算最小差值和最大差值
min_diff = np.min(differences, axis=0)
max_diff = np.max(differences, axis=0)# 计算灰色关联系数
relational_coefficients = (min_diff + rho * max_diff
) / (differences + rho * max_diff)relational_coefficients
array([[0.5 , 0.4 , 0.5 , 0.33333333],[0. , 0. , 1. , 0.66666667],[0.75 , 1. , 0. , 1. ],[0.25 , 0.6 , 0.25 , 0.22222222],[1. , 0.2 , 0.75 , 0. ]])
array([[ 1.8 , 0.33333333, 5. , 0.86666667],[ 1. , 1. , -1.66666667, 0.61904762],[ 3. , 0.16666667, 1. , 0.48148148],[ 1.28571429, 0.25 , 1.66666667, 1. ]])
第四步、计算灰色加权关联度
p,分辨率大小,一般取0.4,0.5,0.6,越大,更关注指标差异性,越小,更注重指标相关性
# 沿着axis=1(即列)求和,得到每行的和
row_sums = np.sum(relational_coefficients, axis=1) # 确保w的形状与row_sums的形状相匹配
assert w.shape == (relational_coefficients.shape[0],), "w的长度必须与relational_coefficients的行数相同" # 计算每行的和乘以w中对应元素的值
relational_degrees = row_sums * w print("每行的和:", row_sums)
print("权重w:", w)
print("每行的和乘以对应权重w的值(即relational_degrees):", relational_degrees)
每行的和: [8. 0.95238095 4.64814815 4.20238095]
权重w: [0.1 0.2 0.3 0.4]
每行的和乘以对应权重w的值(即relational_degrees): [0.8 0.19047619 1.39444444 1.68095238]
第五步、评价分析
根据加权关联度大小,对各评价对象进行排序,可建立评价对象的关联序,关联度越大,评价结果越好
# 对关联度进行降序排序并获取排序索引
sorted_indices = np.argsort(-relational_degrees)# 打印排序结果
print("关联度排序索引: ", sorted_indices)
关联度排序索引: [3 2 0 1]