赞
踩
目录
灰色关联分析l是由邓聚龙教授于1982年提出的,也称“邓氏灰色关联法”。方法以部分信息已知 ,部分信息未知的“贫信息”为研究对象,通过对部分已知信息的生成和开发,实现对现实世界的定量描述。其基本思路是根据序列曲线的几何形状的相似程度来判断联系的紧密性,曲线越接近比较序列与参考序列的关联度越大,反之越小。灰色关联法能较好地客服回归分析中的不足,在样本量较小的“贫信息”中能较准确的找出关联性。
灰色关联分析法的优势在于,它弥补了采用数理统计方法系统分析所导致的缺憾,对样本量的多少和样本有无规律都适用,而且计算量小,十分方便,更不会出现与定性结果不符合的情况。但是灰色关联分析仅在我国有部分学者使用,在国际上并没有得到太多认可,而且当数据量较大的时候,使用标准化回归的方法是更好的选择,只有在数据很少万不得已的情况下,才考虑灰色关联分析,当然,你也可以两者综合考虑。
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)
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
用算例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)
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-(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))
【数学建模】灰色关联(Matlab代码实现)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。