数学建模(基于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]
相关推荐
第九序言T36 分钟前
Python 数据处理进阶(十八)批量处理同结构文件:一个文件夹一次跑完
开发语言·python·自动化·pandas·数据处理
Java后端的Ai之路43 分钟前
CAS并发控制-从CPU指令到企业级乐观锁
vue.js·人工智能·python·cas·乐观锁
qq_426003961 小时前
UI自动化高频次登录login限流解决方案
python·ui·自动化
Sakura_j_h_1 小时前
EasyEDA PCB 快速设计Skills
c++·python·github
龙亘川2 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
程序喵大人2 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
quantdash_cc2 小时前
如何验证历史行情的交易日期是否完整覆盖研究区间?
python·数据分析·pandas·量化交易·股票数据·quantdash
I Am a robert girl2 小时前
当智能体学会“串通”:从长程交互中读懂涌现式合谋
python·多智能体系统·多智能体协作·llm agent·涌现式合谋·对齐问题·激励机制设计
Raas1003 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
云和数据.ChenGuang3 小时前
光哥说Python RAG 系统需要哪些评估指标:从检索到生成的全链路评测指南
网络·人工智能·python·算法·langchain