数学建模 | 灰色预测原理及python实现

news2024/12/26 22:24:17

目录

一、灰色预测的原理

二、灰色预测的应用及python实现


一、灰色预测的原理

灰色预测是以灰色模型为基础,灰色模型GM(n,h)是微分方程模型,可用于描述对象做长期、连续、动态的反应。其中,n代表微分方程式的阶数,h代表微分方程式的变化数目。在诸多的灰色模型中,以灰色系统中单序列一阶线性微分方程模型GM(1,1)最为常见。

下面说明GM(1,1)模式:

设有原始数据列X^{(0)}=\left\{x^{(0)}(1),x^{(0)}(2),...,x^{(0)}(n)\right\},n为数据个数,则可以根据以下步骤来建立GM(1,1)模型:

步骤一:

与原来统计累加以便减弱随机数据序列的波动性与 随机性,从而得到新数据序列:

X^{(1)}=\left\{x^{(1)}(1),x^{(1)}(2),...,x^{(1)}(n)\right\}

其中,x^{(1)}(k)中各数据表示前几项的相加,即:

x^{(1)}(k)=\sum_{i=1}^{k}x^{(0)}(i),k=1,2,...n

步骤二:

Z^{(1)}X^{(1)}的紧邻均值生成序列:

Z^{(1)}=\left\{z^{(1)}(2),z^{(1)}(3),...,z^{(1)}(n)\right\} 

其中,z^{(1)}(k)=0.5x^{(1)}(k)+0.5x^{(1)}(k-1) 

步骤三:

建立GM(1,1) 的灰微分方程为:

x^{(0)}(k)+az^{(1)}(k)=b

灰微分方程的白化方程为:

\tfrac{dx^{(1)}(t)}{dt}+ax^{(1)}(t)=b 

其中,a为发展系数,b为内生控制系数。

步骤四:

模型求解:构造矩阵B和向量Y:

B=\begin{bmatrix} -z^{(1)}(2) & 1\\ -z^{(1)}(3) &1 \\ ... & ...\\-z^{(1)}(n) &1 \end{bmatrix}   ,  Y=\begin{bmatrix} x^{(0)}(2)\\ x^{(0)}(3) \\... \\x^{(0)}(n) \end{bmatrix}

步骤五:

\hat{a}为待估参数向量,即:

\hat{a}=[ab]^{T}=(B^{T}B)^{-1}B^{T}Y 

 这是利用正规方程得到的闭式解

步骤六:

求解白化方程,可得到灰色预测的离散时间响应函数:

\hat{x}^{(1)}(t)=(x^{(1)}(0)-\frac{b}{a})e^{-ak}+\frac{b}{a}

那么相应的时间相应序列为:

\hat{x}^{(1)}(k+1)=(x^{(1)}(0)-\frac{b}{a})e^{-ak}+\frac{b}{a} 

x^{(1)}(0)=x^{(0)}(1),则所得的累加预测值为:

\hat{x}^{(1)}(k+1)=(x^{(0)}(1)-\frac{b}{a})e^{-ak}+\frac{b}{a},k=1,2,...,n-1 

将预测值还原为:

\hat{x}^{(0)}(k+1)=\hat{x}^{(1)}(k+1)-\hat{x}^{(1)}(k)=(x^{(0)}(1)-\frac{b}{a})(e^{-ak}-e^{-a(k-1)})=(x^{(0)}(1)-\frac{b}{a})(1-e^{a})e^{-ak} 

二、灰色预测的应用及python实现

某公司根据2015-2020年的产品的销售额,试构建GM(1,1)预测模型,并预测2021年的产品销售额。

原始数据为:X^{(0)}=(2.67,3.13,3.25,3.36,3.56,3.72) 

Python实现代码:

import numpy as np

class GM:

    def __init__(self,N,n,data):
        '''
        :param N: the number of data
        :param n: the number of data that is needs to be predicted
        :param data: time series
        '''
        self.N=N
        self.n=n
        self.data=data


    def prediction(self,a,b):
        '''
        :param a: parameter a of the grey prediction model
        :param b: parameter b of the grey prediction model
        :return: a list of prediction
        '''

        # a list to save n predition
        pre_data=[]

        # calculating the prediction
        for i in range(self.n):
            pre=(self.data[0]-b/a)*(1-np.exp(a))*np.exp(-a*(self.N+i))
            pre_data.append(pre[0])

        return pre_data


    def residual_test(self,a,b):
        '''
        :param a: parameter a of the grey prediction model
        :param b: parameter b of the grey prediction model
        '''

        # prediction od raw data
        pre_rawdata=self.sequence_prediction(a,b)

        # calculating absolute residual
        abs_residual=[]
        for i in range(self.N):
            r=abs(pre_rawdata[i]-self.data[i])
            abs_residual.append(r)

        # calculating relative residual
        rel_residual=[]
        for i in range(self.N):
            rel=abs_residual[i]/abs(self.data[0])
            rel_residual.append(rel)

        # calculating average relative residual
        avg_residual=0
        for i in range(self.N):
            avg_residual=avg_residual+rel_residual[i]
        avg_residual=avg_residual/self.N
        print("average relative residual: {}".format(avg_residual[0]))

        if avg_residual<0.01:
            print("model accuracy: excellent(Level I)")
        elif avg_residual<0.05:
            print("model accuracy: qualified(LevelⅡ)")
        elif avg_residual<0.10:
            print("model accuracy: barely qualified(Level Ⅲ)")
        else:
            print("model accuracy: unqualified(Level Ⅳ)")



    def sequence_prediction(self,a,b):
        '''
        :param a: parameter a of the grey prediction model
        :param b: parameter b of the grey prediction model
        :return:  prediction of raw data
        '''

        pre_rawdata=[]
        pre_rawdata.append(self.data[0])
        for i in range(1,self.N):
            pre_raw=(self.data[0]-b/a)*(1-np.exp(a))*np.exp(-a*(i))
            pre_rawdata.append(pre_raw)

        return pre_rawdata


    def GM11(self):
        '''
        :return: n prediction if the grey prediction model can be used
                 and parameter a and parameter b
        '''

        # accumulate raw data
        cumdata=[]
        for i in range(self.N):
            s=0
            for j in range(i+1):
                s=s+self.data[j]
            cumdata.append(s)

        # calculating the nearest neighbor mean generation sequence
        Z=[]  # len(Z)=N-1
        for i in range(1,self.N):
            z=0.5*cumdata[i]+0.5*cumdata[i-1]
            Z.append(z)

        # construct data matrix B and data vector Y
        B=np.array([[-Z[i],1] for i in range(self.N-1)])
        Y=np.array([[self.data[i]] for i in range(1,self.N)])

        # calculating parameter a and parameter b
        A=np.dot(np.dot(np.linalg.inv(np.dot(B.T,B)),B.T),Y)
        a=A[0]
        b=A[1]

        # determine whether the grey prediction model can be used
        if (-1)*a>1:
            print("the grey prediction model can not be used")
        else:
            #print("a={}".format(a[0]))
            #print("b={}".format(b[0]))

            # derive a prediction model and predict
            pre_data=self.prediction(a,b)
            return pre_data,a,b


if __name__=="__main__":
    data=[2.67,3.13,3.25,3.36,3.56,3.72]
    N=6
    n=1
    # create object
    grey_prediction=GM(N,n,data)
    # get prediction
    pre_data,a,b=grey_prediction.GM11()
    # get average relative residual
    avg_residual=grey_prediction.residual_test(a,b)
    print("predicted data: {}".format(pre_data[0]))

运行结果:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

下一代搜索引擎会什么?

现在是北京时间2023年11月18日。聊一聊搜索。 说到搜索&#xff0c;大家首先想到的肯定是谷歌&#xff0c;百度。我把这些定义成上一个时代的搜索引擎。ChatGPT已经火热了有一年的时间了&#xff0c;大家都认为Ai搜索是下一代的搜索。但是AI搜索&#xff0c;需要的是很大算力&a…

【动态规划】求解编辑距离问题

目录 问题描述递推关系运行实例时空复杂度优化Hirschberg 算法 问题描述 编辑距离问题是求解将⼀个字符串转换为另⼀个字符串所需的插⼊、删除、替换的最小次数。 C O M M O M → s u b C O M M U M → s u b C O M M U N → i n s C O M M U N E \mathbb{COMMOM} \overset{sub…

迪杰斯特拉算法(C++)

目录 介绍&#xff1a; 代码&#xff1a; 结果&#xff1a; 介绍&#xff1a; 迪杰斯特拉算法&#xff08;Dijkstras algorithm&#xff09;是一种用于计算加权图的单点最短路径的算法。它是由荷兰计算机科学家Edsger W. Dijkstra在1956年发明的。 该算法的思路是&#xf…

Confluence 快速安装教程

安装jdk yum install -y java-1.8.0-openjdk.x86_64 java -version 安装MySQL mkdir -p /data/mysql/data chmod 777 /data/mysql/datadocker rm -f mysql docker run -d --name mysql \-p 3306:3306 \-e MYSQL_ROOT_PASSWORDfingard1 \-v /data/mysql/data:/var/lib/mysql …

使用Pandas进行时间重采样,充分挖掘数据价值

大家好&#xff0c;时间序列数据蕴含着很大价值&#xff0c;通过重采样技术可以提升原始数据的表现形式。本文将介绍数据重采样方法和工具&#xff0c;提升数据可视化技巧。 在进行时间数据可视化时&#xff0c;数据重采样是至关重要且非常有用的&#xff0c;它支持控制数据的…

SQL 文本函数

前言 SQL文本函数是SQL语言中非常有用的一类函数&#xff0c;它们用于处理和操作字符串数据。在实际应用中&#xff0c;我们经常需要对数据库中的文本数据进行各种操作&#xff0c;比如提取子串、替换子串、拼接字符串等等。而SQL文本函数可以帮助我们轻松地完成这些任务&#…

SQL SERVER 2008安装教程

SQL SERVER 2008安装教程 本篇文章介绍了安装SQL Server 2008企业版的软硬件配置要求&#xff0c;安装过程的详细步骤&#xff0c;以及需要注意的事项。 安装步骤 (1). 在安装文件setup.exe上&#xff0c;单击鼠标右键选择“以管理员的身份运行”&#xff0c;如下图所示&#…

一文搞懂设计模式之代理模式

大家好&#xff0c;我是晴天&#xff0c;本周我们又见面了。本周有点发烧感冒&#xff0c;更文有点慢了&#xff0c;请大家见谅。言归正传&#xff0c;本周我们继续一起学习一文搞懂设计模式系列文章之代理模式。 什么是代理模式 我们先来看看 GoF 对代理模式的定义&#xff1…

HarmonyOS真机调试报错:INSTALL_PARSE_FAILED_USESDK_ERROR处理

1、 新建应用时选择与自己真机匹配的sdk版本 查看自己设备sdk版本 创建时先择匹配版本&#xff1a; 2、 根据报错提示连接打开处理方案 3、查询真机版本对应的compileSdkVersion 和 compatibleSdkVersion 提示3.1版本之后和3.1版本之前的不同命令&#xff08;此处为3.0版…

Git企业开发级讲解(四)

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、理解分⽀二、创建分支三、切换分⽀四、合并分⽀五、删除分⽀六、合并冲突七、分⽀管理策略…

轻量封装WebGPU渲染系统示例<34>-数据驱动之Json构建场景

场景和数据之间的互通&#xff1a; 场景数据化或者数据化场景&#xff0c;是当前的主流场景数据构成方式。方便传输方便交换甚至是交互。 内置数据互通机制更有利于用户在各种应用场合下实现具体的3D相关的应用需求。用户只需要关心标准的或者约定好的数据定义及操作方式就能方…

PostgreSQL 入门

文章目录 PostgreSQL介绍PostgreSQL和MySQL的区别PostgreSQL的安装PostgreSQL的配置远程连接配置配置数据库的日志 PostgreSQL基本操作用户操作权限操作 图形化界面安装总结 PostgreSQL介绍 PostgreSQL是一个功能强大的 开源 的关系型数据库&#xff0c;底层基于C实现。其开源…

Sam Altman 被罢免细节曝光,投资 100+ 公司或成「话柄」?

2022 年 11 月&#xff0c;ChatGPT 发布掀起 AI 狂潮。时隔 1 年&#xff0c;2023 年 11 月&#xff0c;ChatGPT 之父、Sam Altman 的一项人事巨变&#xff0c;再次掀起了一场 AI 界的风暴&#xff0c;只是这次并不是技术革命&#xff0c;而是 OpenAI 巨头换帅——Sam Altman 被…

YOLO目标检测——烟雾检测数据集下载分享【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;烟雾检测数据集可用于监控烟雾情况&#xff0c;实现火灾的早期预警。数据集说明&#xff1a;烟雾检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;含烟雾1个类别标签说明&#xff1a;使用lableimg标注软件标注&am…

QtCreator开发环境的安装和配置

QtCreator开发环境的安装和配置 介绍下载与安装环境介绍示例新建工程示例程序 帮助模式Qt Designer(设计师)Qt Linguist(预言家)结论 介绍 Qt Creator是一个跨平台、完整的集成开发环境&#xff08;IDE&#xff09;&#xff0c;专门用于Qt开发。它包含了完整的编辑器、调试器和…

数据结构 栈与队列详解!!

一.栈 关于内存中的栈和数据结构中的栈是不同的&#xff0c;本章着重讲的是数据结构的栈。 这是一张关于栈的表达图。从图中可以看出栈很像是一副卡牌&#xff0c;发牌时只能从上取出&#xff0c;即出栈。 而入栈则是像你出牌后&#xff0c;要把你出的牌压在上一张出的牌上面。…

Android跨进程通信,IPC,RPC,Binder系统,C语言应用层调用

文章目录 Android跨进程通信&#xff0c;IPC&#xff0c;RPC&#xff0c;Binder系统&#xff0c;C语言应用层调用&#xff08;&#xff09;1.概念2.流程3.bctest.c3.1 注册服务&#xff0c;打开binder驱动3.2 获取服务 4.binder_call Android跨进程通信&#xff0c;IPC&#xf…

Swagger示例

对于项目完成后不用写文档,好处还是蛮大的 不需要关注项目其他 只关注接口与实体类即可 SpringBoot项目 依赖 <!--Swagger依赖--> <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version…

Vue3 插槽 v-slot

插槽 视频链接&#xff1a;尚硅谷vue-插槽章节 不使用插槽的情况下 结果&#xff1a; 1 默认插槽 结果&#xff1a; 2 具名插槽 #b是v-slot:b 的缩写 顾名思义就是指着名字去插入 结果&#xff1a; 3 作用域插槽 可以传递数据的插槽&#xff0c;子组件可以将数据回…

​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​

软考-高级-系统架构设计师教程&#xff08;清华第2版&#xff09;【第15章 面向服务架构设计理论与实践&#xff08;P527~554&#xff09;-思维导图】 课本里章节里所有蓝色字体的思维导图