【数学建模】灰色关联(Matlab代码实现)

目录

1 灰色关联理论

2 算例及Matlab代码实现

2.1 算例1

2.2 算例2 

 2.3 算例3

2.4 算例4 

3 写在最后


1 灰色关联理论


灰色关联分析l是由邓聚龙教授于1982年提出的,也称“邓氏灰色关联法”。方法以部分信息已知 ,部分信息未知的“贫信息”为研究对象,通过对部分已知信息的生成和开发,实现对现实世界的定量描述。其基本思路是根据序列曲线的几何形状的相似程度来判断联系的紧密性,曲线越接近比较序列与参考序列的关联度越大,反之越小。灰色关联法能较好地客服回归分析中的不足,在样本量较小的“贫信息”中能较准确的找出关联性。

灰色关联分析法的优势在于,它弥补了采用数理统计方法系统分析所导致的缺憾,对样本量的多少和样本有无规律都适用,而且计算量小,十分方便,更不会出现与定性结果不符合的情况。但是灰色关联分析仅在我国有部分学者使用,在国际上并没有得到太多认可,而且当数据量较大的时候,使用标准化回归的方法是更好的选择,只有在数据很少万不得已的情况下,才考虑灰色关联分析,当然,你也可以两者综合考虑。

2 算例及Matlab代码实现

2.1 算例1

1)算例:

其中指标,x1:货物运输量;x2:港口货物吞吐量;x3:货物周转量;x4:GDP;x5:财政收入x6:城市居民人均可支配收入;x7:农村居民人均净收入。现研究x4-x7指标与x1指标之间的灰色关联度。数据表格如下:

年份 x1 x2 x3 x4 x5 x6 x7
2007 22578 27569 4987 2567.7 267.98 1.5429 1.172
2008 25698 29484 5048 3131 348.51 1.8546 1.2514
2009 27896 31589 5129 3858.2 429.1 2.0369 1.0254
2010 29540 34894 5569 4417.7 541.29 2.2589 1.189
2011 31058 36478 5783 5158.1 647.25 2.4276 1.4213
2012 35980 38695 6045 6150.1 736.45 2.5678 1.5304
2013 39483 40746 6259 7002.8 850 2.8546 1.7421

2)Matlab代码实现

代码属于模板类型,把数据换成自己的就行:来源:灰色关联法 —— matlab

clc;
clear;
%读取数据
data=xlsread('算例1.xlsx');
%数据标准化
data1=mapminmax(data',0.002,1); %标准化到0.002-1区间
data1=data1';
%%绘制 x1,x4,x5,x6,x7 的折线图,这里数据换成自己的
figure(1)
t=[2007:2013];
plot(t,data1(:,1),'Color','r','LineWidth',1.5)
hold on 
for i=1:4
    plot(t,data1(:,3+i),'--','LineWidth',1.2)
    hold on
end
xlabel('year')
legend('x1','x4','x5','x6','x7')
title('灰色关联分析')
 
%%计算灰色相关系数
%得到其他列和参考列相等的绝对值
for i=4:7
    data1(:,i)=abs(data1(:,i)-data1(:,1));
end
 
%得到绝对值矩阵的全局最大值和最小值
data2=data1(:,4:7);
d_max=max(max(data2));
d_min=min(min(data2));
%灰色关联矩阵
a=0.5;   %分辨系数
data3=(d_min+a*d_max)./(data2+a*d_max);
xishu=mean(data3);
disp(' x4,x5,x6,x7 与x1之间的灰色关联度分别为:')
disp(xishu)

【数学建模】灰色关联(Matlab代码实现)_第1张图片

【数学建模】灰色关联(Matlab代码实现)_第2张图片

2.2 算例2 

1)算例

分析产业对GDP的影响程度:

数据:

年份 国内生产总值 第一产业 第二产业 第三产业
2000 1988 386 839 763
2001 2061 408 846 808
2002 2335 422 960 953
2003 2750 482 1258 1010
2004 3356 511 1577 1268
2005 3806 561 1893 1352

2)Matlab代码实现

代码也是属于把数据换成自己的就可以了。来源:灰色关联案例与代码

clc;
close;
clear all;
x=xlsread('算例2.xlsx');
%load data.mat;
x=x(:,2:end)';%所有列,2到最后一列
%===获取行数列数=====
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);

%==2.1 比较队列与参考队列相减===
for j = 1:cp_index_num
    t(j,:)=cp(j,:)-ck;
end
%===2.2 求最大差和最小差====
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')

disp('=====关联度的大小=========')
rs
disp('=====关联度的排序=========')
rind

 【数学建模】灰色关联(Matlab代码实现)_第3张图片

 2.3 算例3

用算例1的方法应用在算例2上,简单教学

clc;
clear;
%读取数据
data=xlsread('算例2.xlsx');
%数据标准化
data1=mapminmax(data',0.002,1); %标准化到0.002-1区间
data1=data1';
%%绘制 x1,x4,x5,x6,x7 的折线图,这里数据换成自己的
figure(1)
t=[2000:2005];
plot(t,data1(:,1),'Color','r','LineWidth',1.5)
hold on 
for i=1:4
    plot(t,data1(:,1+i),'--','LineWidth',1.2)
    hold on
end
xlabel('year')
legend('国内生产总值','第一产业',	'第二产业',	'第三产业')
title('灰色关联分析')
 
%%计算灰色相关系数
%得到其他列和参考列相等的绝对值
for i=2:4
    data1(:,i)=abs(data1(:,i)-data1(:,1));
end
 
%得到绝对值矩阵的全局最大值和最小值
data2=data1(:,2:4);
d_max=max(max(data2));
d_min=min(min(data2));
%灰色关联矩阵
a=0.5;   %分辨系数
data3=(d_min+a*d_max)./(data2+a*d_max);
xishu=mean(data3);
disp('第一产业,第二产业,第三产业与国内生产总值之间的灰色关联度分别为:')
disp(xishu)

【数学建模】灰色关联(Matlab代码实现)_第4张图片

【数学建模】灰色关联(Matlab代码实现)_第5张图片

2.4 算例4 

1)算例

灰色关联分析评价河流情况

数据:

河流 含氧量 PH值 细菌总数(个/ml) 植物性营养物量(ppm)
A 4.69 6.59 51 11.94
B 2.03 7.86 19 6.46
c 9.11 6.31 46 8.91
D 8.61 7.05 46 26.43
E 7.13 6.5 50 23.57
F 2.39 6.77 38 24.62
G 7.69 6.79 38 6.01
H 9.3 6.81 27 31.57
I 5.45 7.62 5 18.46
J 6.19 7.27 17 7.51
K 7.93 7.53 9 6.52
L 4.4 7.28 17 25.3
M 7.46 8.24 23 14.42
N 2.01 5.55 47 26.31
o 2.04 6.4 23 17.91
p 7.73 6.14 52 15.72
Q 6.35 7.58 25 29.46
R 8.29 8.41 39 12.02
s 3.54 7.27 54 3.16
T 7.44 6.26 8 28.41

2)Matlab代码 

主要也是换取自己的数据即可,代码来源:灰色关联分析+Matlab代码实现

%灰色关联分析评价河流情况
clear;clc;
load case4.mat;
%获取行数列数
r = size(case4,1);
c = size(case4,2);
%首先,把我们的原始指标矩阵正向化
%第二列中间型--->极大型
middle = input('请输入最佳的中间值:');
M = max(abs(case4(:,2)-middle));
for i=1:r
      case4(i,2) = 1-abs(case4(i,2)-middle)/M;
end
%第三列极小型--->极大型
max_value = max(case4(:,3)); 
case4(:,3) = abs(case4(:,3)-max_value);
%第四列区间型--->极大型
a = input('请输入区间的下界:');
b = input('请输入区间的下界:');
M = max(a-min(case4(:,4)),max(case4(:,4))-b);
for i=1:r
       if (case4(i,4)=a)
           case4(i,4) = 1;
       else
           case4(i,4) = 1-(case4(i,4)-b)/M;
       end
end
disp('正向化后的矩阵为:');
disp(case4);
%把正向化后的矩阵进行预处理,消除量纲的影响
avg = repmat(mean(case4),r,1);
new_X = case4./avg;
%将预处理后的矩阵每一行的最大值取出,当成母序列(虚构的)
Y = max(new_X,[],2);
%计算各个指标和母序列的灰色关联度
%先把new_X矩阵所有元素都减去母序列中同行的元素,并取绝对值
Y2 = repmat(Y,1,c);
new_X = abs(new_X-Y2);
a = min(min(new_X)); %全矩阵最小值
b = max(max(new_X)); %全矩阵最大值
ro = 0.5;
new_X = (a+ro*b)./(new_X+ro*b);
disp('===========各个指标对于母序列的灰色关联度为:========================');
gamma = mean(new_X)
%计算各个指标的权重
disp('===============各个指标的权重为:=================');
weight = gamma./(sum(gamma,2))
%-------------------------------------------------------------------------------------------------------
%继续TOPSIS的步骤:对正向化后的矩阵X进行标准化(原矩阵除以每一列元素平方之和的开方)
temp1 = case4.*case4;               %先让每每一个元素平方
temp2 = sum(temp1);         %再对每一列求和
temp3 = temp2.^0.5;         %再把结果开方
temp4 = repmat(temp3,r,1);  %把开方后的结果按行复制r行
disp('******标准化后的矩阵为:');
Z = case4./temp4               %原矩阵除以每一列元素平方之和的开方
Z_max = max(Z)           %获得Z每一列中最大的元素
Z_min = min(Z)           %获得Z每一列中最小的元素
D_max = sum(weight.*(Z-repmat(Z_max,r,1)).^2,2).^0.5
D_min = sum(weight.*(Z-repmat(Z_min,r,1)).^2,2).^0.5
disp('该矩阵得分为:')
S = D_min./(D_max+D_min)
disp('矩阵归一化后得分为:');
S = S./(repmat(sum(S),r,1))

【数学建模】灰色关联(Matlab代码实现)_第6张图片

3 写在最后

如果不会自己调试数据与代码,我打包好了,直接下载学习:

【数学建模】灰色关联(Matlab代码实现)

【数学建模】灰色关联(Matlab代码实现)_第7张图片

 

你可能感兴趣的