当前位置: 首页 > news >正文

【数模/预测】灰色预测

声明:文章参考数学建模清风的网课编写。

文章目录

      • 简介
      • 符号说明
      • 适用条件
        • 准指数规律检验
        • 残差检验
        • 级比偏差检验
      • GM(1, 1)模型求解

简介

 灰色预测是对既含有已知信息又含有不确定信息的系统进行预测,就是对在一定范围内变化的、与时间有关的灰色过程进行预测。

 灰色预测对原始数据进行生成处理来寻找系统变动的规律,并生成有较强规律性的数据序列,然后建立相应的微分方程模型,从而预测事物未来发展趋势的状况。

 GM(1, 1)模型的基本形式(也被称为灰色微分方程): x ( 0 ) ( k ) + a z ( 1 ) ( k ) = b x^{(0)}(k) + az^{(1)}(k)=b x(0)(k)+az(1)(k)=b
 GM(1, 1)模型的白化方程: d x ( 1 ) ( t ) d t = − a ^ x ( 1 ) ( t ) + b ^ \frac{dx^{(1)}(t)}{dt} = -\hat{a}x^{(1)}(t) + \hat{b} dtdx(1)(t)=a^x(1)(t)+b^

符号说明

符号含义
x ( 0 ) x^{(0)} x(0)原非负数据列
x ( 1 ) x^{(1)} x(1)原数据的一次累加数据列
z ( 1 ) z^{(1)} z(1) x ( 1 ) x^{(1)} x(1)的紧邻均值数据列,下标从2开始
a a a- a a a为发展系数
b b b b b b为灰作用量

注意:变量上方加 ^ \hat{} ^表示变量的估计值。如: b ^ \hat{b} b^表示灰作用量的估计值。

适用条件

注意:使用GM(1, 1)模型。第一个‘1’表示微分方程是一阶的,后面的‘1’表示只有一个变量。

1.使用离散非负数据列(数据是以年份度量的非负数据);
2.GM(1, 1)模型的本质是有条件的指数拟合,数据满足准指数规律
3.数据的期数较短且和其他数据之间的关联性不强(小于等于10,也不能太短了,比如只有3期数据)
4.需检验GM(1, 1)模型对原数据的拟合程度。可以使用残差检验级比偏差检验

准指数规律检验

原序列的光滑比: ρ ( k ) = x ( 0 ) ( k ) x ( 1 ) ( k − 1 ) ,     k ≥ 2 \rho (k) = \frac{x^{(0)}(k)}{x^{(1)}(k-1)}, \ \ \ k \ge 2 ρ(k)=x(1)(k1)x(0)(k),   k2原数据的光滑比小于0.5的个数占所有数据总个数的比例大于0.6表示可以通过准指数规律检验;或去掉前两个数据后,原数据的光滑比小于0.5的个数占所有数据总个数的比例大于0.9表示可以通过准指数规律检验。

注意:这里的0.6和0.9均为参考值,可以做出调整。必须注意,下标从2开始,因此数据总数为n-1。

残差检验

绝对残差: ε ( k ) = x ( 0 ) ( k ) − x ^ ( 0 ) ( k ) ,     k ≥ 2 \varepsilon (k) = x^{(0)}(k) - \hat{x} ^{(0)}(k) ,\ \ \ k \ge 2 ε(k)=x(0)(k)x^(0)(k),   k2
相对残差: ε r ( k ) = ∣ x ( 0 ) ( k ) − x ^ ( 0 ) ( k ) ∣ x ( 0 ) ( k ) × 100 % ,     k ≥ 2 \varepsilon_{r} (k) = \frac{|x^{(0)}(k) - \hat{x} ^{(0)}(k)|}{x^{(0)}(k)}\times 100 \%, \ \ \ k \ge 2 εr(k)=x(0)(k)x(0)(k)x^(0)(k)×100%,   k2
平均相对残差: ε r ˉ = 1 n − 1 ∑ k = 2 n ∣ ε r ( k ) ∣ \bar{\varepsilon_{r}} = \frac{1}{n - 1}\sum_{k = 2}^{n} |\varepsilon_{r}(k)| εrˉ=n11k=2nεr(k)如果 ε r ˉ < 0.1 \bar{\varepsilon_{r}} < 0.1 εrˉ<0.1则认为GM(1, 1)模型对原数据的拟合效果非常不错,如果 ε r ˉ < 0.2 \bar{\varepsilon_{r}}< 0.2 εrˉ<0.2则认为GM(1, 1)模型对原数据的拟合效果达到了一般标准。

级比偏差检验

级比: σ ( k ) = x ( 0 ) ( k ) x ( 0 ) ( k − 1 ) ,     k ≥ 2 \sigma (k) = \frac{x^{(0)}(k)}{x^{(0)}(k-1)}, \ \ \ k \ge 2 σ(k)=x(0)(k1)x(0)(k),   k2级比偏差: η ( k ) = ∣ 1 − 1 − 0.5 a ^ 1 + 0.5 a ^ 1 σ ( k ) ∣ ,     k ≥ 2 \eta (k) = \left | 1 - \frac{1-0.5\hat{a} }{1+0.5\hat{a}}\frac{1}{\sigma (k)} \right | , \ \ \ k \ge 2 η(k)= 11+0.5a^10.5a^σ(k)1 ,   k2平均级比偏差: η ˉ = 1 n − 1 ∑ k = 2 n η ( k ) \bar{\eta} = \frac{1}{n-1} \sum_{k=2}^{n} \eta (k) ηˉ=n11k=2nη(k) η ( k ) \eta (k) η(k)越小说明 x ( 0 ) ( k ) x^{(0)}(k) x(0)(k) x ^ ( 0 ) ( k ) \hat{x} ^{(0)}(k) x^(0)(k)越接近。如果 η ˉ < 0.1 \bar{\eta}< 0.1 ηˉ<0.1则认为GM(1, 1)模型对原数据的拟合效果非常不错,如果 η ˉ < 0.2 \bar{\eta}< 0.2 ηˉ<0.2则认为GM(1, 1)模型对原数据的拟合效果达到了一般标准。

GM(1, 1)模型求解

b ^ , a ^ \hat{b}, \hat{a} b^,a^使用最小二乘法即可求出。

 求解GM(1, 1)模型的白化方程,即可用来预测: d x ( 1 ) ( t ) d t = − a ^ x ( 1 ) ( t ) + b ^ \frac{dx^{(1)}(t)}{dt} = -\hat{a}x^{(1)}(t) + \hat{b} dtdx(1)(t)=a^x(1)(t)+b^
 求解微分方程得出:
x ^ ( 0 ) ( m + 1 ) = ( 1 − e a ^ ) [ x ( 0 ) ( 1 ) − b ^ a ^ ] e − a ^ m ,     m ≥ 1 \hat{x} ^{(0)}(m+1) = (1-e^{\hat{a}})\left [ x^{(0)}(1) - \frac{\hat{b}}{\hat{a}} \right ] e^{-\hat{a}m}, \ \ \ m\ge 1 x^(0)(m+1)=(1ea^)[x(0)(1)a^b^]ea^m,   m1新陈代谢gm11模型即:调用普通gm11模型预测的同时,淘汰旧值并加入新值的预测模型。新陈代谢gm11预测代码(主函数main.m):

clear;clc

% 输入应为两组向量 分别表示自变量与因变量且一一对应
% 注意:灰色预测的变量数不应小于3也不应大于10, 且不能包含负数

x = input('自变量:');
y = input('因变量:');

n = length(y);

% 画出原始数据的时间序列图
figure(1);
plot(x, y, 'o-');grid on;
set(gca, 'xtick', x(1:end)); % 设置x坐标间隔为1
title('标题描述');
xlabel('x坐标描述');
ylabel('y坐标描述');

% 检验是否存在负值
if sum(y < 0) > 0 
    disp('灰色预测不能对存在负值的数据进行预测');
end

% 准指数规律检验。 灰色预测原理为:指数拟合,需要数据具有指数规律。
% 通常要求:光滑比小于0.5的数据大于60%;去掉前两个数据后光滑比小于0.5的数据大于90%

cum_y = cumsum(y); % 一次累加和
% 光滑度
rho = y(2:end) ./ cum_y(1:end-1);
disp('光滑比小于0.5的数据占比为:' );
disp(sum(rho < 0.5)/(n-1));

disp('去掉前两个数据后,光滑比小于0.5的数据占比为:');
disp(sum(rho(3:end) < 0.5)/(n-3));

% 级比偏差和相对残差检验
check(y);

% 新尘代谢gm11模型

p = input('请输入预测的次数:');
res = zeros(p, 1);

yy = y;

for i = 1 : p
    res(i) = gm11(yy, 1);
    for j = 1 : n - 1
        yy(j) = yy(j + 1);
    end
    yy(n) = res(i);
end

res

级比偏差和相对残差检验(check.m):

function [] = check(d)
    % 对待预测数据进行级比偏差和相对残差检验
    % d 要进行预测的数据

    n = length(d);
    cum_d = cumsum(d);
    % 紧邻均值序列
    z = (cum_d(1:end-1) + cum_d(2:end)) ./ 2;
    
    % 最小二乘
    y = d(2:end);
    x = z;
    m = n - 1;
    k = (m*sum(x.*y) - sum(x)*sum(y))/(m*sum(x.*x)-sum(x)*sum(x));
    % b为灰作用量, -a为发展系数
    b = (sum(x.*x)*sum(y)-sum(x)*sum(x.*y))/(m*sum(x.*x)-sum(x)*sum(x));
    a = -k;
    
    % 预测
    p_d = zeros(n, 1);
    for i = 1 : n - 1
        p_d(i + 1) = (1-exp(a))*(d(1)-b/a)*exp(-a*i);
    end
    
    % 级比偏差
    u = abs(d(2:end)-p_d(2:end))./d(2:end);
    disp('均级比偏差为(通常小于0.1则说明适合灰色预测):');
    disp(mean(u));
    
    % 相对残差
    disp('均级相对残差为(通常小于0.1则说明适合灰色预测):');
    e = abs(1-(1-0.5*a)/(1+0.5*a)*(d(1:end-1)./d(2:end)));
    disp(mean(e));
end

普通gm11代码:

function res = gm11(d, p)
    % d 要进行预测的数据
    % res 预测结果, 为大小为p的列向量
    % p 为预测次数

    n = length(d);
    res = zeros(p, 1);
    cum_d = cumsum(d);
    % 紧邻均值序列
    z = (cum_d(1:end-1) + cum_d(2:end)) ./ 2;
    
    % 最小二乘
    y = d(2:end);
    x = z;
    m = n - 1;
    k = (m*sum(x.*y) - sum(x)*sum(y))/(m*sum(x.*x)-sum(x)*sum(x));
    % b为灰作用量, -a为发展系数
    b = (sum(x.*x)*sum(y)-sum(x)*sum(x.*y))/(m*sum(x.*x)-sum(x)*sum(x));
    a = -k;
    
    disp(strcat('发展系数为', num2str(-a)));
    disp(strcat('灰作用量为', num2str(b)));
    
    % 预测
    for i = 1 : p
        res(i) = (1-exp(a))*(d(1)-b/a)*exp(-a*(n+i-1));
    end
  
end

相关文章:

  • 基于KDtree的电路故障检测算法的MATLAB仿真(包括matlab仿真录像)
  • 奇妙的“黑板擦”字符串
  • 神经网络参数的学习-损失函数与梯度下降
  • Go(Golang)编程语言
  • 简单DIV CSS布局网站 (HTML学生个人网站作业设计) 体育运动主题网页设计与实现
  • 知识点18--springboot多模块开发
  • 沉睡者IT:零基础学习短视频与+玩转抖音快手
  • 【CSS】伪类选择器有什么用?有哪些是常用的伪类?
  • VirtualBox虚拟机安装教程
  • docker 镜像打包发布
  • MyBatis(详)
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • Linux: 为root账户设置密码
  • 数组常用操作中np.delete用法
  • C++入门-----初始化列表
  • hexo+github搭建个人博客
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • JavaScript DOM 10 - 滚动
  • JS学习笔记——闭包
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Kibana配置logstash,报表一体化
  • WePY 在小程序性能调优上做出的探究
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 解析带emoji和链接的聊天系统消息
  • 使用Gradle第一次构建Java程序
  • 学习笔记TF060:图像语音结合,看图说话
  • 因为阿里,他们成了“杭漂”
  • 函数计算新功能-----支持C#函数
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • %@ page import=%的用法
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (8)STL算法之替换
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (简单) HDU 2612 Find a way,BFS。
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (一)Neo4j下载安装以及初次使用
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • . Flume面试题
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET 中创建支持集合初始化器的类型
  • .NET和.COM和.CN域名区别
  • .net解析传过来的xml_DOM4J解析XML文件
  • .net专家(高海东的专栏)
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • .pyc文件是什么?
  • @JSONField或@JsonProperty注解使用
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • [ solr入门 ] - 利用solrJ进行检索