灰色关联度分析算法(包含matlab源码及实例)

    本文为整理后写出,不保证不会出现问题,若发现问题,请在评论区或私信指正!!!

目录

前言

1.确定母序列和子序列

2.数据归一化

        1)初值化

        2)均值化

3.计算绝对值差

4.计算灰色关联系数

PS:均值化数据演示

代码实现


前言

灰色关联度分析(Grey Relation Analysis,GRA)是一种多因素统计分析的办法,通俗来说,通过此算法,我们可以得到某个项目受其他因素影响的强弱,比如国内生产总值受到第一产业、第二产业、第三产业的影响,这三种产业对国内生产总值的影响分别有多大?这就是我们要讨论的问题,也是灰色关联度分析能解决的问题。

下面的讨论我们以下表的数据作为演示(数据仅供学习 不保证其真实性合理性)

表1 灾害直接经济损失及各相关影响因素原始表
年份 灾害直接经济损失(亿元) 农作物成灾面积(千公顷) 地震灾害损失(亿元) 海洋灾害损失(亿元) 森林火灾损失(亿元) 泥石流损失(亿元)
2000 2045.3 34374 14.6792 120.9 0.3069 49.4201
2001 1942.2 31793 14.8449 100.1 0.7409 34.8699
2002 1637.2 27319 1.4774 65.9 0.361 50.974
2003 1884.2 32516 46.604 80.52 3.7 50.4325
2004 1602.3 16279 9.4959 54.22 2.0213 40.8828

灰色关联度分析大致分为四步

1.确定母序列和子序列

        母序列:能反映系统行为特征的数据序列,在上面的例子中灾害直接经济损失就是母序列。

        子序列:影响系统行为的因素组成的数据序列,在上面的例子中农作物成灾面积、地震灾害损失、海洋灾害损失、森林火灾损失、泥石流损失就是子序列。

2.数据归一化

        归一化即去量纲,由于量纲不同,指标数值可能有大有小,如果不做处理大的数据必定淹没小数据的变量的影响,因此要减少数据的绝对数值的差异,统一到近似的范围内,这就是数据归一化。

        归一化主要有两种方式,分别是初值化均值化

        1)初值化

        简单来说,是用每个指标的数据除以最初的值。显然表1中的最初数据就是2000年的值[2045.3 34374 14.6792 120.9 0.3069 49.4201

        处理完后的数据如下(保留了四位小数)

表2.1 初值化后的数据
年份 灾害直接经济损失(亿元) 农作物成灾面积(千公顷) 地震灾害损失(亿元) 海洋灾害损失(亿元) 森林火灾损失(亿元) 泥石流损失(亿元)
2000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000
2001 0.9496 0.9249 1.0113 0.8280 2.4141 0.7056
2002 0.8005 0.7948 0.1006 0.5451 1.1763 1.0314
2003 0.9212 0.9460 3.1748 0.6660 12.0560 1.0205
2004 0.7834 0.4736 0.6469 0.4485 6.5862 0.8273

        2)均值化

        均值化是先算出母系列和各个子序列的平均值,然后每个指标的数据除以对应列的平均值。均值化的例子放在最后!!!

3.计算绝对值差

        这一步计算被评价指标序列与参考序列对应元素的绝对值差,参考序列一般是数据归一化后的母序列,即[1.00 , 0.95 , 0.80 , 0.92 , 0.78],具体的操作为假如有m列,后m-1列都对应减去第一列,然后取绝对值,得到m-1列的表格。             

表3.1 绝对值差
0 0 0 0 0
0.0247 0.0617 0.1216 1.4645 0.2440
0.0057 0.6998 0.2554 0.3758 0.2310
0.0247 2.2536 0.2552 11.1348 0.0993
0.3093 0.1365 0.3349 5.8028 0.0438

        随后在这个表格中取出最小值a=0和最大值b=11.1348

4.计算灰色关联系数

        对于表3的每一个数据,我们统称这个数为x,那么灰色关联系数的计算公式为

                \xi =\frac{a+\rho *b}{x+\rho*b},于是我们得到了灰色关联系数表(\rho为分辨系数 一般取0.5)。

表4.1 灰色关联系数表
1 1 1 1 1
0.9956 0.9890 0.9786 0.7917 0.9580
0.9990 0.8883 0.9561 0.9368 0.9602
0.9956 0.7119 0.9562 0.3333 0.9825
0.9473 0.9761 0.9433 0.4896 0.9922

        随后对每一列取平均值,就是该列影响因素与灾害直接经济损失的关联度

表5.1 灾害直接经济损失与各相关因素的关联度
农作物成灾面积 地震灾害损失 海洋灾害损失 森林灾害损失 泥石流损失
0.9875 0.9131 0.9668 0.7103 0.9786

PS:均值化数据演示

                

表1 灾害直接经济损失及各相关影响因素原始表
年份 灾害直接经济损失(亿元) 农作物成灾面积(千公顷) 地震灾害损失(亿元) 海洋灾害损失(亿元) 森林火灾损失(亿元) 泥石流损失(亿元)
2000 2045.3 34374 14.6792 120.9 0.3069 49.4201
2001 1942.2 31793 14.8449 100.1 0.7409 34.8699
2002 1637.2 27319 1.4774 65.9 0.361 50.974
2003 1884.2 32516 46.604 80.52 3.7 50.4325
2004 1602.3 16279 9.4959 54.22 2.0213 40.8828

        对每一列取均值 得到 [1822.24 , 28456 , 17.42028 , 84.328 , 1.42602 , 45.31586 ]

表2.2 均值化后的数据
年份 灾害直接经济损失(亿元) 农作物成灾面积(千公顷) 地震灾害损失(亿元) 海洋灾害损失(亿元) 森林火灾损失(亿元) 泥石流损失(亿元)
2000 1.1224 1.2079 0.8427 1.4337 0.2152 1.0906
2001 1.0658 1.1173 0.8522 1.1870 0.5196 0.7695
2002 0.8985 0.9600 0.0848 0.7815 0.2532 1.1249
2003 1.0340 1.1427 2.6753 0.9548 2.5946 1.1129
2004 0.8793 0.5721 0.5451 0.6430 1.4174 0.9022

        

表3.2 绝对值差
0.0855 0.2798 0.3113 0.9072 0.0318
0.0514 0.2137 0.1212 0.5463 0.2963
0.0616 0.8136 0.1170 0.6453 0.2264
0.1087 1.6413 0.0792 1.5606 0.0789
0.3072 0.3342 0.2363 0.5381 0.0229

表4.2 灰色关联系数表
0.9309 0.7665 0.7452 0.4882 0.9895
0.9672 0.8155 0.8956 0.6171 0.7552
0.9561 0.5161 0.8996 0.5754 0.8056
0.9077 0.3426 0.9374 0.3542 0.9377
0.7479 0.7304 0.7980 0.6208 1.0000

表5.2 灾害直接经济损失与各相关因素的关联度
农作物成灾面积 地震灾害损失 海洋灾害损失 森林灾害损失 泥石流损失
0.9020 0.6343 0.8552 0.5311 0.8976

代码实现

%灰色关联度分析
%以旅游收入为例 一共6行4列 行数代表2000-2005年 列数表示 国内生产总值 第一产业 第二产业 第三产业
%最终得到的结果代表三产业对国内生产总值的关联度
clear;clc;
load 灰色关联度分析-灾害直接经济损失.mat
[n,m]=size(X);

%初值化例子 灾害直接经济损失 
%均值化例子 国内生产总值

%初值化和均值化选择一个就可以

%均值化
aveg=mean(X);%取每一列的平均值
for j=1:m
   update_x(:,j)=X(:,j)./aveg(:,j);%每一列的数据除以这一列的平均值
end

%初值化
% for j=1:m
%     update_x(:,j)=X(:,j)./X(1,j);%每一列的数据除以这一列的初始值
% end


for i=1:n
    for j=2:m
        temp_x(i,j-1)=abs(update_x(i,j)-update_x(i,1));%update_x第一列与后面几列的差值的绝对值
    end
end
a=min(min(temp_x));%temp_x矩阵里的最小值
b=max(max(temp_x));%temp_x矩阵里的最大值
p=0.5;%分辨系数 一般是0.5
XX=(a+p*b)./(temp_x+p*b);
R=mean(XX,1)%灰色关联度


   

               

你可能感兴趣的:(数学建模,matlab,算法)