【数学建模】灰色关联分析 + Matlab代码实现

article/2025/5/18 18:52:21

文章目录

  • 一、学习内容:
  • 二、学习时间:
  • 三、学习产出:
    • 3.1 灰色关联分析基本思想
    • 3.2 运用灰色关联分析的基本步骤
    • 3.3 灰色关联分析代码实现(Matlab)
      • 3.3.1 应用一:分析产业对GDP的影响程度
      • 3.3.2 应用二:灰色关联分析评价河流情况
    • 3.4 补充:如何导入数据
    • 3.5 总结

一、学习内容:

  • 灰色关联分析的基本思想
  • 运用灰色关联分析的基本步骤
  • 灰色关联分析代码实现(Matlab)

二、学习时间:

2020.12.11


三、学习产出:

3.1 灰色关联分析基本思想

在这里插入图片描述

3.2 运用灰色关联分析的基本步骤

  1. 确定分析数列
    • 母序列(又称参考数列,母指标):能反映系统行为特征的数据序列——>类似与因变量Y
    • 子序列(又称比较数列,子指标):影响系统行为的因素组成的数据序列——>类似与自变量X
  2. 对变量进行预处理(去量纲,缩小变量范围,简化计算),先求出每个指标列的均值,再用该指标列的每一个元素都除以该指标列的均值
  3. 用子序列中每一个元素减去对应母序列中同一行的那个元素,并取绝对值,由此得到一个新矩阵new_X。
  4. 记a为矩阵中的最小元素,b为矩阵中的最大元素,分辨系数ro通常为0.5,那么每一个元素对应母序列的关联系数为 a+ro*b./(new_X+ro*b)
  5. 然后,我们再对得到的关联系数矩阵求每一列均值,得到的最后结果gamma就是每一个指标对于母序列的灰色关联度

3.3 灰色关联分析代码实现(Matlab)

3.3.1 应用一:分析产业对GDP的影响程度

数据:

在这里插入图片描述

由于第一产业、第二产业、第三产业的量纲相同,去量纲步骤可以跳过。大家在使用时需要注意自己的数据量纲是否相同。

%% 应用一:分析产业对GDP的影响程度
clear;clc;
load data.mat;
r = size(data,1);
c = size(data,2);
%第一步,对变量进行预处理,消除量纲的影响(大家在使用时需要注意自己的数据量纲是否相同)
%avg = repmat(mean(data),r,1);
%data = data./avg;
%定义母序列和子序列
Y = data(:,1); %母序列
X = data(:,2:c); %子序列
Y2 = repmat(Y,1,c-1); %把母序列向右复制到c-1列
absXi_Y = abs(X-Y2)
a = min(min(absXi_Y)) %全局最小值
b = max(max(absXi_Y)) %全局最大值
ro = 0.5; %分辨系数取0.5
gamma = (a+ro*b)./(absXi_Y+ro*b) %计算子序列中各个指标与母序列的关联系数
disp("子序列中各个指标的灰色关联度分别为:");
ans = mean(gamma)

输出结果为:

子序列中各个指标的灰色关联度分别为:ans =0.7319    0.8983    0.8518

3.3.2 应用二:灰色关联分析评价河流情况

数据:

在这里插入图片描述

%应用二:灰色关联分析评价河流情况
clear;clc;
load X.mat;
%获取行数列数
r = size(X,1);
c = size(X,2);
%首先,把我们的原始指标矩阵正向化
%第二列中间型--->极大型
middle = input("请输入最佳的中间值:");
M = max(abs(X(:,2)-middle));
for i=1:rX(i,2) = 1-abs(X(i,2)-middle)/M;
end
%第三列极小型--->极大型
max_value = max(X(:,3)); 
X(:,3) = abs(X(:,3)-max_value);
%第四列区间型--->极大型
a = input("请输入区间的下界:");
b = input("请输入区间的下界:");
M = max(a-min(X(:,4)),max(X(:,4))-b);
for i=1:rif (X(i,4)<a)X(i,4) = 1-(a-X(i,4))/M;elseif (X(i,4)<=b&&X(i,4)>=a)X(i,4) = 1;elseX(i,4) = 1-(X(i,4)-b)/M;end
end
disp("正向化后的矩阵为:");
disp(X);
%把正向化后的矩阵进行预处理,消除量纲的影响
avg = repmat(mean(X),r,1);
new_X = X./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 = X.*X;               %先让每每一个元素平方
temp2 = sum(temp1);         %再对每一列求和
temp3 = temp2.^0.5;         %再把结果开方
temp4 = repmat(temp3,r,1);  %把开方后的结果按行复制r行
disp("******标准化后的矩阵为:");
Z = X./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))

输出结果为:

请输入最佳的中间值:7
请输入区间的下界:10
请输入区间的上界:20
正向化后的矩阵为:4.6900    0.7172    3.0000    1.00002.0300    0.4069   35.0000    0.69409.1100    0.5241    8.0000    0.90588.6100    0.9655    8.0000    0.44437.1300    0.6552    4.0000    0.69142.3900    0.8414   16.0000    0.60077.6900    0.8552   16.0000    0.65519.3000    0.8690   27.0000         05.4500    0.5724   49.0000    1.00006.1900    0.8138   37.0000    0.78487.9300    0.6345   45.0000    0.69924.4000    0.8069   37.0000    0.54197.4600    0.1448   31.0000    1.00002.0100         0    7.0000    0.45462.0400    0.5862   31.0000    1.00007.7300    0.4069    2.0000    1.00006.3500    0.6000   29.0000    0.18248.2900    0.0276   15.0000    1.00003.5400    0.8138         0    0.40887.4400    0.4897   46.0000    0.2731new_X =0.7831    1.2228    0.1345    1.49970.3390    0.6937    1.5695    1.04081.5211    0.8936    0.3587    1.35841.4376    1.6461    0.3587    0.66621.1905    1.1170    0.1794    1.03690.3991    1.4345    0.7175    0.90081.2840    1.4580    0.7175    0.98251.5528    1.4815    1.2108         00.9100    0.9759    2.1973    1.49971.0336    1.3874    1.6592    1.17691.3241    1.0817    2.0179    1.04860.7347    1.3757    1.6592    0.81271.2456    0.2469    1.3901    1.49970.3356         0    0.3139    0.68180.3406    0.9994    1.3901    1.49971.2907    0.6937    0.0897    1.49971.0603    1.0229    1.3004    0.27351.3842    0.0470    0.6726    1.49970.5911    1.3874         0    0.61311.2423    0.8348    2.0628    0.4096Y2 =1.4997    1.4997    1.4997    1.49971.5695    1.5695    1.5695    1.56951.5211    1.5211    1.5211    1.52111.6461    1.6461    1.6461    1.64611.1905    1.1905    1.1905    1.19051.4345    1.4345    1.4345    1.43451.4580    1.4580    1.4580    1.45801.5528    1.5528    1.5528    1.55282.1973    2.1973    2.1973    2.19731.6592    1.6592    1.6592    1.65922.0179    2.0179    2.0179    2.01791.6592    1.6592    1.6592    1.65921.4997    1.4997    1.4997    1.49970.6818    0.6818    0.6818    0.68181.4997    1.4997    1.4997    1.49971.4997    1.4997    1.4997    1.49971.3004    1.3004    1.3004    1.30041.4997    1.4997    1.4997    1.49971.3874    1.3874    1.3874    1.38742.0628    2.0628    2.0628    2.0628new_X =0.7166    0.2769    1.3651         01.2306    0.8758         0    0.52870    0.6275    1.1624    0.16270.2085         0    1.2873    0.97990    0.0735    1.0111    0.15361.0354         0    0.7170    0.53360.1739         0    0.7405    0.47550    0.0714    0.3421    1.55281.2873    1.2214         0    0.69760.6256    0.2718         0    0.48230.6938    0.9362         0    0.96930.9245    0.2835         0    0.84650.2541    1.2528    0.1095         00.3462    0.6818    0.3679         01.1591    0.5003    0.1095         00.2090    0.8060    1.4100         00.2402    0.2775         0    1.02700.1155    1.4526    0.8270         00.7963         0    1.3874    0.77430.8205    1.2280         0    1.6532各个指标对于母序列的灰色关联度为:gamma =0.6665    0.6800    0.7052    0.6880各个指标的权重为:weight =0.2433    0.2482    0.2574    0.2511******标准化后的矩阵为:Z =0.1622    0.2483    0.0245    0.30650.0702    0.1408    0.2863    0.21270.3150    0.1814    0.0655    0.27760.2977    0.3342    0.0655    0.13610.2466    0.2268    0.0327    0.21190.0826    0.2912    0.1309    0.18410.2659    0.2960    0.1309    0.20080.3216    0.3008    0.2209         00.1885    0.1981    0.4009    0.30650.2141    0.2817    0.3027    0.24050.2742    0.2196    0.3682    0.21430.1522    0.2793    0.3027    0.16610.2580    0.0501    0.2536    0.30650.0695         0    0.0573    0.13930.0705    0.2029    0.2536    0.30650.2673    0.1408    0.0164    0.30650.2196    0.2077    0.2373    0.05590.2867    0.0095    0.1227    0.30650.1224    0.2817         0    0.12530.2573    0.1695    0.3763    0.0837Z_max =0.3216    0.3342    0.4009    0.3065Z_min =0.0695         0         0         0D_max =0.21090.17390.18700.19070.20340.19200.15060.17940.09440.08410.07880.12310.16310.28390.15870.21920.17080.21530.24480.1427D_min =0.20280.19340.20810.21480.17870.18440.21370.22470.27950.25080.26190.22700.22230.07560.22440.19520.17740.19740.15590.2322该矩阵得分为:S =0.49020.52650.52660.52970.46770.48990.58660.55590.74760.74890.76860.64830.57680.21040.58570.47100.50950.47820.38910.6194矩阵归一化后得分为:S =0.04490.04820.04820.04850.04280.04480.05370.05090.06840.06850.07030.05930.05280.01930.05360.04310.04660.04380.03560.0567

③灰色关联分析+TOPSIS和熵权法+TOPSIS计算数据得分的效果对比

在这里插入图片描述

3.4 补充:如何导入数据

由于很多人使用我代码的时候不知道怎么将数据替换为自己的数据,所以特地补充了一个小节来说一下怎么将数据替换成自己的。

首先,打开matlab,创建一个新的.m文件,将代码复制进去
在这里插入图片描述
工作区右键,点击新建
在这里插入图片描述
将变量命名为data
在这里插入图片描述
双击刚刚新建好的data变量,进入变量内部(在此界面,可以手动编辑变量的值)
在这里插入图片描述
打开自己的数据(一般都是excel吧),我准备了一些例子,如下图所示(注意,年份那一列不能是横着的,否则会有问题)
下面是正确示范
在这里插入图片描述
下面是错误示范
在这里插入图片描述
然后,复制(ctrl+c或者右键->复制)除题头外的数据
在这里插入图片描述
在matlab中的变量内部的左上角右键->粘贴
在这里插入图片描述
在这里插入图片描述
将变量data另存为data.mat文件(注意:需要存在和你代码的同一目录下)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后就可以全选代码,右键运行啦!
在这里插入图片描述


3.5 总结

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

http://chatgpt.dhexx.cn/article/oTqZ6bMf.shtml

相关文章

【数模】灰色关联分析与预测模型

文章目录 前言一、灰色预测&#xff08;法&#xff09;1.定义2.如何预测3.灰色预测的四种常见类型 二、灰色关联度分析灰色关联度 三、灰色生成数列四、灰色模型GM(1,1)五、灰色预测步骤 前言 灰色系统的应用 一、灰色预测&#xff08;法&#xff09; 1.定义 灰色预测法&a…

数学建模学习:灰色关联分析

一、灰色关联分析 1.概述 一般的抽象系统&#xff0c;如社会系统、经济系统、农业系统、生态系统、教育系统等都包含有许多种因素&#xff0c;多种因素共同作用的结果决定了该系统的发展态势。在众多的因素中&#xff0c;哪些是主要因素&#xff0c;哪些是次要因素&#xff1…

灰色关联分析笔记

什么时候用灰色关联分析&#xff1f; 灰色关联分析 是根据因素之间发展趋势的相似或相异程度&#xff0c;亦即“灰色关联度”&#xff0c;作为衡量因素间关联程度的一种方法 【若两个因素变化的趋势具有一致性&#xff0c;即同步变化程度较高&#xff0c;即可谓二者关联程度较…

MATLAB学习笔记_Day03灰色关联分析和灰色预测模型

学习视频&#xff1a;【零基础教程】老哥&#xff1a;数学建模算法、编程、写作和获奖指南全流程培训&#xff01; 文章目录 1. 灰色关联分析与预测模型适用范围&#xff1a;1.1 灰色预测的概念1.2 灰色关联度与优势分析1.3 灰色预测模型1.4 灰色模型GM(1,1)1.5 灰色预测步骤 1…

灰色系统理论与灰色关联分析模型

灰色系统理论与灰色关联分析模型 Author:丸子 Written on: 220211 Notes:包括灰色系统知识和灰色关联分析模型两部分 笔记课程来自b站网课老哥带你学数模书本为《数学建模算法与应用&#xff08;第3版&#xff09;》&#xff0c;司守奎编著第424页 文章目录 灰色系统理论与灰色…

Python 灰色关联度 灰色预测模型

灰色关联度 灰色关联度常用于分析影响因子与被影响因子的关联&#xff0c;是水论文的好东西 如果数据的量纲不统一的话&#xff0c;需要先进行归一化处理 import numpy as npdef gray_correlation(refer, data, rho0.5): refer: 参照数列 (列向量)data: 比较数列 (以列为单位…

备战数学建模15-灰色关联分析与灰色预测模型

目录 一、灰色系统理论与灰色关联分析 1-灰色预测的概念 2-灰色关联度与优势分析 3-灰色关联分析案例分析 4-灰色生成数列 二、灰色预测模型 1-灰色模型GM 2-灰色模型GM的建模步骤 3-灰色预测经典案例1 4-灰色预测模型经典案例2 一、灰色系统理论与灰色关联分析 1-灰…

C语言:关键字----switch、case、default(开关语句)

C语言&#xff1a;基础开发----目录 C语言&#xff1a;关键字—32个(分类说明) 有32个关键字详细说明&#xff0c;还有跳转链接&#xff01; 一、开关语句----介绍 开关语句&#xff0c;包括以下四种关键字&#xff1a; switch&#xff1a;开关语句case&#xff1a; 开关语句…

C语言关键字auto,case,default,switch应该如何使用

前言&#xff1a;本文章主要用于个人复习&#xff0c;追求简洁&#xff0c;感谢大家的参考、交流和搬运&#xff0c;后续可能会继续修改和完善。 因为是个人复习&#xff0c;会有部分压缩和省略。 一、auto 1.c语言中&#xff0c;关键字auto用于声明一个变量为自动变量&#x…

C语言-switch-case语句与多分支结构

一、switch-case语句 1. switch语句中的每个语句段中都使用break语句 switch-case语句的一般形式为&#xff1a; switch (表达式){case 常量表达式1: 语句段1;break;case 常量表达式2:语句段2;break;...case 常量表达式n:语句段n;break;default:语句段n1;break;}这是switch-c…

C语言——switch case 语句判断学生成绩

C语言——switch case 语句判断学生成绩 switch case 讲解: switch&#xff08;&#xff09;&#xff0c;在括号里输入所定义的变量&#xff0c;接着在&#xff08;&#xff09;后面输入一个{}大括号&#xff0c;把每一个分支语句放在大括号中。 switch()写法: int main()…

C语言--switch case 语句,case 后没有语句

背景&#xff1a;在看 wireshark 的解析协议部分的源码时&#xff0c;发现很多的 switch case 语句&#xff0c;case 后没有语句 的情况&#xff0c;随处可见的这种情况&#xff0c;产生疑惑&#xff0c;报文解析就是很好的例子。 例如&#xff1a;wireshark-3.2.17/epan/diss…

补充switch语句的内容和逗号运算符(C语言case后没有break的switch语句,会继续执行后面的语句再退出)

补充switch语句的内容和逗号运算符 C语言case后没有break的switch语句&#xff0c;会继续执行后面的语句再退出补充逗号运算符 C语言case后没有break的switch语句&#xff0c;会继续执行后面的语句再退出 对于switch语句&#xff0c;我们在使用的时候都会注意使用的规范&#…

c语言 case break,C语言中switch...case语句中break的重要性

在C语言中switch...case语句是经常用到的&#xff0c;下面我介绍一下在使用该语句时候需要注意的一个细节问题。话不多说&#xff0c;直接举例子&#xff1a; 例子1&#xff1a; switch(fruit) { case 1:printf("apple"); break; case 2:printf("banana");…

C语言CASE语句嵌套,C语言中switch case语句的嵌套

给一个含有嵌套的switch case的一段完整代码&#xff1a; #include int main() { int n1; int m2; switch(n) { case 1: m; case 2: n; case 3: switch(n) { case 1: n; case 2: m; n; break; } case 4: m; break; default: break; } printf("%d %d",m,n); return 0…

c语言 switch案例,c语言switch case语句使用例子

c语言switch case语句使用例子 发布时间&#xff1a;2020-04-23 11:48:53 来源&#xff1a;亿速云 阅读&#xff1a;421 作者&#xff1a;小新 这篇文章主要为大家详细介绍了c语言switch case语句使用例子&#xff0c;文中示例代码介绍的非常详细&#xff0c;具有一定的参考价值…

c语言的case语句怎么用,c语言的switchcase语句用法

凡是使用过的人都会有同2113样的感觉—5261—C语言的使用灵活这个特点既是优点又是4102缺点&#xff0c; 因为对1653精通C语言的用户来讲&#xff0c; 灵活就意味着编程可以无拘无束&#xff0c; 甚至随心所欲&#xff1b; 但对初学者或者是尚未摸着规律的用户来说&#xff0c;…

case是c语言变量名吗,case是什么意思_c语言中case是什么意思

c语言中case是什么意思 是程序的入口,一般结合switch使用 举个例子: int a=2; switch(a){ case 1:prinf("1");break; case 2:prinf("2");break; default:prinf("3"); } 就表示根据a的值进行判断,a的值与 case后面的哪个值相等,就执行哪个cas…

【C语言】case 关键字

&#x1f6a9;write in front&#x1f6a9; &#x1f50e;大家好&#xff0c;我是謓泽&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f3c5;2021年度博客之星物联网与嵌入式开发TOP5&#xff5…

c语言库函数总结----math.h库

思维导图大纲 前言 上回总结了string.h常用的字符串操作函数,这次总结一下另外的一个库函数math.h和数字运算有关联的库。 double acos(double x) 函数原型:double acos(double x) 功能:返回以弧度表示的 x 的反余弦。arcos(x);//时间:2019年11月15日 //作者:Kroner //编…