当前位置:   article > 正文

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

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

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

2.2 算例2 

1)算例

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

数据:

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

2)Matlab代码实现

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

  1. clc;
  2. close;
  3. clear all;
  4. x=xlsread('算例2.xlsx');
  5. %load data.mat;
  6. x=x(:,2:end)';%所有列,2到最后一列
  7. %===获取行数列数=====
  8. column_num=size(x,2);
  9. index_num=size(x,1);
  10. %% 1.数据均值化处理
  11. x_mean=mean(x,2);
  12. for i = 1:index_num
  13. x(i,:) = x(i,:)/x_mean(i,1);
  14. end
  15. %% 2.提取参考队列和比较队列
  16. ck=x(1,:)
  17. cp=x(2:end,:)
  18. cp_index_num=size(cp,1);
  19. %==2.1 比较队列与参考队列相减===
  20. for j = 1:cp_index_num
  21. t(j,:)=cp(j,:)-ck;
  22. end
  23. %===2.2 求最大差和最小差====
  24. mmax=max(max(abs(t)))
  25. mmin=min(min(abs(t)))
  26. rho=0.5;
  27. %% 3.求关联系数
  28. ksi=((mmin+rho*mmax)./(abs(t)+rho*mmax))
  29. %% 4.求关联度
  30. ksi_column_num=size(ksi,2);
  31. r=sum(ksi,2)/ksi_column_num;
  32. %% 5.关联度排序,得到结果r3>r2>r1
  33. [rs,rind]=sort(r,'descend')
  34. disp('=====关联度的大小=========')
  35. rs
  36. disp('=====关联度的排序=========')
  37. rind

 

 2.3 算例3

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

  1. clc;
  2. clear;
  3. %读取数据
  4. data=xlsread('算例2.xlsx');
  5. %数据标准化
  6. data1=mapminmax(data',0.002,1); %标准化到0.002-1区间
  7. data1=data1';
  8. %%绘制 x1,x4,x5,x6,x7 的折线图,这里数据换成自己的
  9. figure(1)
  10. t=[2000:2005];
  11. plot(t,data1(:,1),'Color','r','LineWidth',1.5)
  12. hold on
  13. for i=1:4
  14. plot(t,data1(:,1+i),'--','LineWidth',1.2)
  15. hold on
  16. end
  17. xlabel('year')
  18. legend('国内生产总值','第一产业', '第二产业', '第三产业')
  19. title('灰色关联分析')
  20. %%计算灰色相关系数
  21. %得到其他列和参考列相等的绝对值
  22. for i=2:4
  23. data1(:,i)=abs(data1(:,i)-data1(:,1));
  24. end
  25. %得到绝对值矩阵的全局最大值和最小值
  26. data2=data1(:,2:4);
  27. d_max=max(max(data2));
  28. d_min=min(min(data2));
  29. %灰色关联矩阵
  30. a=0.5; %分辨系数
  31. data3=(d_min+a*d_max)./(data2+a*d_max);
  32. xishu=mean(data3);
  33. disp('第一产业,第二产业,第三产业与国内生产总值之间的灰色关联度分别为:')
  34. 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代码实现

  1. %灰色关联分析评价河流情况
  2. clear;clc;
  3. load case4.mat;
  4. %获取行数列数
  5. r = size(case4,1);
  6. c = size(case4,2);
  7. %首先,把我们的原始指标矩阵正向化
  8. %第二列中间型--->极大型
  9. middle = input('请输入最佳的中间值:');
  10. M = max(abs(case4(:,2)-middle));
  11. for i=1:r
  12. case4(i,2) = 1-abs(case4(i,2)-middle)/M;
  13. end
  14. %第三列极小型--->极大型
  15. max_value = max(case4(:,3));
  16. case4(:,3) = abs(case4(:,3)-max_value);
  17. %第四列区间型--->极大型
  18. a = input('请输入区间的下界:');
  19. b = input('请输入区间的下界:');
  20. M = max(a-min(case4(:,4)),max(case4(:,4))-b);
  21. for i=1:r
  22. if (case4(i,4)<a)
  23. case4(i,4) = 1-(a-case4(i,4))/M;
  24. elseif (case4(i,4)<=b&&case4(i,4)>=a)
  25. case4(i,4) = 1;
  26. else
  27. case4(i,4) = 1-(case4(i,4)-b)/M;
  28. end
  29. end
  30. disp('正向化后的矩阵为:');
  31. disp(case4);
  32. %把正向化后的矩阵进行预处理,消除量纲的影响
  33. avg = repmat(mean(case4),r,1);
  34. new_X = case4./avg;
  35. %将预处理后的矩阵每一行的最大值取出,当成母序列(虚构的)
  36. Y = max(new_X,[],2);
  37. %计算各个指标和母序列的灰色关联度
  38. %先把new_X矩阵所有元素都减去母序列中同行的元素,并取绝对值
  39. Y2 = repmat(Y,1,c);
  40. new_X = abs(new_X-Y2);
  41. a = min(min(new_X)); %全矩阵最小值
  42. b = max(max(new_X)); %全矩阵最大值
  43. ro = 0.5;
  44. new_X = (a+ro*b)./(new_X+ro*b);
  45. disp('===========各个指标对于母序列的灰色关联度为:========================');
  46. gamma = mean(new_X)
  47. %计算各个指标的权重
  48. disp('===============各个指标的权重为:=================');
  49. weight = gamma./(sum(gamma,2))
  50. %-------------------------------------------------------------------------------------------------------
  51. %继续TOPSIS的步骤:对正向化后的矩阵X进行标准化(原矩阵除以每一列元素平方之和的开方)
  52. temp1 = case4.*case4; %先让每每一个元素平方
  53. temp2 = sum(temp1); %再对每一列求和
  54. temp3 = temp2.^0.5; %再把结果开方
  55. temp4 = repmat(temp3,r,1); %把开方后的结果按行复制r行
  56. disp('******标准化后的矩阵为:');
  57. Z = case4./temp4 %原矩阵除以每一列元素平方之和的开方
  58. Z_max = max(Z) %获得Z每一列中最大的元素
  59. Z_min = min(Z) %获得Z每一列中最小的元素
  60. D_max = sum(weight.*(Z-repmat(Z_max,r,1)).^2,2).^0.5
  61. D_min = sum(weight.*(Z-repmat(Z_min,r,1)).^2,2).^0.5
  62. disp('该矩阵得分为:')
  63. S = D_min./(D_max+D_min)
  64. disp('矩阵归一化后得分为:');
  65. S = S./(repmat(sum(S),r,1))

3 写在最后

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/270498
推荐阅读
相关标签
  

闽ICP备14008679号