【数学建模】灰色关联(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指标之间的灰色关联度。数据表格如下:

年份x1x2x3x4x5x6x7
2007225782756949872567.7267.981.54291.172
2008256982948450483131348.511.85461.2514
2009278963158951293858.2429.12.03691.0254
2010295403489455694417.7541.292.25891.189
2011310583647857835158.1647.252.42761.4213
2012359803869560456150.1736.452.56781.5304
2013394834074662597002.88502.85461.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)

2.2 算例2 

1)算例

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

数据:

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

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

 

 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)

2.4 算例4 

1)算例

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

数据:

河流含氧量PH值细菌总数(个/ml)植物性营养物量(ppm)
A4.696.595111.94
B2.037.86196.46
c9.116.31468.91
D8.617.054626.43
E7.136.55023.57
F2.396.773824.62
G7.696.79386.01
H9.36.812731.57
I5.457.62518.46
J6.197.27177.51
K7.937.5396.52
L4.47.281725.3
M7.468.242314.42
N2.015.554726.31
o2.046.42317.91
p7.736.145215.72
Q6.357.582529.46
R8.298.413912.02
s3.547.27543.16
T7.446.26828.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-(a-case4(i,4))/M;
       elseif (case4(i,4)<=b&&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))

3 写在最后

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

  • 15
    点赞
  • 192
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荔枝科研社

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值