> 技术文档 > 数学建模——灰色关联分析

数学建模——灰色关联分析


1.概念

1.灰色系统

灰色系统理论由中国学者邓聚龙于1982年提出,是一种研究“部分信息已知、部分信息未知”的不确定性系统的理论。其核心思想是通过对有限数据的生成、开发和提取,挖掘隐藏规律,实现系统行为的预测和控制。灰色系统介于“白色系统”(信息完全明确)与“黑色系统”(信息完全未知)之间,适用于贫信息、小样本的复杂系统分析。

灰色系统的主要特点

  1. 数据需求低无需大量样本,即使少量数据也能建模。
  2. 动态预测能力:通过累加生成(AGO)或累减生成(IAGO)处理原始数据,弱化随机性,强化规律性。
  3. 应用广泛:涵盖经济、农业、工程、生态等地方,如GDP预测、灾害评估等。

核心模型与方法

  1. 灰色预测模型(GM)

        最典型的是GM(1,1)模型,通过一阶微分方程描述数据趋势。

     2.灰色关联分析
        用于评估因素间关联程度,计算关联系数: 

关联分析 

就是系统地分析因素,回答众多因素中:什么因素重要,什么因素不重要;哪些因素影响大,哪些影响小等等

 灰色关联度分析

灰色关联度分析(Grey Relational Analysis, GRA)是一种基于灰色系统理论的数学方法,用于量化系统中各因素间的关联程度。其核心思想是通过比较数据序列的几何形状相似性,判断各因素对主行为序列的影响强度适用于小样本、贫信息的不确定性系统分析

几何形状越相似——>发展态势越接近——>关联程度越大

2.关联分析步骤 

1. 母序列(又称参考序列、母指标)
能反映系统行为特征的数据序列,类似于因变量

2. 子序列(又称比较序列、子指标)
影响系统行为的因素组成的数据序列,类似于自变量 X

3. 数据预处理
由于不同要素具有不同量纲和数据范围,因此需要预处理去量纲,统一到相近的范围内。
方法:先求每个指标的均值,再用指标中的元素除以其均值

X_{hi}\' = \\frac{X_{hi}}{\\displaystyle \\frac{1}{m}\\sum_{k=1}^{m} X_{ki}}, \\quad i=1,2,\\dots,m

4.计算灰色关联系数

母序列是数据预处理后每个候选人指标的最大值
计算子序列中各个指标与母序列的关联系数。

  • 两极最小差:a = \\min_i \\min_k \\bigl|x_0(k)-x_i(k)\\bigr|

  • 两极最大差:b = \\max_i \\max_k \\bigl|x_0(k)-x_i(k)\\bigr|

构造灰色关联系数

<img alt=\"\\xi_i(k)=\\frac{a+\\rho\\,b}{\\bigl|x_0(k)-x_i(k)\\bigr|+\\rho\\,b},\\qquad 0

其中 ρ 为分辨系数,一般取 0.5。

5.计算灰色关联度

r = \\frac{1}{n}\\sum_{k=1}^{n}\\xi(k) = \\frac{1}{n}\\sum_{k=1}^{n}y\\!\\bigl(x_0(k),\\,x_i(k)\\bigr) 

2.代码 

1.mean函数

 在MATLAB中,mean函数用于计算数组或矩阵中元素的平均值。支持对向量、矩阵、多维数组等数据类型进行操作,并可指定沿特定维度计算。

1.默认计算: 

M = mean(A) 

对向量A返回所有元素的平均值;对矩阵A返回每列的均值(沿第一维计算)。

2.指定维度计算:

M = mean(A, dim) 

dim为维度参数。例如:

  • dim=1:计算每列的均值(默认行为)。
  • dim=2:计算每行的均值。

2.两类代码

我也是看了半天,这两个不是一个东西

项目 灰色关联分析(GRA) 灰色关联评价(GRE) 目的 分析因素对结果的影响程度,识别关键驱动因素 对多个对象或方案进行排序或优劣评价 是否有参考序列 有,通常是母序列(参考序列),用于衡量子序列的影响程度 有,通常是理想最优序列,用于衡量各对象与理想值的接近程度 输出结果 各因素与参考序列的关联度排序 各评价对象与理想序列的接近程度排序 应用示例 分析哪些因素对经济增长影响最大 评估多个老师绩效谁最接近“理想教师” 是否用于决策 一般用于解释性分析,辅助理解系统结构 多用于评价决策,如选优、排序、分级等
%灰色关联分析%灰色关联分析用于系统分析例题的讲解clear; clc;A = input(\'请输入初始矩阵=\'); % 输入初始矩阵Mean = mean(A); % 求出每一列的均值以供后续的数据预处理A = A ./ repmat(Mean, size(A,1), 1); % 数据预处理(去量纲)disp(\'预处理后的矩阵为:\'); disp(A);Y = A(:,1); % 母序列X = A(:,2:end); % 子序列X0_Xi = abs(X - repmat(Y,1,size(X,2))); % 计算 |x0 - Xi| 矩阵a = min(min(X0_Xi));  % 两级最小差b = max(max(X0_Xi));  % 两级最大差rho = 0.5; % 分辨系数gamma = (a + rho*b) ./ (X0_Xi + rho*b); % 关联系数矩阵disp(\'子序列中各个指标的灰色关联度分别为:\');disp(mean(gamma));
%灰色关联评价clear; clc;A = input(\'请输入初始矩阵=\'); % 输入初始矩阵[n,m]=size(A);disp([\'共有\' num2str(n) \'个评价对象\',num2str(m) \'个评价指标\']);Judge = input([\'这\' num2str(m) \'个指标是否需要正向化处理,需要输入1,不需要输入0:\']);if Judge==1 Position=input(\'请输入需要正向化处理的指标所在的列,例如第2,3,6列现需要处理,那么输入[2,3,6]:\'); disp(\'请输入需要处理的这些列的指标类型(1:极小型,2:中间型,3:区间型)\'); Type=input(\'例如:第2列是极小型,第3列是区间型,第6列是中间型,需要输入[1,3,2]\'); for i=1:size(position,2) A(:,Position(i))=Positivization(A(:,Position(i)),Type(i),Position(i)); end disp(\'正向化后矩阵X=\'); disp(A);endMean = mean(A); % 求出每一列的均值以供后续的数据预处理A = A ./ repmat(Mean, size(A,1), 1); % 数据预处理(去量纲)disp(\'预处理后的矩阵为:\'); disp(A);Y = max(A,[],2); % 母序列X = A; % 子序列absX0_Xi = abs(X - repmat(Y,1,size(X,2))); % 计算 |x0 - Xi| 矩阵a = min(min(absX0_Xi));  % 两级最小差b = max(max(absX0_Xi));  % 两级最大差rho = 0.5; % 分辨系数gamma = (a + rho*b) ./ (absX0_Xi + rho*b); % 关联系数矩阵weight= mean(gamma)/sum(mean(gamma));%相当于算出了每一个因素的权重,标准化后乘到数据里面score= sum(X .* repmat(weight,size(X,1),1),2);stand_S=score/sum(score);%最终结果也要标准化一次% [sorted_S,index]=sort(stand_S,\'descend\');

(其实不管用啥方法似乎都不会对最终结果有太大影响)