数学建模(基于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]
相关推荐
遇见很ok1 分钟前
js中 ES6 新特性详解
开发语言·javascript·es6
没有晚不了安9 分钟前
1.13作业
开发语言·python
布谷歌13 分钟前
Oops! 更改field的数据类型,影响到rabbitmq消费了...(有关于Java序列化)
java·开发语言·分布式·rabbitmq·java-rabbitmq
被程序耽误的胡先生18 分钟前
java中 kafka简单应用
java·开发语言·kafka
刀客12319 分钟前
python小项目编程-中级(1、图像处理)
开发语言·图像处理·python
卷卷的小趴菜学编程23 分钟前
c++之多态
c语言·开发语言·c++·面试·visual studio code
信阳农夫32 分钟前
python 3.6.8支持的Django版本是多少?
python·django·sqlite
数模竞赛Paid answer37 分钟前
2024年国赛高教杯数学建模A题板凳龙闹元宵解题全过程文档及程序
数学建模·全国大学生数学建模竞赛·国赛高教杯
冷琴199643 分钟前
基于Python+Vue开发的反诈视频宣传管理系统源代码
开发语言·vue.js·python
楠枬1 小时前
网页五子棋——对战后端
java·开发语言·spring boot·websocket·spring