1. 从“关系”说起:为什么我们需要灰色关联分析?
在数据分析的世界里,我们常常面临一个看似简单却极其复杂的问题:如何量化两个或多个因素之间的“关系”?比如,一个地区的经济发展水平,与它的教育投入、基础设施建设、人口结构等因素,到底哪个关联更紧密?或者,影响一款产品销量的众多因素中,哪个是主要矛盾,哪个是次要矛盾?传统的方法,比如相关系数,在处理这类问题时常常显得力不从心。相关系数要求数据必须服从特定的概率分布(如正态分布),并且主要衡量的是线性关系的强弱。但在现实中,我们的数据往往是“灰色”的——信息不完全、样本量小、数据分布不明确,甚至存在一定的噪声。这时候,一种诞生于上世纪80年代、由我国学者邓聚龙教授提出的方法,就展现出了独特的优势:灰色关联分析。
灰色关联分析的核心思想,不是去精确计算一个“关系系数”,而是通过几何形状的相似程度,来判断因素间发展趋势的关联度。简单来说,如果两条曲线(代表两个因素随时间或其他指标的变化趋势)的形状越接近,那么它们之间的关联度就越高。这种方法对数据的要求极低,不需要典型的分布规律,样本量少到只有几个数据点也能进行计算,而且计算量小,非常便于在缺乏大量统计数据的场景下进行快速、有效的因素分析。它不关心绝对值的大小,只关心相对变化趋势的同步性,这使得它在评估、排序、决策等场景中,尤其是在系统分析、综合评价和预测预警中,成为了一个非常实用的工具。
2. 灰色关联分析的核心原理:几何相似性的数学表达
理解灰色关联分析,关键在于抓住“几何形状相似性”这个核心。我们不是在看两条线的高低,而是在看它们“起伏波动的节奏”是否一致。为了将这种直观感受量化,灰色关联分析构建了一套完整的数学流程。
2.1 数据序列的预处理:无量纲化
原始数据通常具有不同的量纲和数量级。例如,GDP以“亿元”为单位,而教育投入可能以“万元”为单位,直接比较它们的曲线形状是没有意义的。因此,第一步必须进行数据的无量纲化处理,使所有序列处于同一个数量级平台上。最常用的方法是初值化和均值化。
- 初值化:用序列中每一个数据除以该序列的第一个数据。这样处理后的新序列,第一个值都变成了1,所有序列都从同一个起点开始,便于观察后续的相对发展速度。
- 公式:( x_i'(k) = \frac{x_i(k)}{x_i(1)} ), 其中 ( i ) 表示第 ( i ) 个因素序列,( k ) 表示序列中的第 ( k ) 个数据点。
- 均值化:用序列中每一个数据除以该序列所有数据的平均值。这样处理后的序列,其均值都为1,侧重于序列围绕均值波动的形态。
选择哪种方法,取决于分析的重点。如果想看各因素相对于初始时刻的发展态势,用初值化;如果想看各因素围绕平均水平波动的协同性,用均值化。在实际建模中,初值化更为常见。
2.2 计算关联系数:逐点比较相似度
设经过预处理后的系统特征行为序列(我们关心的结果,比如“GDP”)为参考序列 ( X_0 ),相关因素行为序列(可能的原因,如“教育投入”、“基建投资”等)为比较序列 ( X_1, X_2, ..., X_m )。
关联系数 ( \gamma_{0i}(k) ) 表示在第 ( k ) 个点上,比较序列 ( X_i ) 与参考序列 ( X_0 ) 的关联程度。其计算公式为:
[ \gamma_{0i}(k) = \frac{\min\limits_{i} \min\limits_{k} |x_0(k) - x_i(k)| + \rho \cdot \max\limits_{i} \max\limits_{k} |x_0(k) - x_i(k)|}{|x_0(k) - x_i(k)| + \rho \cdot \max\limits_{i} \max\limits_{k} |x_0(k) - x_i(k)|} ]
这个公式看起来复杂,我们来拆解一下:
- ( |x_0(k) - x_i(k)| ):这是第 ( k ) 个点上两个序列的绝对差,体现了在该点二者的“距离”。距离越小,说明在该点趋势越接近。
- ( \min\limits_{i} \min\limits_{k} |x_0(k) - x_i(k)| ):全局最小差。即在所有序列的所有点上,找到那个最小的绝对差。
- ( \max\limits_{i} \max\limits_{k} |x_0(k) - x_i(k)| ):全局最大差。即在所有序列的所有点上,找到那个最大的绝对差。
- ( \rho ):分辨系数。这是一个介于0和1之间的常数,通常取0.5。它的作用是调节关联系数之间的差异大小。( \rho ) 越小,关联系数间的差异越大,区分能力越强;( \rho ) 越大,关联系数间的差异越平缓。0.5是一个经验值,能较好地平衡灵敏度和稳定性。
注意:公式中的全局最小差和全局最大差,是在计算所有比较序列与参考序列在所有点上的差值后,统一找到的一个最小值和一个最大值。这意味着,在计算每一个具体的 ( \gamma_{0i}(k) ) 时,使用的 ( \min ) 和 ( \max ) 值是固定的,它们来自于整个数据矩阵的扫描结果。
这个公式的精妙之处在于,它将一个具体的“点距离” ( |x_0(k) - x_i(k)| ) 与整个系统的“极差范围”联系了起来,并进行了一次“压缩映射”,使得关联系数的值域落在 (0, 1] 之间。值越接近1,说明在该点两个序列的态势越一致。
2.3 计算关联度:从点到面的综合评判
关联系数 ( \gamma_{0i}(k) ) 反映的是每个时刻的关联情况。为了得到一个整体的、综合的关联程度度量,我们需要对所有时刻的关联系数进行综合。最常用的方法就是求平均值,从而得到关联度( r_{0i} ):
[ r_{0i} = \frac{1}{n} \sum_{k=1}^{n} \gamma_{0i}(k) ]
其中 ( n ) 是数据点的个数。关联度 ( r_{0i} ) 就是一个介于0和1之间的数,它综合反映了比较序列 ( X_i ) 与参考序列 ( X_0 ) 在整个观测期内发展趋势的相似程度。( r_{0i} ) 越大,说明该因素与系统特征行为的关联性越强。
2.4 关联度排序与解读
计算出所有比较序列与参考序列的关联度 ( r_{01}, r_{02}, ..., r_{0m} ) 后,按照从大到小的顺序进行排序,就得到了各因素对系统主行为影响程度的强弱排序。排在第一位的,就是与系统发展态势最同步、关联最紧密的因素。
这里有一个非常重要的实操心得:灰色关联分析给出的是一种“趋势关联”的排序,而非“因果证明”。关联度高的因素,可能是原因,也可能是结果,或者是与原因高度协同的另一个因素。例如,我们发现“夜间灯光亮度”与“区域经济活跃度”关联度极高,但前者并非后者的原因,而是一个强相关的表征指标。因此,在解读结果时,必须结合专业领域的常识进行判断,避免得出荒谬的因果结论。
3. 手把手实战:一个完整的灰色关联分析建模案例
理论说得再多,不如亲手算一遍。我们通过一个经典的案例来演示全过程。假设我们想分析某地区年度GDP(参考序列 ( X_0 ) )与三个因素:固定资产投资 ( X_1 )、社会消费品零售总额 ( X_2 )、净出口总额 ( X_3 ) 的关联程度。收集到最近5年的数据如下(单位:亿元):
| 年份 | GDP (X_0) | 固定资产投资 (X_1) | 社会消费品零售 (X_2) | 净出口 (X_3) |
|---|---|---|---|---|
| 2019 | 100 | 45 | 38 | 17 |
| 2020 | 110 | 50 | 40 | 20 |
| 2021 | 125 | 55 | 46 | 24 |
| 2022 | 140 | 62 | 52 | 26 |
| 2023 | 155 | 68 | 57 | 30 |
步骤1:确定分析序列
- 参考序列 ( X_0 = (100, 110, 125, 140, 155) )
- 比较序列 ( X_1 = (45, 50, 55, 62, 68) ), ( X_2 = (38, 40, 46, 52, 57) ), ( X_3 = (17, 20, 24, 26, 30) )
步骤2:对序列进行无量纲化处理(采用初值化)每个序列的所有数据都除以该序列的第一个数据。
- ( X_0' = (100/100, 110/100, 125/100, 140/100, 155/100) = (1.000, 1.100, 1.250, 1.400, 1.550) )
- ( X_1' = (45/45, 50/45, 55/45, 62/45, 68/45) = (1.000, 1.111, 1.222, 1.378, 1.511) )
- ( X_2' = (38/38, 40/38, 46/38, 52/38, 57/38) = (1.000, 1.053, 1.211, 1.368, 1.500) )
- ( X_3' = (17/17, 20/17, 24/17, 26/17, 30/17) = (1.000, 1.176, 1.412, 1.529, 1.765) )
处理后的数据,所有序列起点均为1,便于观察增长趋势。
步骤3:求差序列计算参考序列 ( X_0' ) 与每个比较序列 ( X_i' ) 在各点的绝对差。
- ( \Delta_1(k) = |X_0'(k) - X_1'(k)| = (0.000, 0.011, 0.028, 0.022, 0.039) )
- ( \Delta_2(k) = |X_0'(k) - X_2'(k)| = (0.000, 0.047, 0.039, 0.032, 0.050) )
- ( \Delta_3(k) = |X_0'(k) - X_3'(k)| = (0.000, 0.076, 0.162, 0.129, 0.215) )
步骤4:求两级最小差与最大差从所有差序列 ( \Delta_1, \Delta_2, \Delta_3 ) 中找出最小值和最大值。
- 全局最小差 ( a = \min(\Delta_1, \Delta_2, \Delta_3) = 0.000 )
- 全局最大差 ( b = \max(\Delta_1, \Delta_2, \Delta_3) = 0.215 )
步骤5:计算关联系数(取分辨系数 ( \rho = 0.5 ))代入公式 ( \gamma_{0i}(k) = \frac{a + \rho b}{\Delta_i(k) + \rho b} = \frac{0 + 0.50.215}{\Delta_i(k) + 0.50.215} = \frac{0.1075}{\Delta_i(k) + 0.1075} )
- 对于 ( X_1 ):
- ( \gamma_{01}(1) = 0.1075 / (0.000 + 0.1075) = 1.000 )
- ( \gamma_{01}(2) = 0.1075 / (0.011 + 0.1075) = 0.907 )
- ( \gamma_{01}(3) = 0.1075 / (0.028 + 0.1075) = 0.793 )
- ( \gamma_{01}(4) = 0.1075 / (0.022 + 0.1075) = 0.830 )
- ( \gamma_{01}(5) = 0.1075 / (0.039 + 0.1075) = 0.734 )
- 同理,计算 ( X_2 ) 和 ( X_3 ) 的关联系数。
为清晰起见,我们将所有关联系数整理成表:
| 年份 | ( \gamma_{01}(k) ) (与投资) | ( \gamma_{02}(k) ) (与消费) | ( \gamma_{03}(k) ) (与净出口) |
|---|---|---|---|
| 2019 | 1.000 | 1.000 | 1.000 |
| 2020 | 0.907 | 0.696 | 0.586 |
| 2021 | 0.793 | 0.734 | 0.399 |
| 2022 | 0.830 | 0.771 | 0.454 |
| 2023 | 0.734 | 0.683 | 0.333 |
步骤6:计算关联度对每个比较序列的关联系数求平均值。
- ( r_{01} = (1.000+0.907+0.793+0.830+0.734) / 5 = 0.853 )
- ( r_{02} = (1.000+0.696+0.734+0.771+0.683) / 5 = 0.777 )
- ( r_{03} = (1.000+0.586+0.399+0.454+0.333) / 5 = 0.554 )
步骤7:关联度排序( r_{01} (0.853) > r_{02} (0.777) > r_{03} (0.554) )
结论:在该地区GDP的增长中,固定资产投资的关联度最高(0.853),其次是社会消费品零售总额(0.777),净出口总额的关联度相对最低(0.554)。这表明,在此期间,投资拉动对该地区经济增长的趋势同步性最强,消费次之,净出口的同步性相对较弱。这为决策者提供了一个基于数据趋势的优先级参考。
4. 建模中的关键细节与常见“坑点”
灰色关联分析看似步骤固定,但在实际应用,尤其是编程实现或面对复杂数据时,有几个细节处理不好,很容易得到错误甚至相反的结果。
4.1 分辨系数 (\rho) 的选择:并非总是0.5
很多教程和代码默认将 ( \rho ) 设为0.5。这确实是一个稳健的默认值。但 ( \rho ) 的选择会影响关联度的区分度。其取值范围是 (0, 1)。
- ( \rho ) 越小:公式中 ( \rho \cdot b ) 项变小,使得关联系数 ( \gamma ) 对差序列 ( \Delta ) 的变化更敏感。当 ( \Delta ) 很小时,( \gamma ) 接近1;当 ( \Delta ) 稍大,( \gamma ) 会迅速下降。这增强了关联度的区分能力,但可能放大噪声的影响。
- ( \rho ) 越大:( \rho \cdot b ) 项变大,降低了 ( \Delta ) 在分母中的权重,使得关联系数整体被“拉升”,不同序列间的关联度数值会变得更接近,区分能力减弱,但结果更稳定。
实操心得:不要无脑用0.5。建议进行敏感性分析:尝试 ( \rho = 0.1, 0.3, 0.5, 0.7, 0.9 ) 等多个值,观察关联度排序是否稳定。如果排序在不同 ( \rho ) 下基本不变,说明你的分析结果是稳健的;如果排序发生剧烈变化,则需要警惕,可能是数据本身差异不大,或者存在异常点干扰,需要结合业务重新审视数据或采用其他方法辅助判断。
4.2 无量纲化方法的选择:初值化 vs 均值化 vs 其他
我们演示了最常用的初值化。但在某些场景下,均值化或其他方法(如区间化)可能更合适。
- 初值化:适合分析各因素相对于初始状态的发展态势。它的一个潜在问题是放大了初始值的重要性。如果某个序列的初始值是异常值(过高或过低),会对整个分析产生较大影响。
- 均值化:削弱了初始值的影响,强调序列围绕平均水平的波动形态。适合各个序列发展水平相当,且初始值不代表特殊意义的情况。
- 区间化:将序列数据映射到[0,1]区间。公式为 ( x_i'(k) = \frac{x_i(k) - \min(x_i)}{\max(x_i) - \min(x_i)} )。这种方法完全抹去了绝对量级,只保留形态,适用于量纲差异巨大且关注纯形态相似度的场景。
避坑指南:在论文或报告中,必须明确说明你采用了哪种无量纲化方法,并简要陈述理由。这是建模规范性的体现。通常,对于时间序列数据,初值化因其经济意义明确(发展速度)而被广泛采用。你可以同时用两种方法计算,如果结论一致,则增强了结论的可靠性。
4.3 参考序列的选择:谁是“因”,谁是“果”?
这是灰色关联分析在应用逻辑上最容易出错的地方。参考序列 ( X_0 ) 通常是我们关心的系统核心特征或输出结果(如GDP、产量、满意度)。比较序列 ( X_i ) 是可能的影响因素。但有时,哪个是参考序列并非一目了然。
例如,分析“技术创新投入”、“市场占有率”和“企业利润率”三者关系。如果你关心“哪些因素驱动利润增长”,则利润率应为参考序列。但如果你假设“高利润促进了创新和市场扩张”,则参考序列的选择就不同了。
核心原则:灰色关联分析本身不辨别因果关系,它只衡量趋势关联。因此,参考序列的选择取决于你的研究问题和理论假设。在建模前,必须基于领域知识明确因果关系假设,将假设中的“果”作为参考序列。如果方向搞反了,分析就失去了意义。
4.4 数据“负值”与“零值”的处理
原始灰色关联模型要求数据为非负序列,因为初值化等处理涉及除法。但在实际中,数据可能出现负值(如利润亏损、温度变化)或零值。
- 负值处理:常见的平移法,给所有序列的每一个数据加上同一个足够大的正数 ( C ),使所有数据变为正数。( C ) 的选取要确保平移后所有数据为正,且不改变序列间的相对关系(因为做的是加法平移,曲线形状不变)。例如,取 ( C = |\min(所有数据)| + 1 )。
- 零值处理(特别是在初值化时):如果序列的第一个数据 ( x_i(1) = 0 ),初值化会导致分母为零。此时必须避免使用初值化,改用均值化或区间化。如果序列中间出现零值,初值化本身可以进行,但需注意解释。
5. 进阶:绝对关联度、相对关联度与综合关联度
基础的灰色关联度(又称“邓氏关联度”)主要衡量的是序列几何形状的相似性。为了更全面地刻画序列间的关系,学者们后续发展出了绝对关联度、相对关联度和综合关联度的概念,形成了更丰富的灰色关联分析体系。
5.1 绝对关联度:关注“绝对量”的变化关联
绝对关联度的计算不依赖于无量纲化处理。它直接对原始序列的始点零化像(即每个序列的所有数据减去该序列的第一个数据)进行计算,关注的是序列绝对增量的关联程度。
设原始序列为 ( X_i = (x_i(1), x_i(2), ..., x_i(n)) )。
- 求始点零化像:( X_i^0 = (x_i(1)-x_i(1), x_i(2)-x_i(1), ..., x_i(n)-x_i(1)) = (0, x_i(2)-x_i(1), ..., x_i(n)-x_i(1)) )。
- 计算序列 ( X_i^0 ) 的模(可以理解为序列曲线与横轴所围面积的绝对值的一种度量)。
- 计算参考序列与比较序列的始点零化像之差的模。
- 通过模的运算公式得到绝对关联度 ( \epsilon_{0i} )。
绝对关联度反映的是两个序列从初始时刻开始,绝对变化量之间的接近程度。它对于数据本身的数值大小更为敏感。
5.2 相对关联度:关注“变化率”的关联
相对关联度就是我们前面重点介绍的、基于初值化序列计算的经典灰色关联度 ( r_{0i} )。因为它对序列进行了初值化处理,实际上关注的是各序列相对于自身起点的发展速度或变化率的相似性。它剥离了绝对数值大小的干扰,纯粹看增长(或变化)态势是否同步。
5.3 综合关联度:兼顾“量”与“率”
综合关联度 ( \rho_{0i} ) 是绝对关联度 ( \epsilon_{0i} ) 和相对关联度 ( r_{0i} ) 的加权平均: [ \rho_{0i} = \theta \cdot \epsilon_{0i} + (1 - \theta) \cdot r_{0i} ] 其中 ( \theta ) 是权重系数, ( 0 \le \theta \le 1 ),通常取0.5表示同等重视。
综合关联度既考虑了序列绝对变化量的接近程度,又考虑了相对变化态势的相似性,提供了一个更全面的关联性度量。当 ( \theta = 0 ) 时,综合关联度退化为相对关联度;当 ( \theta = 1 ) 时,退化为绝对关联度。
应用建议:在大多数社会经济分析中,我们更关心发展速度的协同性,因此相对关联度(经典方法)应用最广。在工程、物理等领域,如果绝对量的匹配也很重要,则可以考虑使用综合关联度,并通过调整 ( \theta ) 来体现对“量”和“率”的不同侧重。在论文中同时汇报多种关联度的结果并进行对比,能显著增加分析的深度和说服力。
6. 灰色关联分析在数学建模竞赛中的实战策略
灰色关联分析是数学建模竞赛,尤其是“评价类”和“因素分析类”赛题的利器。因为它原理直观、计算简单、对数据要求低、结果清晰,非常适合在有限时间内构建模型的一个模块。以下是一些实战策略和注意事项。
6.1 适用场景快速判断
遇到以下特征的赛题,可以优先考虑引入灰色关联分析:
- 题目要求对影响因素进行排序或筛选:例如,“分析影响城市空气质量的主要因素”、“评价哪些指标对共享单车使用率影响最大”。
- 数据样本量小,或信息不完全:只有近几年数据,无法做严格的统计分析。
- 需要将定性问题半定量化:题目中有一部分数据,还有一部分是专家打分或问卷调查得到的定性等级(如“好、中、差”),可以将定性数据量化后(如赋值为5,3,1)与其他定量数据一起进行灰色关联分析。
- 作为复杂模型的预处理或辅助模块:例如,先用灰色关联分析从海量指标中筛选出关联度最高的几个关键指标,再用这些指标构建预测模型(如回归、神经网络),可以降低模型复杂度,防止过拟合。
6.2 建模论文中的书写要点
在论文中描述灰色关联分析模型时,不能只摆公式和结果,必须体现建模思想。
- 模型准备部分:清晰定义参考序列和比较序列,说明选择它们的原因(基于题目假设)。明确说明数据预处理方法(如:“为消除量纲影响,采用初值化法对原始数据进行处理”)。
- 模型建立部分:给出关联系数和关联度的计算公式。一定要说明分辨系数 ( \rho ) 的取值及理由(如:“为平衡区分度与稳定性,参考现有文献,取分辨系数 ( \rho = 0.5 )”)。
- 模型求解部分:可以列表展示关键计算步骤,如无量纲化后的序列、差序列、关联系数矩阵。最终给出关联度及排序的清晰表格。
- 结果分析部分:这是拿分关键。不能只说“关联度排序为A>B>C”。要结合题目背景进行解读。例如:“计算结果显示,工业排放量(( r=0.89 ))与PM2.5浓度的关联度最高,其次是机动车保有量(( r=0.76 )),气象扩散条件的关联度相对较低(( r=0.61 ))。这表明在该区域,工业污染是影响空气质量的首要趋势性因素,机动车尾气是重要协同因素,而气象条件在观测期内与污染浓度的趋势同步性较弱。建议治理政策优先聚焦工业减排。”
- 模型检验与拓展:可以提及进行了敏感性分析(改变 ( \rho ) 值排序稳定),或计算了综合关联度进行对比,以体现模型的稳健性和思考的全面性。
6.3 与其他评价方法的联用
灰色关联分析很少单独作为最终解决方案,它常与其他方法联用,构建更强大的模型。
- 灰色关联-TOPSIS法:先用灰色关联分析法计算出各方案(比较序列)与理想方案(参考序列)的关联度,再将关联度作为TOPSIS法的输入,进行综合排序。这种方法结合了趋势相似性和距离接近性。
- 灰色关联-熵权法:熵权法是一种客观赋权法,根据指标数据的离散程度确定权重。可以先利用熵权法确定各评价指标的权重,再用加权后的数据计算灰色关联度,使得关联度结果融合了指标的重要性信息。
- 灰色关联-回归分析:如前所述,先用灰色关联分析筛选关键变量,再用筛选后的变量做回归预测,模型更简洁有效。
7. 代码实现与工具:从Excel到Python
掌握手工计算有助于理解原理,但在实际建模中,我们肯定要借助工具。这里介绍两种最常用的实现方式。
7.1 Excel实现:简单直观
对于数据量小、快速验证的情况,Excel完全够用。
- 数据录入:将参考序列和比较序列按列排好。
- 无量纲化:新增列,使用公式进行初值化或均值化计算。例如,初值化:在B2单元格输入
=B2/$B$2,然后向右向下填充。 - 求差序列:新增列,计算参考序列列与每个比较序列列的绝对值差。
- 求两级最值:用
MIN()和MAX()函数找出所有差序列中的最小值和最大值。 - 计算关联系数:根据公式,在新增列中计算每个差值的关联系数。公式中引用上一步求出的全局最小差和最大差单元格(绝对引用)。
- 计算关联度:用
AVERAGE()函数对每个比较序列的关联系数列求平均。
Excel小技巧:可以将最小差 ( a )、最大差 ( b ) 和分辨系数 ( \rho ) 放在单独的单元格中,在关联系数公式里引用这些单元格。这样,调整 ( \rho ) 值进行敏感性分析时,只需修改一个单元格,所有结果自动更新。
7.2 Python实现:灵活强大
对于数据量大、需要重复计算或集成到复杂分析流程中,Python是首选。这里给出一个清晰的、带有注释的函数实现。
import numpy as np import pandas as pd def grey_relation_analysis(reference_series, comparison_series, rho=0.5, method='initialization'): """ 灰色关联分析计算函数 Parameters: reference_series (list or np.array): 参考序列 (行向量). comparison_series (list of lists or 2D np.array): 比较序列集合,每一行是一个比较序列. rho (float): 分辨系数,默认0.5. method (str): 无量纲化方法,'initialization'(初值化) 或 'averaging'(均值化). Returns: tuple: (关联度列表, 关联系数矩阵) """ # 转换为numpy数组便于计算 X0 = np.array(reference_series, dtype=np.float64) X = np.array(comparison_series, dtype=np.float64) # m x n 矩阵,m个比较序列,n个数据点 m, n = X.shape # m: 比较序列个数, n: 数据点个数 # 1. 无量纲化 if method == 'initialization': # 初值化 X0_norm = X0 / X0[0] X_norm = X / X[:, 0:1] # 利用广播,每行除以该行第一个元素 elif method == 'averaging': # 均值化 X0_norm = X0 / np.mean(X0) X_norm = X / np.mean(X, axis=1, keepdims=True) else: raise ValueError("Method must be 'initialization' or 'averaging'") # 2. 计算差序列 diff = np.abs(X0_norm - X_norm) # m x n 矩阵 # 3. 找出全局最小差和最大差 min_diff = np.min(diff) max_diff = np.max(diff) # 4. 计算关联系数矩阵 correlation_coefficient = (min_diff + rho * max_diff) / (diff + rho * max_diff) # 5. 计算关联度 (对每个比较序列,即按行求平均) degree = np.mean(correlation_coefficient, axis=1) return degree.tolist(), correlation_coefficient.tolist() # 使用示例:以第3部分的案例数据 if __name__ == "__main__": # 参考序列: GDP X0 = [100, 110, 125, 140, 155] # 比较序列: [固定资产投资, 社会消费品零售, 净出口] X = [ [45, 50, 55, 62, 68], [38, 40, 46, 52, 57], [17, 20, 24, 26, 30] ] rho = 0.5 method = 'initialization' grey_degree, grey_coeff = grey_relation_analysis(X0, X, rho, method) print("各因素关联度:") for i, d in enumerate(grey_degree): print(f"因素{i+1}: {d:.4f}") print("\n关联度排序(从高到低):") sorted_indices = np.argsort(-np.array(grey_degree)) # 降序排列的索引 for idx in sorted_indices: print(f"因素{idx+1}: {grey_degree[idx]:.4f}") # 可以轻松改变rho进行敏感性分析 print("\n--- 敏感性分析 (改变rho) ---") for test_rho in [0.1, 0.3, 0.5, 0.7, 0.9]: deg, _ = grey_relation_analysis(X0, X, test_rho, method) print(f"rho={test_rho}: {[round(d,4) for d in deg]}")这个函数封装了核心流程,并提供了无量纲化方法的选择和敏感性分析的接口。在实际建模中,你可以直接调用它,并将结果用pandas的DataFrame漂亮地展示出来,集成到你的分析报告中。
灰色关联分析就像一把瑞士军刀,它可能不是最精密、最强大的工具,但在信息匮乏、系统复杂、需要快速把握主要矛盾的场景下,它总能以简洁优雅的方式,为我们揭示出数据背后那些若隐若现的“灰色”关联。掌握其原理,明晰其局限,熟练其应用,它将成为你数据分析工具箱中一件不可或缺的利器。