GM(1,1)灰色预测模型——详细过程与python实现

2023-11-14


前言

灰色预测是一种对含有不确定因素的系统进行预测的方法,有助于解决样本数量少、数据信息少和信息不完整等不确 定的问题。灰色预测 GM(1,1)模型可利用随机原始的离散非负数据列,通过一次累加的方式得到新的离散数据列,建立相应的微分方程模型,用一阶线性微分方程的解来逼近时间累加后形成的新时间序列所呈现的规律。 它通过一个序列即可进行计算,是一阶线性的动态模型。


一、灰色模型的建模步骤及原理

1.灰色模型的基本概念

基本定义:灰色系统是介于黑色模型及白色模型之间的,既包含未知信息又包含己知信息同时系统内各因素具有不确定性关系。
一般表达式:GM(a,b),用a 阶微分方程去对 b个变量进行求解。
基本求解原理:通过对原始数据数列进行处理,生成相关性较强的数据数列,同时建立相关的微分方程进而预测其未来的发展趋势。

2.灰色模型的建模步骤

把原始数据加工成相关数列;
利用生成的相关数列进行求解,得到相应的微分方程参数;
利用得到的参数进行求解预测值;
对预测值进行相关检验。

二、模型建立

1.确定原始数据

首先确定一组原始数据如下:
在这里插入图片描述
其中 n 为未知数的个数。

2.累加数列和邻均值等权数列

对原始数据进行累加得到新数据:
在这里插入图片描述
即每一个对应的数值为原始数据序列对应位置的值以及之前的数值的累加和,同时生成一个新数列的邻均值等权数列如下:
在这里插入图片描述

3.建立关于t 的白化形式一阶一元微分方程 GM(1,1)

对于一组单调递增的数据,累加后的数据可以看作是强烈单调增的数据,可以近似认为符合指数增长。对于指数曲线,它一定是某个一阶线性常系数微分方程,于是可以写出如下表达式
在这里插入图片描述
其中 a,b是我们所要求解的系数,分别为发展系数和灰色作用量,a 的有效区间是(-2,2)。

三、模型求解

1.利用矩阵求解参数(最小二乘法)

在这里插入图片描述
根据最小二乘法求解得到:
在这里插入图片描述

2.对一阶微分方程中进行求解

由白化方程可以得到:
在这里插入图片描述
在这里插入图片描述
将y和C代回ln y = -at+C,最终得到该模型的时间响应式,为:
在这里插入图片描述

四、模型检验

之后从3项指标检验模型的预测精度,分别是平均相对误差、精度和方差比,计算公式如下:
在这里插入图片描述
均方差比表明预测值与实际值误差的大小,其值越小则误差越小。

此外,还需计算小概率误差,小误差概率是指即残差与残差均值的差值的绝对值小于0.6745倍原始数据均方差的概率,其值大,则表示精度高。计算方式如下:
在这里插入图片描述
根据计算结果对比以下GM(1,1)模型预测精度等级表得到检验结果。
在这里插入图片描述

五、数据检验方法

两种检验一般在建模前进行,二选一即可,也可以都进行。

1.光滑比检验

判断数据是否为准光滑序列,采用光滑比分析原始数据光滑性,数据变化越平稳,光滑比越小,计算方法如下:
在这里插入图片描述
若数据序列满足以下两个条件即可判定为准光滑序列,可用于 GM(1,1)预测模型。
在这里插入图片描述

2.级比检验

在这里插入图片描述
若级别检验后发现不通过,则需要添加常数项,使其落入区间内,即有
在这里插入图片描述


总结

微分方程模型作为灰色系统理论预测用的模型,其主要凭借以下几点:
(1)灰色系统理论把原始数列在固定范围变化的灰色量,认定随机过程是在一定时区一定范围内变化的灰色过程。
(2) 一阶微分方程有着指数增长形式的解值,无规律的原始数列经过累加生成得到累加数列后,此数列也具备指数增加的规律。灰色模型是生成的数据数列所建模型。
(3) 灰色系统理论可建立 GM(1,n)模型来解决高阶系统建模问题。一阶微分方程所组成的灰色模型称为 GM 模型群。
(4) GM模型采用累加生成做生成处置,为了获得预测的数据,由 GM 模型所得的数据对其进行逆生成处理,即累减生成还原处理。
(5) 在灰色系统理论中,为了提高预测精度,可以对数据进行合适的取舍、对灰数采用不同的生成方式和调节残差的级别来实现。

代码实现

构建数列进行光滑比检验

import numpy as np
X0 = np.array(['数据'])
X1 = X0.cumsum()
rho = [X0[i] / X1[i - 1] for i in range(1,len(X0))]
rho_ratio = [rho[i + 1] / rho[i] for i in range(len(rho) - 1)]
print("rho:",rho)
print("rho_ratio:",rho_ratio)
flag = True
for i in range(1,len(rho) - 1):
    if rho[i] > 0.5 or rho[i + 1] / rho[i] >= 1:
        flag = False
if rho[-1] > 0.5:
    flag = False
if flag:
    print("数据通过光滑校验")
else:
    print("该数据未通过光滑校验")

构建数列进行级比检验

import math as mt
X0 = ['数据']
for i in range(len(X0)-1):
    l = X0[i]/X0[i+1]
    if l <= mt.exp(-2/(len(X0)+1)) or l >= mt.exp(2/(len(X0)+1)):
        break
    else:
        pass
if i == len(X0)-2 and l > mt.exp(-2/(len(X0)+1)) and l < mt.exp(2/(len(X0)+1)):
    print('级比检验通过')
else:
    print('级比检验不通过')

级比检验不通过处理

import math as mt
X0 = [88898,97242,97990,93363,88093,103852,105475,114183,133762,162214,173977,200973]
j = 1
while True:
    YO = [k+j for k in X0]
    j += 1
    for m in range(len(YO) - 1):
        l = YO[m] / YO[m + 1]
        if l > mt.exp(-2 / (len(X0) + 1)) and l < mt.exp(2 / (len(X0) + 1)):
            b = True
        else:
            b = False
            break
    if b == True:
        print("新的原始数列为:",YO)
        c = j -1
        print("c的值为:",c)
        break
    else:
        continue

构建模型并求解

import numpy as np
import math as mt

X0 = ['数据']
# 累加数列
X1 = [X0[0]]
add = X0[0] + X0[1]
X1.append(add)
i = 2
while i < len(X0):
    add = add + X0[i]
    X1.append(add)
    i += 1
    
# 紧邻均值序列
Z = []
j = 1
while j < len(X1):
    num = (X1[j] + X1[j - 1]) / 2
    Z.append(num)
    j = j + 1

# 最小二乘法计算
Y = []
x_i = 0
while x_i < len(X0) - 1:
    x_i += 1
    Y.append(X0[x_i])
Y = np.mat(Y)
Y = Y.reshape(-1,1)
B = []
b = 0
while b < len(Z):
    B.append(-Z[b])
    b += 1
B = np.mat(B)
B = B.reshape(-1,1)
c = np.ones((len(B),1))
B = np.hstack((B,c))
print("B",B)

# 求出参数
alpha = np.linalg.inv(B.T.dot(B)).dot(B.T).dot(Y)
a = alpha[0,0]
b = alpha[1,0]
print('alpha',alpha)
print("a=",a)
print("b=",b)

# 生成预测模型
GM = []
GM.append(X0[0])
did = b/a
k = 1
while k < len(X0):
    GM.append((X0[0] - did) * mt.exp(-a * k) + did)
    k += 1

# 做差得到预测序列
G = []
G.append(X0[0])
g = 1
while g < len(X0):
    G.append(round(GM[g] - GM[g - 1]))
    g += 1
print("预测数列为:",G)

绘图

import matplotlib.pyplot  as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False 

X0 = ['原始数据']
G = ['预测数据']
G = [g-37315 for g in G]
r = range(len(X0))
t = list(r)
plt.plot(t,X0,color='r',linestyle="--",label='true')
plt.plot(t,G,color='b',linestyle="--",label="predict")
plt.legend()
plt.show()

模型检验

import numpy as np
import math as mt
X0 = ['原始数据']
G = ['预测数据']
X0 = np.array(X0)
G = np.array(G)
e = X0 - G  #残差
q = e / X0  # 相对误差
w = 0
for q_i in q:
    w += q_i
w = w/len(X0)
print('精度为{}%'.format(round((1-w)*100,2)))

s0 = np.var(X0)
s1 = np.var(e)
S0 = mt.sqrt(s0)
S1 = mt.sqrt(s1)
C = S1 / S0
print('方差比为:',C)

p = 0
for s in range(len(e)):
    if (abs(e[s]-np.mean(e)) < 0.6745 * S1):
        p = p + 1
P = p / len(e)
print('小概率误差为:',P)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GM(1,1)灰色预测模型——详细过程与python实现 的相关文章

  • 保存为 HDF5 的图像未着色

    我目前正在开发一个将文本文件和 jpg 图像转换为 HDF5 格式的程序 用HDFView 3 0打开 似乎图像仅以灰度保存 hdf h5py File Sample h5 img Image open Image jpg data np
  • 使用特定的类/函数预加载 Jupyter Notebook

    我想预加载一个笔记本 其中包含我在另一个文件中定义的特定类 函数 更具体地说 我想用 python 来做到这一点 比如加载一个配置文件 包含所有相关的类 函数 目前 我正在使用 python 生成笔记本并在服务器上自动启动它们 因为不同的
  • 元组有什么用?

    我现在正在学习 Python 课程 我们刚刚介绍了元组作为数据类型之一 我阅读了它的维基百科页面 但是 我无法弄清楚这种数据类型在实践中会有什么用处 我可以提供一些需要一组不可变数字的示例吗 也许是在 Python 中 这与列表有何不同 每
  • 将html数据解析成python列表进行操作

    我正在尝试读取 html 网站并提取其数据 例如 我想查看公司过去 5 年的 EPS 每股收益 基本上 我可以读入它 并且可以使用 BeautifulSoup 或 html2text 创建一个巨大的文本块 然后我想搜索该文件 我一直在使用
  • Python 中的舍入浮点问题

    我遇到了 np round np around 的问题 它没有正确舍入 我无法包含代码 因为当我手动设置值 而不是使用我的数据 时 返回有效 但这是输出 In 177 a Out 177 0 0099999998 In 178 np rou
  • 使用 kivy textinput 的 'input_type' 属性的问题

    您好 我在使用 kivy 的文本输入小部件的 input type 属性时遇到问题 问题是我制作了两个自定义文本输入 其中一个称为 StrText 其中设置了 input type text 然后是第二个文本输入 名为 NumText 其
  • 为什么 PyYAML 花费这么多时间来解析 YAML 文件?

    我正在解析一个大约 6500 行的 YAML 文件 格式如下 foo1 bar1 blah name john age 123 metadata whatever1 whatever whatever2 whatever stuff thi
  • Python 2:SMTPServerDisconnected:连接意外关闭

    我在用 Python 发送电子邮件时遇到一个小问题 me my email address you recipient s email address me email protected cdn cgi l email protectio
  • Python beautifulsoup 仅限 1 级文本

    我看过其他 beautifulsoup 得到相同级别类型的问题 看来我的有点不同 这是网站 我正试图拿到右边那张桌子 请注意表的第一行如何展开为该数据的详细细分 我不想要那个数据 我只想要最顶层的数据 您还可以看到其他行也可以展开 但在本例
  • 如何在不丢失注释和格式的情况下更新 YAML 文件 / Python 中的 YAML 自动重构

    我想在 Python 中更新 YAML 文件值 而不丢失 Python 中的格式和注释 例如我想改造 YAML 文件 value 456 nice value to value 6 nice value 界面类似于 y yaml load
  • pyspark 将 twitter json 流式传输到 DF

    我正在从事集成工作spark streaming with twitter using pythonAPI 我看到的大多数示例或代码片段和博客是他们从Twitter JSON文件进行最终处理 但根据我的用例 我需要所有字段twitter J
  • javascript 是否有等效的 __repr__ ?

    我最接近Python的东西repr这是 function User name password this name name this password password User prototype toString function r
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 从 NumPy ndarray 中选择行

    我只想从 a 中选择某些行NumPy http en wikipedia org wiki NumPy基于第二列中的值的数组 例如 此测试数组的第二列包含从 1 到 10 的整数 gt gt gt test numpy array nump
  • 如何在 Windows 命令行中使用参数运行 Python 脚本

    这是我的蟒蛇hello py script def hello a b print hello and that s your sum sum a b print sum import sys if name main hello sys
  • 为什么 Pickle 协议 4 中的 Pickle 文件是协议 3 中的两倍,而速度却没有任何提升?

    我正在测试 Python 3 4 我注意到 pickle 模块有一个新协议 因此 我对 2 个协议进行了基准测试 def test1 pickle3 open pickle3 wb for i in range 1000000 pickle
  • 如何在 pygtk 中创建新信号

    我创建了一个 python 对象 但我想在它上面发送信号 我让它继承自 gobject GObject 但似乎没有任何方法可以在我的对象上创建新信号 您还可以在类定义中定义信号 class MyGObjectClass gobject GO
  • Scipy Sparse:SciPy/NumPy 更新后出现奇异矩阵警告

    我的问题是由大型电阻器系统的节点分析产生的 我基本上是在设置一个大的稀疏矩阵A 我的解向量b 我正在尝试求解线性方程A x b 为了做到这一点 我正在使用scipy sparse linalg spsolve method 直到最近 一切都
  • Django-tables2 列总计

    我正在尝试使用此总结列中的所有值文档 https github com bradleyayers django tables2 blob master docs pages column headers and footers rst 但页
  • Kivy - 单击按钮时编辑标签

    我希望 Button1 在单击时编辑标签 etykietka 但我不知道如何操作 你有什么想法吗 class Zastepstwa App def build self lista WebOps getList layout BoxLayo

随机推荐

  • Flowable入门系列文章29 - Activity解读 05

    1 消息开始事件 描述 甲消息开始事件可用于使用已命名的信息来启动一个过程实例 这有效地允许我们使用消息名称从一组替代开始事件中选择正确的开始事件 在部署具有一个或多个消息启动事件的流程定义时 应考虑以下注意事项 消息开始事件的名称在给定的
  • 机器学习实战:Python基于支持向量机SVM-RFE进行分类预测(三)

    文章目录 1 前言 1 1 支持向量机的介绍 1 2 支持向量机的应用 2 demo数据集演示 2 1 导入函数 2 2 构建数据集拟合 2 3 预测模型及可视化 3 实例演示分类 非SVM 3 1 导入函数和数据 3 2 简单线性分类 3
  • 剑指offer Java实现 第五题

    第五题 请实现一个函数 将一个字符串中的每个空格替换成 20 例如 当字符串为We Are Happy 则经过替换之后的字符串为We 20Are 20Happy 实现代码 public static String replaceSpace
  • MSCOCO数据集格式转化成VOC数据集格式

    MSCOCO数据集格式转化成VOC数据集格式 转载请注明原出处 http blog csdn net ouyangfushu article details 79543575 作者 SyGoing QQ 2446799425 SSD目标检测
  • [springmvc学习]8、JSR 303验证及其国际化

    目录 简介 常见注解 基本使用 BindResult获取异常信息 自定义提示信息 取消属性绑定 总结 简介 JSR 303 是 Java 为 Bean 数据合法性校验提供的标准框架 它已经包含在 JavaEE 中 我们可以通过注解的方式来指
  • SFTP报错,sftp couldn‘t stat remote file:No such file or directory

    原因 使用sftp进行文件传输时 需要连接到远程服务器的root用户上去 这就导致了另一个问题 在命令行使用su命令并输入root用户密码可以切换到root用户 但是使用sftp连接root用户 会连接失败 同类型的问题也有使用xshell
  • IDE介绍

    集成开发工具 gt gt gt IDE 编码工具取代了简单的记事本工具 辅助程序员编写源代码的常用高效编写工具 类似word 我们写文档会打开word文档来编写 代码也同样需要借助工具来开发 常见的编辑工具有记事本 sublime text
  • SD HOST——(一)SD简介

    Micro SD有九个引脚 TF卡只要八个 少一个地 CLK CMD 双向口 用于发命令和接收response VDD GND GND D3 D2 D1 D0 D3 D0不一定传输的是数据 读SD内部寄存器状态也可以从D3 30输出 CMD
  • Pytorch并行训练方法-单机多卡

    简单方便的 nn DataParallel DataParallel 可以帮助我们 使用单进程控 将模型和数据加载到多个 GPU 中 控制数据在 GPU 之间的流动 协同不同 GPU 上的模型进行并行训练 细粒度的方法有 scatter g
  • 通过栈实现算术表达式的计算

    最近在看数据结构的栈 其中有一节为栈应用到算术表达式的计算 接下来我讲举例说明如何用栈去计算 如有不对的地方 请各位大神指教 1 定义操作符的优先级 作为栈顶操作符时优先级仅高于 作为栈顶操作符时优先级是最高的 和 优先级一样 但是一个作为
  • redis-cluster集群添加或删除节点以及槽重新分片

    Redis版本 5 0 0 redis 5 0 0版本后可以不用安装ruby环境 集群命令说明 redis cli cluster help Cluster Manager Commands create host1 port1 hostN
  • LLVM 介绍

    https blog csdn net weixin 38244174 article details 82705181 最近开始搞LLVM 下面我将从以下五个方面来介绍LLVM 分别是 1 LLVM是什么 2 LLVM的组成部分 3 LL
  • Python爬虫教程(非常详细)从零基础入门到精通,看完这一篇就够了

    对于绝大多数想要学习Python的朋友而言 爬虫绝对是学习Python的最好的骑手和入门方式 我当时选择Python学习 也是瞄准了Python爬虫 因为爬虫思维模式固定 编程模式也相对简单 一般在细节处理上积累一些经验都可以成功 一 正确
  • __setup宏定义

    setup宏定义 struct obs kernel param const char str int setup func char int early define initconst section init rodata defin
  • QT程序自适应窗口大小

    作为QT菜鸟的一员 总是容易遇到各种问题 然后历经千辛万苦解决它 问题 我的程序需要在ARM板 Linux系统 上跑 也需要在PC Windows上 跑 他们拥有不同大小的屏幕 在程序中布局的界面能够很好地适应窗口的大小变化 但是在UI设计
  • HTTP协议实例详解

    HTTP是一个应用层协议 由请求和响应构成 是一个标准的客户端服务模型 HTTP通常承载于TCP协议之上 有时候也承载于TLS或SSL协议层之上 这个时候 就成了常说的HTTPS 默认HTTP的端口号为80 HTTPS的端口号为443 缺点
  • Netty聊天系统(1)通过自定义协议实现客户端与服务器端通信

    1 自定义实现客户端与服务器端通信的协议 1 1 通信协议的设计 自定义的通信协议需要哪些内容 1 魔数 第一个字段一般是魔数 一般固定的几个字节 一个PNG图片的编码中有固定数量固定内容的字节 用于表示这是一个PNG图片 Java的Cla
  • 百度搜索 抓取真实url

    现在的百度搜索url都是加密的 不是真实url 比如搜索豆瓣 复制链接地址得到的url如下 https www baidu com link url vsdsl04PUGwYT udMGNDBSgQ4D62grmcfm8fM4LVjYLVV
  • vue初始化项目出现 npm ERR fatal unable to access ‘httpsgithub.comnhnraphael.git‘ OpenSSL SSL_read

    vue初始化项目出现npm ERR fatal unable to access https github com nhn raphael git OpenSSL SSL read 错误 解决方法 没有安装预编译插件 我的项目是用sass
  • GM(1,1)灰色预测模型——详细过程与python实现

    文章目录 前言 一 灰色模型的建模步骤及原理 1 灰色模型的基本概念 2 灰色模型的建模步骤 二 模型建立 1 确定原始数据 2 累加数列和邻均值等权数列 3 建立关于t 的白化形式一阶一元微分方程 GM 1 1 三 模型求解 1 利用矩阵