MATLAB实现灰色预测

        久违了,前段时间由于学习压力大,就没怎么更新MATLAB相关的内容,今天实在学不进去了,换个内容更新一下~

        本贴介绍灰色预测模型,这也是数学建模竞赛常见算法中的一员,和许多预测模型一样——底层原理是根据已知数据对未知进行预测~


一.理论部分

        灰色预测是对既含有已知信息又含有不确定信息的系统进行预测,就是对在一定范围内变化的、与时间有关的灰色过程进行预测。 灰色预测对原始数据进行生成处理来寻找系统变动的规律,并生成有较强规律性的数据序列,然后建立相应的微分方程模型,从而预测事物未来发展趋势的状况。
        灰色系统理论运用灰色数学处理不确定性量化问题,并充分利用已知信息,寻求系统运动规律。其独特之处在于适用于处理信息匮乏的系统。
        灰色生成是通过对原始数据进行特定要求的处理,揭示出数据背后的内在规律。常用的生成方法包括累加生成、累减均值生成和级比生成。
所谓的GM(1,1)模型: Grey(Gray) Model,本质上就是一维层面的预测~
至于模型更底层复杂的数学原理就不展开详解了,大家自行收集资料,此处主要讲解套路~

二.例题讲解

如下是有关棉花生产的数据:

年份单产种子费化肥费农药费机械费灌溉费
kg/公顷/公顷/公顷/公顷/公顷/公顷
19901017106.05495.15305.145.956.1
19911036.5113.55561.45343.868.5593.3
1992792104.55584.8541473.2104.55
1993861132.75658.35453.7582.95107.55
1994901.5174.3904.05625.05114152.1
1995922.5230.41248.75834.45143.85176.4
1996916.5238.21361.55720.75165.15194.25
1997976.5260.11337.4727.65201.9291.75
19981024.5270.61195.8775.5220.5271.35
19991003.5286.21171.8610.95195284.55
20001069.5282.91151.55599.85190.65277.35
20011168.5317.851105.8553.8211.05290.1
20021228.5319.651213.05513.75231.6324.15
20031023368.41274.1567.45239.85331.8
20041144.5466.21527.9487.35408336.15
假设我们不知道2005-2007这三年的单产数据,请你用过去15年的数据来预测这三年的产量。

1.传统GM模型的代码

function [result, x0_hat, relative_residuals, eta] = gm11(x0, predict_num)
    n = length(x0); 
    x1=cumsum(x0); 
    z1 = (x1(1:end-1) + x1(2:end)) / 2;  
    y = x0(2:end); x = z1; 
    k = ((n-1)*sum(x.*y)-sum(x)*sum(y))/((n-1)*sum(x.*x)-sum(x)*sum(x));
    b = (sum(x.*x)*sum(y)-sum(x)*sum(x.*y))/((n-1)*sum(x.*x)-sum(x)*sum(x));
    a = -k;  
    x0_hat=zeros(n,1);  x0_hat(1)=x0(1);   
    for m = 1: n-1
        x0_hat(m+1) = (1-exp(a))*(x0(1)-b/a)*exp(-a*m);
    end
    result = zeros(predict_num,1);  
    for i = 1: predict_num
        result(i) = (1-exp(a))*(x0(1)-b/a)*exp(-a*(n+i-1)); 
    end
    absolute_residuals = x0(2:end) - x0_hat(2:end);   
    relative_residuals = abs(absolute_residuals) ./ x0(2:end); 
   
    class_ratio = x0(2:end) ./ x0(1:end-1) ;  
    eta = abs(1-(1-0.5*a)/(1+0.5*a)*(1./class_ratio));  
end

2.原始数据检验

此处选用【单产】作为示例~

year =[1995:1:2001]';  % 横坐标表示年份,写成列向量的形式(加'就表示转置)
yield= [1017
1036.5
792
861
901.5
922.5
916.5
976.5
1024.5
1003.5
1069.5
1168.5
1228.5
1023
1144.5
]';  %原始数据序列,写成列向量的形式(加'就表示转置)
ERROR = 0;  % 建立一个错误指标,一旦出错就指定为1
% 判断是否有负数元素
if sum(yield<0) > 0 
    disp('灰色预测的时间序列中不能有负数!')
    ERROR = 1;
end

% 判断数据量是否太少
n = length(yield);  % 计算原始数据的长度
disp(strcat('原始数据的长度为',num2str(n)))    
if n<=3
    disp('数据量太小')
    ERROR = 1;
end

% 数据太多时提示可考虑使用其他方法
if n>10
    disp('考虑使用其他的方法')
end

% 判断数据是否为列向量,如果输入的是行向量则转置为列向量
if size(yield,1) == 1
    yield = yield';
end
if size(year,1) == 1
    year = year';
end

3.准指数规律检验

if ERROR == 0    
    disp('准指数规律检验')
    x1 = cumsum(yield);  
    rho = yield(2:end) ./ x1(1:end-1) ;   
    rho
   
    figure(2)
    plot(year(2:end),rho,'o-',[year(2),year(end)],[0.5,0.5],'-'); 
    grid on;
    text(year(end-1)+0.2,0.55,'临界线')   
    set(gca,'xtick',year(2:1:end)) 
    xlabel('年份');  ylabel('原始数据的光滑度');  
    
    disp(strcat('指标1:光滑比小于0.5的数据占比为',num2str(100*sum(rho<0.5)/(n-1)),'%'))
    disp(strcat('指标2:除去前两个时期外,光滑比小于0.5的数据占为',num2str(100*sum(rho(3:end)<0.5)/(n-3)),'%'))
    disp('参考标准:指标1一般要大于60%, 指标2要大于90%!')   
    Judge = input('你认为可以通过准指数规律的检验吗?可以通过请输入1,不能请输入0:');
    if Judge == 0
        disp('灰色预测模型不适合你的数据!')
        ERROR = 1;
    end
end

4.传统的GM(1,1)预测

        if n > 7
            test_num = 3;
        else
            test_num = 2;
        end
        train_yield = yield(1:end-test_num);  
        disp('训练数据是: ')
        disp(mat2str(train_yield')) 
        test_yield = yield(end-test_num+1:end); 
        disp('试验数据是: ')
        disp(mat2str(test_yield')) 

 

disp(' ')
   disp('***下面是传统的GM(1,1)模型预测的详细过程***')
   result1 = gm11(train_yield, test_num);

5.评估误差精度

    %% 残差检验
    average_relative_residuals = mean(relative_residuals); 
    disp(strcat('平均相对残差为',num2str(average_relative_residuals)))
    if average_relative_residuals<0.1
        disp('该模型对原数据的拟合程度非常不错!')
    elseif average_relative_residuals<0.2
        disp('该模型对原数据的拟合程度达到一般要求!')
    else
        disp('该模型对原数据的拟合程度不太好!')
    end
    
    %% 级比偏差检验
    average_eta = mean(eta);   % 计算平均级比偏差
    disp(strcat('平均级比偏差为',num2str(average_eta)))
    if average_eta<0.1
        disp('该模型对原数据的拟合程度非常不错!')
    elseif average_eta<0.2
        disp('该模型对原数据的拟合程度达到一般要求!')
    else
        disp('该模型对原数据的拟合程度不太好!')
    end
    disp(' ')

答案如下,大家自己尝试(每个单独预测一遍,因为GM(1,1)只针对一维数据~)

年份单产种子费化肥费农药费机械费灌溉费
kg/公顷/公顷/公顷/公顷/公顷/公顷
20051122449.851703.25555.15402.3358.8
20061276.55371888.5637.2480.75428.4
20071233565.52009.85715.65562.05456.9

 

三.实战案例

1.2022年美赛C题

 

        根据现有数据,通过灰色预测模型,预测比特币和黄金两种波动资产的走向,拟合优度较高,残差与级比偏差均很低,预测模型的可信度较高~

2.2022亚太赛C题

上图是准指数检验~

 通过BP神经网络、多元线性回归以及灰色预测3种方式预测气温变化~结果可信度较高

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/177383.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

笔试题之指针结合数组的精讲2

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

接口测试 —— requests 的基本了解

● requests介绍及安装 ● requests原理及源码介绍 ● 使用requests发送请求 ● 使用requests处理响应 ● get请求参数 ● 发送post请求参数 ● 请求header设置 ● cookie的处理 ● https证书的处理 ● 文件上传、下载 requests介绍 ● requests是python第三方的HTTP…

python -opencv 中值滤波 ,均值滤波,高斯滤波实战

python -opencv 中值滤波 &#xff0c;均值滤波&#xff0c;高斯滤波实战 cv2.blur-均值滤波 cv2.medianBlur-中值滤波 cv2.GaussianBlur-高斯滤波 直接看代码吧&#xff0c;代码很简单&#xff1a; import copy import math import matplotlib.pyplot as plt import matp…

对线程的创建

一&#xff0c;概括 二&#xff0c;线程构建方式一&#xff08;继承Thread类&#xff09; 三&#xff0c;案例 父类&#xff1a; package Duoxiancheng;public abstract class Name {public static void main(String[] args) {//3&#xff0c;创建一个Thread线程类对象Thr…

【小黑送书—第九期】>>重磅!这本30w人都在看的Python数据分析畅销书:更新了!

想学习python进行数据分析&#xff0c;这本《利用python进行数据分析》是绕不开的一本书。目前该书根据Python3.10已经更新到第三版。 Python 语言极具吸引力。自从 1991 年诞生以来&#xff0c;Python 如今已经成为最受欢迎的解释型编程语言。 pandas 诞生于2008年。它是由韦…

__int128类型movaps指令crash

结论 在使用__int128时&#xff0c;如果__int128类型的内存起始地址不是按16字节对齐的话&#xff0c;有些汇编指令会抛出SIGSEGV使程序crash。 malloc在64位系统中申请的内存地址&#xff0c;是按16字节对齐的&#xff0c;但一般使用时经常会申请一块内存自己切割使用&#…

Selenium浏览器自动化测试框架

介绍 Selenium [1] 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。支持的浏览器包括IE&#xff08;7, 8, 9, 10, 11&#xff09;&#xff0c;Mozilla Firefox&#xff0c;Safari&#xff0c;Google Chrome&#xff…

vs调试输出,不显示线程已退出

如题&#xff1a;一堆线程退出的信息&#xff0c;招人烦。 其实在vs设置里可以关闭&#xff1a; 工具-->选项-->调试-->输出窗口&#xff1a;

动态跳过测试用例

动态跳过测试用例 说明 我们可以通过指定环境变量来动态判断是否执行指定的测试用例设置环境变量有很多种方法&#xff0c;例如命令行方式&#xff0c;格式&#xff1a;--env keyval1,key2val2 &#xff0c;若需要指定多个环境变量则需要逗号来隔开&#xff0c;而不是空格 t…

innoDB的缓冲池(Buffer Pool)的工作原理

数据存在磁盘了&#xff0c;总不能次次和磁盘交互吧&#xff0c;所以innoDB有一个缓冲池&#xff08;Buffer Pool&#xff09;&#xff0c;有了缓冲池后&#xff0c;读写就优先在缓冲池了。读先在缓冲池读&#xff0c;没有再去磁盘加载进缓冲池&#xff1b;写也是先写缓冲池&am…

调试接口速度,打印毫秒数,找出慢的地方,优化

方法的最开头写上 $start_time microtime(true); 然后代码行里 dump(All 1: time ’ . (microtime(true) - $start_time)); dump(All 1.2: time ’ . (microtime(true) - $start_time)); 类似这样的最终打印

[C++] STL_stack queue接口的模拟实现

文章目录 1、stack1.1 stack的介绍1.2.1 stack的构造1.2.2 进、出栈等接口的模拟实现 2、queue2.1 queue的介绍2.2 queue的使用2.2.1 queue构造2.2.2 入、出队等接口的模拟实现 1、stack 1.1 stack的介绍 stack的文档介绍 1. stack是一种容器适配器&#xff0c;专门用在具有…

Linux程序之可变参数选项那些事!

一、linux应用程序如何接收参数&#xff1f; 1. argc、argv Linux应用程序执行时&#xff0c;我们往往通过命令行带入参数给程序&#xff0c;比如 ls /dev/ -l 其中参数 /dev/ 、-l都是作为参数传递给命令 ls 应用程序又是如何接收这些参数的&#xff1f; 通常应用程序都…

thinkphp文件夹生成zip压缩包

一、准备工作&#xff0c;使用phpinfo()查看有没有zip扩展 <?php echo phpinfo(); ?>Thinkphp使用PHP自带的ZipArchive压缩文件或文件夹 显示enabled 说明已经配置好 如果没有安装扩展的&#xff0c;请参照以下方法&#xff1a; 1、下载对应版本的扩展包&#xff1a…

还不知道指针和引用的区别,一篇文章教会你

1、引用的概念 1.引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名 2.编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间 比如:孙悟空&#xff0c;可以叫他孙悟空&#xff0c;也可以叫齐天大圣。本质他们就是一个人 2、引用的定…

opencv- CLAHE 有限对比适应性直方图均衡化

CLAHE&#xff08;Contrast Limited Adaptive Histogram Equalization&#xff09;是一种对比度有限的自适应直方图均衡化技术&#xff0c;它能够提高图像的对比度而又避免过度增强噪声。 在OpenCV中&#xff0c;cv2.createCLAHE() 函数用于创建CLAHE对象&#xff0c;然后可以…

Python 安装win32com失败

今天进行服务器迁移&#xff0c; 中间有用的python调用win32com组件让docx转换成pdf。不出意外的话出意外了&#xff0c;pip安装win32com的时候各种安装不上&#xff0c; 今天处理完问题之后&#xff0c;记录一下&#xff0c;与人方便与己方便。 在cmd上面&#xff0c;一开始…

配置静态 Eth-trunk

1、需求 1&#xff09;交换网络中存在2个 VLAN – 10 和 20 2&#xff09;每个VLAN的IP地址为&#xff1a;192.168.xx.0/24&#xff08;xx为 vlan 号&#xff09; 3&#xff09;对交换机之间的链路进行链路捆绑&#xff0c;增加互联带宽 4&#xff09;确保同 VLAN的 PC 之间互…

static和extern

1.extern extern 是⽤来声明外部符号的&#xff0c;如果⼀个全局的符号在A⽂件中定义的&#xff0c;在B⽂件中想使⽤&#xff0c;就可以使⽤ extern 进⾏声明&#xff0c;然后使⽤。 即在一个源文件中想要使用另一个源文件&#xff0c;即可通过这个extern来声明使用。 2.st…

基于STC12C5A60S2系列1T 8051单片机的液晶显示器LCD1602显示用户自定义字符应用

基于基于STC12C5A60S2系列1T 8051单片机的液晶显示器LCD1602显示两行常规字符应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍液晶显示器LCD1602简单介绍通过液晶显…