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

article/2025/6/8 13:10:13

目录

一、灰色系统理论与灰色关联分析

1-灰色预测的概念

2-灰色关联度与优势分析

3-灰色关联分析案例分析

4-灰色生成数列

二、灰色预测模型

1-灰色模型GM

2-灰色模型GM的建模步骤

3-灰色预测经典案例1

4-灰色预测模型经典案例2


一、灰色系统理论与灰色关联分析

1-灰色预测的概念

灰色系统的起源及简单介绍如下所示:

 灰色系统主要应用于如下四个方面,具体如下: 

我们进一步看一下灰色系统的相关概念,具体如下:

 

我们继续学习一下,什么是灰色预测法 ,具体如下:

 ​​​

 灰色预测的常见四种类型如下:

即灰色时间序列预测,畸变预测,系统预测,拓扑预测 

2-灰色关联度与优势分析

  下面看一下灰色关联度分析的基本步骤,具体如下: 

3-灰色关联分析案例分析

 

有下面的结果r可以发现,编号为1的老师整体评价最高的,编号3和编号5的老师评价相差很近,编号4的老师评价最差。

上述灰色关联分析MATLAB代码如下:

clear; clc
x1 = [8, 9, 8, 7, 5, 2, 9;7, 8, 7, 5, 7, 3, 8;9, 7, 9, 6, 6, 4, 7;6, 8, 8, 8, 4, 3, 6;8, 6, 6, 9, 8, 3, 8;8, 9, 5, 7, 6, 4, 8] ;[n,m] = size(x1) ;
x0 = [9,9,9,9,8,9,9] ;
%数据处理
for i = 1 : n for j = 1 : m x(i,j) = abs(x1(i,j) - x0(1,j)) ;end
end%计算灰色关联度系数
max = x(1,1) ;
min = x(1,1) ;
for i = 1 : nfor j = 1 : mif x(i,j)>=maxmax=x(i,j) ;endend
end
for i = 1 : nfor j = 1 : mif x(i,j)<=minmin=x(i,j) ;endend
end
k=0.5;  %分辨系数取值
l=(min+k*max)./(x+k*max);%求关联系数矩阵
disp('关联系数矩阵如下所示:') ;
disp(l) ;%计算灰色加权关联度,此处默认各个指标的权重一样,直接求均值了g = sum(l,2) / m ;
[rs,rind]=sort(g,'descend'); %对关联度进行排序disp('加权关联度如下:') ;
disp(rs) ;
disp('关联度排名如下:') ;
disp(rind) ;

运行结果如下:

总结一下:

灰色关联分析:

【1】确定比较对象(评价对象)(就是数据,并且需要进行规范化处理,就是标准化处理)和参考数列(评价标准,一般该列数列都是1,就是最优的的情况) 
【2】确定各个指标权重,可用层次分析确定 
【3】计算灰色关联系数 
【4】计算灰色加权关联度 
【5】评价分析

4-灰色生成数列

数据生成的意义在于:将数据变成有规律的数列,可以发现其中的规律。

  

 我们看一下累加生成的一般特点,通过累加函数后得到规律性的函数,通过拟合进行预测,具体如下:

  

二、灰色预测模型

1-灰色模型GM

2-灰色模型GM的建模步骤

灰色预测的前提是必须是通过级别检验,直接用很可能出错。

 

 

3-灰色预测经典案例1

如果级别检验不通过,需要累加了一个数,后面再减掉。 

注意:这个残差数据有误,具体看代码给出的结果数据。

灰度预测和误差检验MATLAB代码如下所示:

clear; clc
x0 = [71.1, 72.4, 72.4, 72.1, 71.4, 72.0, 71.6] ;
x0 = x0' ;
n = length(x0) ; %数据的维度,n=7
x1 = cumsum(x0) ;
flag = 1 ;
%第一步:级比检验
for k = 2 : nlamda(k) = x0(k-1) / x0(k) ;if (lamda(k) < exp(-2 / (n+1)) || lamda(k) > exp(2 / (n+1)))disp('不通过级比检验!!!') ;flag = 0 ;end
end
%第2步:建模并求解
if flag == 1disp('通过级比检验!!!') ;alpha = 0.5 ;z1 = alpha * x1(2:n) + (1 - alpha) * x1(1:n-1) ; %求邻域生成数Y = x0(2:n) ;B = [-z1, ones(n-1, 1)] ;ab = B \ Y ; %求出a,bdisp('a和b的值分别为:') ;disp(ab(1));disp(ab(2));for k = 1 : nr1(k) = (x0(1) - ab(2) / ab(1)) * exp(-ab(1)*k)  + ab(2) / ab(1) ;if k == 1r0(k) = x0(k);elser0(k) = r1(k) - r1(k-1) ;endenddisp('预测的结果如下:') ;disp(r0) ;%第3步:模型的2种检验方式%残差检验for k = 1 : n c(k) = (x0(k) - r0(k)) / x0(k);if k > 1rou(k) = 1 - (((1-0.5*ab(1)) / (1+0.5*ab(1))) * lamda(k)) ;endenddisp('残差如下:') ;disp(c) ;%级比偏差检验disp('级比检验值如下:') ;disp(rou) ;end

运行结果如下所示:

4-灰色预测模型经典案例2

预测SARS疫情对某些经济指标的影响,准确的说是预测没发生疫情的指标与已经发生疫情的实际指标进行对比,可以得到疫情对经济指标的影响情况。

 

 可以根据月度预测,直接得到每个月的;也可以根据月度总和,即年度预测,根据占比,推出每个月的值。

 

根据商品的零售预测结果,会发现疫情对商品的零售额影响不大。

 

模型的结果分析

对商品零售,接待海外旅游,综合服务的灰度预测MATLAB代码如下所示:

未发生疫情的情况下,2003年商品零售额预测代码:

clear; clc
han1 = [83.0, 79.8, 78.1, 85.1, 86.6, 88.2, 90.3, 86.7, 93.3, 92.5, 90.9, 96.9;101.7, 85.1, 87.8, 91.6, 93.4, 94.5, 97.4, 99.5, 104.2, 102.3, 101, 123.5;92.2, 114, 93.3, 101, 103.5, 105.2, 109.5, 109.2, 109.6, 111.2, 121.7, 131.3;105, 125.7, 106.6, 116, 117.6, 118, 121.7, 118.7, 120.2, 127.8, 121.8, 121.9;139.3, 129.5, 122.5, 124.5, 135.7, 130.8, 138.7, 133.7, 136.8, 138.9, 129.6, 133.7;137.5, 135.3, 133, 133.4, 142.8, 141.6, 142.9, 147.3, 159.6, 162.1, 153.5, 155.9;163.2, 159.7, 158.4, 145.2, 124, 144.1, 157, 162.6, 171.8, 180.7, 173.5, 176.5] ;
han = han1(7,:) ;
flag = 1 ;
han1(end,:) = [] ; %最后一行不用,也就是2003年的不用
m = size(han1,2) ; %计算列数,即12个月份
x0 = mean(han1, 2) ;  %求每一行12个月的均值
n = length(x0) ; %数据的维度,n=6,也就是6年
for k = 2 : nlamda(k) = x0(k-1) / x0(k) ;if (lamda(k) < exp(-2 / (n+1)) || lamda(k) > exp(2 / (n+1)))disp('不通过级比检验!!!') ;flag = 0 ;end
endif flag == 1disp('通过级比检验!!!') ;
x1 = cumsum(x0) ; %做一次累加
alpha = 0.4 ;z1 = alpha * x1(2:n) + (1 - alpha) * x1(1:n-1) ; %求邻域生成数
Y = x0(2:n) ;
B = [-z1, ones(n-1, 1)] ;
ab = B \ Y ; %求出a,b
k = 6 ;
x7hat = (x0(1) - ab(2) / ab(1)) * (exp(-ab(1)*k) - exp(-ab(1)*(k-1))) ; %预测结果的均值
z = m * x7hat ; %总的预测结果
u = sum(han1) / sum(sum(han1)) ;
v = z * u ; %最终的预测结果
disp('未发生SARS疫情的2003年12个月商品零售额预测结果:') ;
disp(v) ;
disp('发生SARS疫情的2003年12个月商品零售额实际情况:') ;
disp(han) ;
end%级比偏差值检验
flag1 = 1 ;
for k = 2 : n rou(k) = 1 - (((1-0.5*ab(1)) / (1+0.5*ab(1))) * lamda(k)) ;
end
disp('级比检验结果:') ;
disp(rou) ;

运行结果如下所示:

未发生疫情的情况下,2003年接待海外旅游人数预测MATLAB代码:
 

clear; clc
han1 = [9.4, 11.3, 16.8, 19.8, 20.3, 18.8, 20.9, 24.9, 24.7, 24.3, 19.4, 18.6;9.6, 11.7, 15.8, 19.9, 19.5, 17.8, 17.8, 23.3, 21.4, 24.5, 20.1, 15.9;10.1, 12.9, 17.7, 21, 21, 20.4, 21.9, 25.8, 29.3, 29.8, 23.6, 16.5;11.4, 26, 19.6, 25.9, 27.6, 24.3, 23, 27.8, 27.3, 28.5, 32.8, 18.5;11.5, 26.4, 20.4, 26.1, 28.9, 28, 25.2, 30.8, 28.7, 28.1, 22.2, 20.7;13.7, 29.7, 23.1, 28.9, 29, 27.4, 26,  32.2, 31.4, 32.6, 29.2, 22.9;15.4, 17.1, 23.5, 11.6, 1.78, 2.61, 8.8, 16.2, 20.1, 24.9, 26.5, 21.8] ;
han = han1(7,:) ;
flag = 1 ;
han1(end,:) = [] ; %最后一行不用,也就是2003年的不用
m = size(han1,2) ; %计算列数,即12个月份
x0 = mean(han1, 2) ;  %求每一行12个月的均值
n = length(x0) ; %数据的维度,n=6,也就是6年
for k = 2 : nlamda(k) = x0(k-1) / x0(k) ;if (lamda(k) < exp(-2 / (n+1)) || lamda(k) > exp(2 / (n+1)))disp('不通过级比检验!!!') ;flag = 0 ;end
endif flag == 1disp('通过级比检验!!!') ;
x1 = cumsum(x0) ; %做一次累加
alpha = 0.5 ;z1 = alpha * x1(2:n) + (1 - alpha) * x1(1:n-1) ; %求邻域生成数
Y = x0(2:n) ;
B = [-z1, ones(n-1, 1)] ;
ab = B \ Y ; %求出a,b
k = 6 ;
x7hat = (x0(1) - ab(2) / ab(1)) * (exp(-ab(1)*k) - exp(-ab(1)*(k-1))) ; %预测结果的均值
z = m * x7hat ; %总的预测结果
u = sum(han1) / sum(sum(han1)) ;
v = z * u ; %最终的预测结果
disp('未发生SARS疫情的2003年12个月旅游人数预测结果:') ;
disp(v) ;
disp('发生SARS疫情的2003年12个月旅游人数实际情况:') ;
disp(han) ;
end%级比偏差值检验
flag1 = 1 ;
for k = 2 : n rou(k) = 1 - (((1-0.5*ab(1)) / (1+0.5*ab(1))) * lamda(k)) ;
end
disp('级比检验结果:') ;
disp(rou) ;

运行结果如下:

未发生疫情的情况下,2003年综合服务业类及情况MATLAB代码,与上面的一样,只需要将数据录入就可以,不再赘述。

总结一下:

灰色预测模型:

【1】数据检验与处理

【2】GM模型建立与求解

【3】残差检验和级比偏差检验


http://chatgpt.dhexx.cn/article/3oFo2EM2.shtml

相关文章

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 //编…

c语言实现库函数

目录 一.strlen函数 1.描述 2.实现 1.计数的方法 2.函数递归的方法 3.指针 - 指针方法 二.strcmp函数 1.描述 2.实现 三.strcpy函数的实现 1.描述 2.实现 四.strcat函数的实现 1.描述 2.实现 五.strstr函数的实现 1.描述 2.实现 1.BF算法实现 2.kmp算法的实现…

C语言 库函数:qsort 详解

目录 1.qsort的介绍与使用方法 2.介绍void*​ 3.举例使用qsort​ 4. qsort的模拟实现&#xff0c;了解其运作原理​ 1.qsort的介绍与使用方法 2.介绍void* 3.举例使用qsort #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include…

C语言库函数查找工具MSDN

一、前言   库函数在我们写程序的时候会在很大程度上提高我们的效率&#xff0c;我知道很多人可能像我一样&#xff0c;很多时候并不是不知道可以用库函数来实现&#xff0c;但就是不知道库函数如何使用&#xff0c;所以今天呢博主就来推荐资源了——C语言库函数查找工具《MS…

文件编程概念(C语言库函数系统调用API)

文件编程&#xff08;文件IO&#xff09; 文件编程就是操作文件&#xff0c;对文件进行打开&#xff0c;关闭&#xff0c;读、写等操作&#xff08;个人理解&#xff09;。之前C语言编写程序运行都是对键盘和显示器进行的&#xff0c;运行程序时会默认打开的三个文件 标准输入流…

c语言库函数大全文库,C语言库函数源代码

C语言库函数源代码 C语言库函数源代码 strstr ( )/* -- C语言库函数源代码 - */ /* 得到s1中第一次包含s2字符串的位置指针。 */ #include stdlib.h char * my_strstr(const char *s1,const char *s2) { if (*s1 0) { if (*s2) return (char *) NULL; return (char *) s1; } …

C语言常用的库函数 (自用)

常用的库函数 1.前言2.内容1.toupper()2.tolower()3.sprintf()4.abs()5.fabs()6.labs()7.scanf()8.itoa() 3.小声bb4.更新日志 1.前言 在刷题过程中&#xff0c;总能看到dl用一些库函数&#xff0c;简化算法&#xff0c;由此萌生慢慢学习整理常用的库函数的想法&#xff0c;本…

c语言的库函数

一、标准C库函数(15个) 二、数学函数 用于求幂&#xff0c;计算平方跟&#xff0c;求绝对值。#include <math.h>绝对值函数用于表达式的结构转换为非负函数 int x-3; printf("|%d|%d\n",x,abs(x)); 三、字符串处理函数 四、字符处理函数 五、转换函数和存储管…