原理
灰色关联分析(Grey Relational Analysis, GRA)是一种多因素统计分析方法,它主要用于处理小样本、贫信息不确定性问题。灰色系统理论是基于部分已知信息和部分未知信息的系统,由我国学者邓聚龙教授于1982年提出。灰色关联分析可以用于评估不同序列之间的关联程度,广泛应用于工程、经济、环境科学等多个领域。
灰色关联分析的基本步骤:
确定比较序列和参考序列:
- 比较序列是指需要与参考序列进行对比的多个序列。
- 参考序列是作为标准或目标的序列,通常选择最优或者最差的序列作为参考。
对原始数据进行无量纲化处理:
- 由于不同指标的数据可能具有不同的量纲(单位),为了消除量纲的影响,需要对原始数据进行无量纲化处理,常用的方法有初值化、均值化等。
计算关联系数:
- 根据公式计算比较序列中的每个点与参考序列对应点之间的关联系数。关联系数反映了两序列在某一点上的关联程度,其值一般介于0和1之间。
计算关联度:
- 关联度是对所有时间点上关联系数的一个综合评价,通过加权平均或者其他方式得到。
根据关联度排序:
- 对比序列按照关联度大小排序,关联度越大说明该序列与参考序列越相似,反之则差异越大。
结果分析:
应用实例:
例如,在评估某个地区经济发展状况时,可以选取GDP、人均收入、工业总产值等若干个经济指标构成比较序列,以全国平均水平或者理想水平作为参考序列,通过灰色关联分析找出哪些因素与经济发展最相关,从而为政策制定提供参考。
灰色关联分析的优点在于它不需要大量的样本数据,也不要求数据服从特定的概率分布,因此对于一些难以获取大量数据的情况非常适用。但是,它的缺点是主观性较强,比如在选择参考序列、权重分配等方面可能会引入人为因素,影响分析结果的客观性。
代码
code1(无需正向化)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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); absX0_Xi = abs(X - repmat(Y,1,size(X,2))) a = min(min(absX0_Xi)) b = max(max(absX0_Xi)) rho = 0.5; gamma = (a+rho*b) ./ (absX0_Xi + rho*b) disp('子序列中各个指标的灰色关联度分别为:') disp(mean(gamma))
|
code2(要判断是否需要正向化)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| clear;clc
X=input('指标矩阵A='); [n,m] = size(X); 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) X(:,Position(i)) = Positivization(X(:,Position(i)),Type(i),Position(i)); end disp('正向化后的矩阵 X = ') disp(X) end
Mean = mean(X); Z = X ./ repmat(Mean,size(X,1),1); disp('预处理后的矩阵为:'); disp(Z)
Y = max(Z,[],2); X = Z;
absX0_Xi = abs(X - repmat(Y,1,size(X,2))) 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')
|
用于正向化的函数
Inter2Max
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| function [posit_x] = Inter2Max(x,a,b) r_x = size(x,1); M = max([a-min(x),max(x)-b]); posit_x = zeros(r_x,1); for i = 1: r_x if x(i) < a posit_x(i) = 1-(a-x(i))/M; elseif x(i) > b posit_x(i) = 1-(x(i)-b)/M; else posit_x(i) = 1; end end end
|
Mid2Max
1 2 3 4
| function [posit_x] = Mid2Max(x,best) M = max(abs(x-best)); posit_x = 1 - abs(x-best) / M; end
|
Min2Max
1 2 3 4
| function [posit_x] = Min2Max(x) posit_x = max(x) - x; end
|
Positivization
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
function [posit_x] = Positivization(x,type,i)
if type == 1 disp(['第' num2str(i) '列是极小型,正在正向化'] ) posit_x = Min2Max(x); disp(['第' num2str(i) '列极小型正向化处理完成'] ) disp('~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~') elseif type == 2 disp(['第' num2str(i) '列是中间型'] ) best = input('请输入最佳的那一个值: '); posit_x = Mid2Max(x,best); disp(['第' num2str(i) '列中间型正向化处理完成'] ) disp('~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~') elseif type == 3 disp(['第' num2str(i) '列是区间型'] ) a = input('请输入区间的下界: '); b = input('请输入区间的上界: '); posit_x = Inter2Max(x,a,b); disp(['第' num2str(i) '列区间型正向化处理完成'] ) disp('~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~') else disp('没有这种类型的指标,请检查Type向量中是否有除了1、2、3之外的其他值') end end
|