🌈🌈🌈往期精选内容:
💖【数学建模】CRITIC权重法解析:从数学原理到实战分析-优快云博客
💖【数学建模】TOPSIS算法全解析:从数学原理到医疗器械采购决策应用-优快云博客
💖【数学建模】层次分析法(AHP):从理论到实战的全面解析_层次分析法计-优快云博客
灰色关联分析(GRA):从数学原理到实战应用的全方位解析
引言
灰色关联分析(Grey Relational Analysis
, GRA
)是灰色系统理论的核心方法,由邓聚龙教授于1982年提出。它通过序列曲线的几何相似性量化因素间的关联程度,特别适用于“小样本、贫信息”系统。与传统的回归分析不同,GRA
无需严格的数据分布假设,且能捕捉非线性关系,因此在经济、环境、工程等领域广泛应用。本文将从概念、数学原理到实际案例,结合Python
代码实现,全面解析灰色关联分析的核心逻辑。
📚一、灰色关联分析
🚀1.1、概念
灰色关联分析通过几何曲线相似度量化多变量间的动态关联关系,其核心思想是:曲线变化趋势越接近,关联度越高。相较于传统统计方法,GRA
突破了大样本和典型分布的限制,尤其擅长处理贫信息、动态时变的系统。
简而言之,当我们已知某一指标可能与其他多个因素存在关联时,灰色关联度分析能够帮助我们明确该指标与每个因素的具体关联程度,从而识别出哪些因素对指标的影响更为显著,哪些因素的影响相对较弱。
🚀 1.2 应用场景
GRA
广泛应用于多指标评价与系统分析两方面,例如:
- 综合评价:如学生成绩评价(以各科成绩为子序列,综合成绩为母序列)。
- 工业优化:分析工艺参数对产品质量的影响权重(如黄姜皂素生产环保性评价)。
- 经济预测:研究
GDP
与投资、消费等因子的动态关联性。 - 生态治理:评估污染物浓度与气象因子的相关性。
🚀 1.3 使用条件
-
小样本数据:适用于样本量不足的场景(如仅4年数据)。
-
数据无量纲化:需通过均值化或区间标准化消除量纲差异
-
无分布假设:不要求数据符合正态分布。
-
动态特性:适用于时序数据或动态系统建模。
📚 二、实现过程
GRA
的核心流程包含四个关键步骤:
🚀2.1、数据预处理
在灰色关联分析中,数据标准化(归一化)是消除量纲和数量级差异的关键步骤,它能消除不同量纲和数据范围对分析结果的影响,使我们更关注数据的变化趋势而非绝对数值,以下是常用的标准化方法和一些推荐场景:
📊 2.1.1、初值化法(Initialization
)
📝 公式与步骤
-
公式:
x i ′ ( k ) = x i ( k ) x i ( 1 ) ( k = 1 , 2 , … , n ) x'_i(k) = \frac{x_i(k)}{x_i(1)} \quad (k=1,2,\dots,n) xi′(k)=xi(1)xi(k)(k=1,2,…,n)
其中 x i ( 1 ) x_i(1) xi(1) 是第 i i i 个序列的第一个数据点。 -
操作:将每个序列的所有数据点除以其第一个值,使得所有序列的起点对齐为1。
🌟 适用场景
- 数据趋势分析:关注各因素随时间或条件变化的相对趋势。
- 起点敏感型数据:如经济指标的时间序列(
GDP
、投资增长率等)。 - 小样本数据(n < 10),且数据波动较小。
⚠️ 注意事项
- 若第一个数据点为0或异常值,需预先处理(如删除或插值)。
- 不适用于起点差异过大的序列(如不同量级的数据)。
📊 2.1.2、 均值化法(Mean Normalization
)
📝 公式与步骤
- 公式:
x i ′ ( k ) = x i ( k ) 1 n ∑ k = 1 n x i ( k ) x'_i(k) = \frac{x_i(k)}{\frac{1}{n}\sum_{k=1}^n x_i(k)} xi′(k)=n1∑k=1nxi(k)xi(k)
即每个数据点除以序列的均值。
🌟 适用场景
- 消除基数差异:适用于数据量纲不同但数值范围差异不大的情况。
- 动态波动分析:如环境监测数据(温度、湿度、污染物浓度)。
- 存在异常值时的稳健处理(相比初值化对异常值更鲁棒)。
⚠️ 注意事项
- 若序列均值接近0,会导致数值不稳定(需检查数据分布)。
📊 2.1.3、区间化法(Min-Max Scaling
)
📝 公式与步骤
- 公式:
x i ′ ( k ) = x i ( k ) − min ( x i ) max ( x i ) − min ( x i ) x'_i(k) = \frac{x_i(k) - \min(x_i)}{\max(x_i) - \min(x_i)} xi′(k)=max(xi)−min(xi)xi(k)−min(xi)
将数据线性映射到 [0, 1] 区间。
🌟 适用场景
- 多量纲混合数据:如同时包含温度
°C
)、压力(kPa
)等不同量纲的工程参数。 - 数据分布不均匀:存在多个数量级差异(如0.1~1000范围的数据)。
- 需要直观可比性(所有数据缩放到统一区间)。
⚠️ 注意事项
- 对异常值敏感(极值会压缩正常数据的分布范围)。
- 若序列为常数值(最大值=最小值),需特殊处理。
📊 2.1.4、 标准差标准化(Z-Score
)
📝 公式与步骤
- 公式:
x i ′ ( k ) = x i ( k ) − μ i σ i x'_i(k) = \frac{x_i(k) - \mu_i}{\sigma_i} xi′(k)=σixi(k)−μi
其中 μ i \mu_i μi 为序列均值, σ i \sigma_i σi 为标准差。
🌟 适用场景
- 数据服从正态分布:如实验测量误差分析。
- 强调数据分布形态(如方差较大的金融数据)。
- 机器学习建模前的预处理(与灰色关联结合使用时)。
⚠️ 注意事项
- 在灰色关联分析中使用较少(可能弱化趋势特征)。
- 若数据为小样本(n < 30),
Z-Score
可能不准确。
📊 2.1.5、比重法(Proportion Normalization
)
📝 公式与步骤
- 公式:
x i ′ ( k ) = x i ( k ) ∑ k = 1 n x i ( k ) x'_i(k) = \frac{x_i(k)}{\sum_{k=1}^n x_i(k)} xi′(k)=∑k=1nxi(k)xi(k)
将每个数据点转换为该序列总和的占比。
🌟 适用场景
- 总量固定的系统:如能源分配比例、市场份额分析。
- 强调结构占比(如产业贡献度分析)。
⚠️ 注意事项
- 若序列总和为0或负数,需预先调整数据。
🔍 方法选择建议
场景特点 | 推荐方法 | 示例应用 |
---|---|---|
数据量纲不同,且波动范围大 | 区间化法 | 环境监测(温度、湿度、PM2.5 ) |
小样本,关注变化趋势 | 初值化法 | 经济指标时间序列分析 |
存在异常值,需稳健处理 | 均值化法 | 设备传感器数据 |
数据服从正态分布 | Z-Score | 实验测量数据 |
分析结构占比 | 比重法 | 产业贡献度分析 |
🚀2.2、计算关联系数
🌟确定母序列和子序列:
选择一个作为母序列(参考序列),通常是我们关注的主要指标。其他作为子序列(比较序列),是我们想要分析与母序列关联程度的其他因素。
🌟计算关联系数:
根据母序列和子序列的差值,计算每个对应点的关联系数。关联系数的计算公式为:
γ ( x 0 ( k ) , x i ( k ) ) = a + ρ b ∣ x 0 ( k ) − x i ( k ) ∣ + ρ b \gamma(x_0(k),x_i(k))=\frac{a+\rho b}{\mid x_0(k)-x_i(k)\mid +\rho b} γ(x0(k),xi(k))=∣x0(k)−xi(k)∣+ρba+ρb
其中, a a a 为两极最小差, b b b 为两极最大差, ρ ρ ρ 为分辨系数(一般取0.5)。
🚀2.3、 计算灰色关联度
将关联系数在时间序列上求平均,得到子序列与母序列的灰色关联度。
灰色关联度
=
1
n
∑
k
=
1
n
γ
(
x
0
(
k
)
,
x
i
(
k
)
)
\text{灰色关联度} = \frac{1}{n} \sum_{k=1}^n \gamma(x_0(k),x_i(k))
灰色关联度=n1k=1∑nγ(x0(k),xi(k))
根据计算得到的灰色关联度,对子序列进行排序,分析各因素与母序列的关联程度。
📚 三、(分析)案例分析:经济系统中GDP与各因素的关联分析
🚀 3.1、 案例说明
假设我们有一个经济系统,包含GDP
、消费、投资和出口四个指标。我们选择GDP
作为母序列,消费、投资和出口作为子序列,进行灰色关联分析,以确定这些因素与GDP
的关联程度。
年份 | GDP | 消费 | 投资 | 出口 |
---|---|---|---|---|
2016 | 3439 | 341 | 183 | 3248 |
2017 | 4002 | 409 | 196 | 3856 |
2018 | 4519 | 556 | 564 | 6029 |
2019 | 4995 | 719 | 598 | 7358 |
2020 | 5566 | 903 | 613 | 8880 |
🚀 3.2、 计算结果
假设计算得到的灰色关联度如下:
因素 | 灰色关联度 |
---|---|
消费 | 0.650 |
投资 | 0.467 |
出口 | 0.649 |
🚀 3.3、 结论
通过灰色关联度分析,我们得出以下结论:
这表明消费和出口与GDP
的关联度最高,其次是投资。
🚀 3.4 、Python代码实现
import numpy as np
import pandas as pd
# 原始数据
data = np.array([
[3439, 4002, 4519, 4995, 5566], # GDP
[341, 409, 556, 719, 903], # 消费
[183, 196, 564, 598, 613], # 投资
[3248, 3856, 6029, 7358, 8880] # 出口
])
# 数据归一化处理(均值化)
mean_values = np.mean(data, axis=1)
normalized_data = data / mean_values[:, np.newaxis]
# 母序列和子序列
x0 = normalized_data[0] # GDP作为母序列
xi = normalized_data[1:] # 消费、投资、出口作为子序列
# 计算差值矩阵
abs_diff = np.abs(xi - x0)
# 计算两极最小差a和两极最大差b
a = np.min(abs_diff)
b = np.max(abs_diff)
# 分辨系数ρ
rho = 0.5
# 计算关联系数矩阵
gamma = (a + rho * b) / (abs_diff + rho * b)
# 计算灰色关联度
grey_relation_degree = np.mean(gamma, axis=1)
print("灰色关联度:", grey_relation_degree)
factors = ['消费', '投资', '出口']
result = pd.DataFrame({
'因素': factors,
'灰色关联度': grey_relation_degree
})
result
📚 四、(评价)案例分析:新能源汽车供应商评价
灰色关联分析用于评价,就是通过计算与理想最优方案的关联性判断的与
TOPSIS
类似.
🚀 4.1、案例说明
某新能源汽车企业需对3家电池供应商(A/B/C)进行综合评估,选取5个关键指标:
- 价格(万元/套,成本型,权重0.25)
- 交货准时率(%,效益型,权重0.20)
- 质量合格率(%,效益型,权重0.30)
- 技术创新能力(评分1-10,效益型,权重0.15)
- 售后服务满意度(评分1-10,效益型,权重0.10)
- 原始数据
供应商 | 价格 | 交货准时率 | 质量合格率 | 技术创新 | 售后服务 |
---|---|---|---|---|---|
A | 8.5 | 92% | 98% | 8 | 9 |
B | 7.2 | 95% | 96% | 9 | 7 |
C | 9.0 | 90% | 95% | 7 | 8 |
🚀 4.2、计算结果
数据标准化
供应商 | 价格 | 交货准时率 | 质量合格率 | 技术创新 | 售后服务 |
---|---|---|---|---|---|
A | 0.847 | 0.968 | 1.000 | 0.889 | 1.000 |
B | 1.000 | 1.000 | 0.980 | 1.000 | 0.778 |
C | 0.800 | 0.947 | 0.969 | 0.778 | 0.889 |
关联度及排名
供应商 | 综合关联度 | 排名 |
---|---|---|
B | 0.888 | 1 |
A | 0.735 | 2 |
C | 0.559 | 3 |
🚀 4.3、结论
- 最优供应商:B供应商以0.888关联度排名第一,在价格(最低7.2万)和技术创新(9分)表现突出
- 竞争力分析:
- A供应商质量最优(98%合格率)但价格最高
- C供应商各项指标均衡但无突出优势
- B供应商需提升售后服务(仅7分)
🚀4.4 Python代码实现
import pandas as pd
import numpy as np
# 初始化数据
data = {
'供应商': ['A', 'B', 'C'],
'价格': [8.5, 7.2, 9.0],
'交货准时率': [92, 95, 90],
'质量合格率': [98, 96, 95],
'技术创新': [8, 9, 7],
'售后服务': [9, 7, 8]
}
weights = [0.25, 0.20, 0.30, 0.15, 0.10]
# 数据标准化
def normalize(df):
# 成本型指标(价格)
df['价格'] = df['价格'].min() / df['价格']
# 效益型指标
benefit_cols = ['交货准时率','质量合格率','技术创新','售后服务']
df[benefit_cols] = df[benefit_cols]/df[benefit_cols].max()
return df.round(3)
df_norm = normalize(pd.DataFrame(data)).set_index('供应商')
# 理想方案(各指标最大值)
ideal = df_norm.max()
# 计算关联系数
delta = abs(df_norm - ideal)
rho = 0.5 # 分辨系数
gamma = (delta.min().min() + rho*delta.max().max()) / (delta + rho*delta.max().max())
# 计算加权关联度
grey_rel = gamma.dot(weights)
result = grey_rel.sort_values(ascending=False).reset_index()
result.columns = ['供应商', '综合关联度']
print("标准化矩阵:\n", df_norm)
print("\n关联度排名:\n", result)
📚参考链接
1、清风数学建模学习笔记——灰色关联分析(GRA)详细解读与案例分析_灰色关联度实列分析-优快云博客
2、数学建模-灰色关联度分析原理笔记_灰色关联分析的原理-优快云博客
3、灰色关联分析法详细讲解+Python代码实现_51CTO博客_灰色关联分析 python
4、灰色关联度分析(Grey Relation Analysis,GRA)原理详解-优快云博客