数学建模(基于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]
相关推荐
AiFlutter2 分钟前
Java对接GraphQL
java·开发语言·graphql
AI视觉网奇41 分钟前
pytorch3d报错:RuntimeError: Not compiled with GPU support.
人工智能·pytorch·python
虞书欣的61 小时前
Python小游戏22——吃豆豆小游戏
python·算法·游戏·编辑器·pygame
cliffordl1 小时前
SQLAlchemy 介绍与实践
数据库·python
Aliano2171 小时前
Java的jackson库
java·开发语言
车载testing1 小时前
使用Python和Vosk库实现语音识别
开发语言·python·语音识别
FreedomLeo11 小时前
Python数据分析NumPy和pandas(二十三、数据清洗与预处理之五:pandas的分类类型数据)
python·数据分析·numpy·pandas·categoricals·数据分类分析·建模和机器学习
折枝寄北1 小时前
C语言进阶:二.数据的存储(2)
c语言·开发语言·学习
ac-er88882 小时前
PHP的四大安全策略
开发语言·安全·php
算家云2 小时前
moffee模型部署教程
人工智能·python·github·markdown·nvidia·ppt·幻灯片制作