• 【数学建模】灰色关联(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代码实现)

  • 相关阅读:
    在Ubuntu中启用root用户登录SSH
    第十五章 mysql存储过程与存储函数课后练习
    Linux逻辑卷LV的创建和扩容操作
    合规运营必备资质——ICP申请指南
    【Verilog】HDLBits题解——Circuits/Basic Gates
    全栈工程师必须要掌握的前端Html技能
    Java Stream流的详解
    SQLSERVER 临时表和表变量到底有什么区别?
    CoFSM基于共现尺度空间的多模态遥感图像匹配方法--论文阅读记录
    LeetCode 1049. 最后一块石头的重量 II
  • 原文地址:https://blog.csdn.net/weixin_46039719/article/details/126913761