数学建模(基于Python实现)--灰色关联分析法讲解,含案例

前言

  • 这是去年底学数学建模老哥的建模课程笔记;

  • 未来本人将陆陆续续的更新数学建模相关的一些基础算法,大家可以持续关注一下,主要在于运用;

  • 提示:数学建模只有实战才能提升🔥​🔥​🔥​🔥​🔥​,光学算法没有啥意义,也很难学的很懂。

概念

灰色关联分析的基本思想:是根据序列曲线几何形状的相似程度来判断其联系是否紧密。曲线越接近,相应序列之间的关联度就越大,反之就越小。

一般的抽象系统,如社会系统、经济系统、农业系统、生态系统、教育系统等都包含有许多种,多种因素共同作用的结果决定了该系统的发展态势,其中,哪些是主要因素,哪些是次要因素;哪些因素对系统发展影响大,哪些因素对系统发展影响小;哪些因素对系统发展起推动作用需强化发展,哪些因素对系统发展起阻碍作用需加以抑制,灰色关联分析中,对每个影响不同的因数进行不同权重的赋值,这也是主观性过强的原因。

灰色关联分析法则用于确定各因素对结果影响程度或随时间变化的综合评价类问题。

  • 优点
    • 灰色关联分析法弥补了采用数理统计方法作系统分析所导致的遗憾。它对样本量的多少和样本有无规律都同样适用,而且计算量小,十分方便,更不会出现量化结果与定性分析结果不符的情况。
  • 缺点
    • 要求需要对各项指标的最优值进行现行确定,主观性过强,同时部分指标最优值难以确定。

步骤

例题:

第一步、确定比较对象(评价对象)和参考数列(评价标准)

这一步就是选取评价对象,和评价对象有关系影响因素,本题中就是,通过这个地区水库含氧量、PH值、细菌总数、植物性营养物含量数据,评价那些因数对本地水质的关联大,那些小

代码:

python 复制代码
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
txt 复制代码
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.        ]])

第二步、确定各指标的权重

确定各指标对应的权重,如:专家打分法、层次分析法............

python 复制代码
#设置权重
w= np.array([0.1,0.2, 0.3,0.4])

第三步、计算灰色关联系数

python 复制代码
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
txt 复制代码
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,越大,更关注指标差异性,越小,更注重指标相关性

python 复制代码
# 沿着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)
txt 复制代码
每行的和: [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]

第五步、评价分析

根据加权关联度大小,对各评价对象进行排序,可建立评价对象的关联序,关联度越大,评价结果越好

python 复制代码
# 对关联度进行降序排序并获取排序索引
sorted_indices = np.argsort(-relational_degrees)

# 打印排序结果
print("关联度排序索引: ", sorted_indices)
txt 复制代码
关联度排序索引:  [3 2 0 1]
相关推荐
香蕉可乐荷包蛋19 分钟前
Python面试问题
开发语言·python·面试
ErizJ29 分钟前
Golang|分布式索引架构
开发语言·分布式·后端·架构·golang
.生产的驴30 分钟前
SpringBoot 接口国际化i18n 多语言返回 中英文切换 全球化 语言切换
java·开发语言·spring boot·后端·前端框架
界面开发小八哥34 分钟前
智能Python开发工具PyCharm v2025.1——AI层级功能重磅升级
ide·人工智能·python·pycharm·开发工具
八股文领域大手子38 分钟前
深入浅出限流算法(三):追求极致精确的滑动日志
开发语言·数据结构·算法·leetcode·mybatis·哈希算法
啊阿狸不会拉杆1 小时前
人工智能数学基础(一):人工智能与数学
人工智能·python·算法
蹦蹦跳跳真可爱5891 小时前
Python----卷积神经网络(卷积为什么能识别图像)
人工智能·python·深度学习·神经网络·计算机视觉·cnn
geovindu1 小时前
PyCharm 2023升级2024 版本
ide·python·pycharm
几度泥的菜花1 小时前
优雅实现网页弹窗提示功能:JavaScript与CSS完美结合
开发语言·javascript·css
weixin_307779131 小时前
AWS Glue ETL设计与调度最佳实践
开发语言·数据仓库·云计算·etl·aws