数学建模——灰色关联分析
1.概念
1.灰色系统
灰色系统理论由中国学者邓聚龙于1982年提出,是一种研究“部分信息已知、部分信息未知”的不确定性系统的理论。其核心思想是通过对有限数据的生成、开发和提取,挖掘隐藏规律,实现系统行为的预测和控制。灰色系统介于“白色系统”(信息完全明确)与“黑色系统”(信息完全未知)之间,适用于贫信息、小样本的复杂系统分析。
灰色系统的主要特点
- 数据需求低:无需大量样本,即使少量数据也能建模。
- 动态预测能力:通过累加生成(AGO)或累减生成(IAGO)处理原始数据,弱化随机性,强化规律性。
- 应用广泛:涵盖经济、农业、工程、生态等领域,如GDP预测、灾害评估等。
核心模型与方法
灰色预测模型(GM)
最典型的是GM(1,1)模型,通过一阶微分方程描述数据趋势。
2.灰色关联分析
用于评估因素间关联程度,计算关联系数:
关联分析
就是系统地分析因素,回答众多因素中:什么因素重要,什么因素不重要;哪些因素影响大,哪些影响小等等
灰色关联度分析
灰色关联度分析(Grey Relational Analysis, GRA)是一种基于灰色系统理论的数学方法,用于量化系统中各因素间的关联程度。其核心思想是通过比较数据序列的几何形状相似性,判断各因素对主行为序列的影响强度,适用于小样本、贫信息的不确定性系统分析。
几何形状越相似——>发展态势越接近——>关联程度越大
2.关联分析步骤
1. 母序列(又称参考序列、母指标)
能反映系统行为特征的数据序列,类似于因变量
2. 子序列(又称比较序列、子指标)
影响系统行为的因素组成的数据序列,类似于自变量 X
3. 数据预处理
由于不同要素具有不同量纲和数据范围,因此需要预处理去量纲,统一到相近的范围内。
方法:先求每个指标的均值,再用指标中的元素除以其均值。
4.计算灰色关联系数
母序列是数据预处理后每个候选人指标的最大值
计算子序列中各个指标与母序列的关联系数。
两极最小差:
两极最大差:
构造灰色关联系数
其中 ρ 为分辨系数,一般取 0.5。
5.计算灰色关联度
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==1Position=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));enddisp('正向化后矩阵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');
(其实不管用啥方法似乎都不会对最终结果有太大影响)