灰色关联分析(GRA)的理论及应用(matlab和python)


什么是灰色关联分析

灰色关联分析是指对一个系统发展变化态势的定量描述和比较的方法,其基本思想是通过确定参考数据列和若干个比较数据列的几何形状相似程度来判断其联系是否紧密,它反映了曲线间的关联程度。

通常可以运用此方法来分析各个因素对于结果的影响程度,也可以运用此方法解决随时间变化的综合评价类问题,其核心是按照一定规则确立随时间变化的母序列,把各个评估对象随时间的变化作为子序列,求各个子序列与母序列的相关程度,依照相关性大小得出结论。


灰色关联分析的步骤

灰色关联分析的具体计算步骤如下:

第一步:确定分析数列。

确定反映系统行为特征的参考数列和影响系统行为的比较数列。反映系统行为特征的数据序列,称为参考数列。影响系统行为的因素组成的数据序列,称比较数列。

(1)参考数列(又称母序列)为 Y = Y ( k ) ∣ k = 1 , 2... n Y={Y(k) | k = 1,2...n} Y=Y(k)k=1,2...n

(2)比较数列(又称子序列)为 X i = X i ( k ) ∣ k = 1 , 2... n , i = 1 , 2... m X_i={X_i(k) | k = 1,2...n},i = 1,2...m Xi=Xi(k)k=1,2...n,i=1,2...m

第二步,变量的无量纲化

由于系统中各因素列中的数据可能因量纲不同,不便于比较或在比较时难以得到正确的结论。因此在进行灰色关联度分析时,一般都要进行数据的无量纲化处理。主要有一下两种方法
  
(1)初值化处理: x i ( k ) = x i ( k ) x i ( 1 ) , k = 1 , 2... n ; i = 0 , 1 , 2... m x_i(k)=\frac{x_i(k)}{x_i(1)},k=1,2...n;i=0,1,2...m xi(k)=xi(1)xi(k),k=1,2...n;i=0,1,2...m

(2)均值化处理: x i ( k ) = x i ( k ) x i ˉ , k = 1 , 2... n ; i = 0 , 1 , 2... m x_i(k)=\frac{x_i(k)}{\bar{x_i}},k=1,2...n;i=0,1,2...m xi(k)=xiˉxi(k),k=1,2...n;i=0,1,2...m

其中 k k k 对应时间段, i i i 对应比较数列中的一行(即一个特征)

第三步,计算关联系数

与的关联系数

△ i ( k ) = ∣ y ( k ) − x i ( k ) ∣ \triangle_i(k)=|y(k)-x_i(k)| i(k)=y(k)xi(k),则
  这里写图片描述

ρ ∈ ( 0 , ∞ ) \rho\in(0,\infty) ρ(0,),称为分辨系数。ρ越小,分辨力越大,一般ρ的取值区间为 ( 0 , 1 ) (0,1) (0,1),具体取值可视情况而定。当 ρ ≤ 0.5463 \rho\le0.5463 ρ0.5463时,分辨力最好,通常取 ρ = 0.5 ρ = 0.5 ρ=0.5

第四步,计算关联度

因为关联系数是比较数列与参考数列在各个时刻(即曲线中的各点)的关联程度值,所以它的数不止一个,而信息过于分散不便于进行整体性比较。因此有必要将各个时刻(即曲线中的各点)的关联系数集中为一个值,即求其平均值,作为比较数列与参考数列间关联程度的数量表示,关联度 r i ri ri公式如下:

r i = 1 n ∑ k = 1 n ξ i ( k ) , k = 1 , 2 , Λ , n r_i=\frac{1}{n}\sum_{k=1}^n\xi_i(k),k=1,2,\Lambda,n ri=n1k=1nξi(k),k=1,2,Λ,n

第五步,关联度排序

关联度按大小排序,如果 r 1 &lt; r 2 r1 &lt; r2 r1<r2,则参考数列 y y y与比较数列 x 2 x2 x2更相似。

在算出 X i ( k ) Xi(k) Xi(k)序列与 Y ( k ) Y(k) Y(k)序列的关联系数后,计算各类关联系数的平均值,平均值 r i ri ri就称为 Y ( k ) Y(k) Y(k) X i ( k ) Xi(k) Xi(k)的关联度。


灰色关联分析的实例

下表为某地区国内生产总值的统计数据(以百万元计),问该地区从2000年到2005年之间哪一种产业对GDP总量影响最大。

年份国内生产总值第一产业第二产业第三产业
20001988386839763
20012061408846808
20022335422960953
2003275048212581010
2004335651115771268
2005380656118931352

步骤1:确立母序列

在此需要分别将三种产业与国内生产总值比较计算其关联程度,故母序列为国内生产总值。若是解决综合评价问题时则母序列可能需要自己生成,通常选定每个指标或时间段中所有子序列中的最佳值组成的新序列为母序列。

步骤2:无量纲化处理

在此采用均值化法,即将各个序列每年的统计值与整条序列的均值作比值,可以得到如下结果:

年份国内生产总值第一产业第二产业第三产业
20000.73200.83610.68280.7439
20010.75880.88380.68850.7878
20020.85970.91410.78120.9292
20031.01251.04401.02370.9847
20041.23561.10691.28331.2363
20051.40131.21521.54051.3182

步骤3:计算每个子序列中各项参数与母序列对应参数的关联系数

这里写图片描述

其中 ξ i ( k ) ξ_i(k) ξi(k)表示第 i i i个子序列的第 k k k个参数与母序列(即0序列)的第 k k k个参数的关联系数,$\rho\ 为 分 辨 系 数 取 值 范 围 在 为分辨系数取值范围在 [0,1]$,其取值越小求得的关联系数之间的差异性越显著,在此取为0.5进行计算可得到如下结果:

年份S01(t)S02(t)S03(t)
20000.47550.65910.8933
20010.42990.57390.7681
20020.63580.54650.5767
20030.75270.89930.7758
20040.42280.66611.0000
20050.33580.40370.5322

步骤4:计算关联度

用公式 r i = 1 n ∑ k = 1 n ξ i ( k ) , k = 1 , 2 , Λ , n r_i=\frac{1}{n}\sum_{k=1}^n\xi_i(k),k=1,2,\Lambda,n ri=n1k=1nξi(k),k=1,2,Λ,n, 可以得到 r 1 = 0.5088 , r 2 = 0.6248 , r 3 = 0.7577 r1 = 0.5088,r2 = 0.6248,r3 = 0.7577 r1=0.5088r2=0.6248r3=0.7577,通过比较三个子序列与母序列的关联度可以得出结论:该地区在2000年到2005年期间的国内生产总值受到第三产业的影响最大。


灰色关联分析matlab的实现

clc;
close;
clear all;
x=xlsread('data.xlsx');
x=x(:,2:end)';
column_num=size(x,2);
index_num=size(x,1);

% 1、数据均值化处理
x_mean=mean(x,2);
for i = 1:index_num
    x(i,:) = x(i,:)/x_mean(i,1);
end
% 2、提取参考队列和比较队列
ck=x(1,:)
cp=x(2:end,:)
cp_index_num=size(cp,1);

%比较队列与参考队列相减
for j = 1:cp_index_num
    t(j,:)=cp(j,:)-ck;
end
%求最大差和最小差
mmax=max(max(abs(t)))
mmin=min(min(abs(t)))
rho=0.5;
%3、求关联系数
ksi=((mmin+rho*mmax)./(abs(t)+rho*mmax))

%4、求关联度
ksi_column_num=size(ksi,2);
r=sum(ksi,2)/ksi_column_num;

%5、关联度排序,得到结果r3>r2>r1
[rs,rind]=sort(r,'descend');

运行结果:
在这里插入图片描述


灰色关联分析python的实现

import pandas as pd
x=pd.read_excel('data.xlsx')
x=x.iloc[:,1:].T

# 1、数据均值化处理
x_mean=x.mean(axis=1)
for i in range(x.index.size):
    x.iloc[i,:] = x.iloc[i,:]/x_mean[i]

# 2、提取参考队列和比较队列
ck=x.iloc[0,:]
cp=x.iloc[1:,:]

# 比较队列与参考队列相减
t=pd.DataFrame()
for j in range(cp.index.size):
    temp=pd.Series(cp.iloc[j,:]-ck)
    t=t.append(temp,ignore_index=True)

#求最大差和最小差
mmax=t.abs().max().max()
mmin=t.abs().min().min()
rho=0.5
#3、求关联系数
ksi=((mmin+rho*mmax)/(abs(t)+rho*mmax))


#4、求关联度
r=ksi.sum(axis=1)/ksi.columns.size

#5、关联度排序,得到结果r3>r2>r1
result=r.sort_values(ascending=False)

  • 179
    点赞
  • 1443
    收藏
    觉得还不错? 一键收藏
  • 131
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 131
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值