来源公式推导连接

  https://blog.csdn.net/qq_36387683/article/details/88554434

关键词:灰色预测 python 实现 灰色预测 GM(1,1)模型 灰色系统 预测 灰色预测公式推导

一、前言

  本文的目的是用Python和类对灰色预测进行封装

二、原理简述

1.灰色预测概述

  灰色预测是用灰色模型GM(1,1)来进行定量分析的,通常分为以下几类:
    (1) 灰色时间序列预测。用等时距观测到的反映预测对象特征的一系列数量(如产量、销量、人口数量、存款数量、利率等)构造灰色预测模型,预测未来某一时刻的特征量,或者达到某特征量的时间。
    (2) 畸变预测(灾变预测)。通过模型预测异常值出现的时刻,预测异常值什么时候出现在特定时区内。
    (3) 波形预测,或称为拓扑预测,它是通过灰色模型预测事物未来变动的轨迹。
    (4) 系统预测,对系统行为特征指标建立一族相互关联的灰色预测理论模型,在预测系统整体变化的同时,预测系统各个环节的变化。
  上述灰色预测方法的共同特点是:
    (1)允许少数据预测;
    (2)允许对灰因果律事件进行预测,例如:
      灰因白果律事件:在粮食生产预测中,影响粮食生产的因子很多,多到无法枚举,故为灰因,然而粮食产量却是具体的,故为白果。粮食预测即为灰因白果律事件预测。
      白因灰果律事件:在开发项目前景预测时,开发项目的投入是具体的,为白因,而项目的效益暂时不很清楚,为灰果。项目前景预测即为灰因白果律事件预测。
    (3)具有可检验性,包括:建模可行性的级比检验(事前检验),建模精度检验(模型检验),预测的滚动检验(预测检验)。

2.GM(1,1)模型理论

  GM(1,1)模型适合具有较强的指数规律的数列,只能描述单调的变化过程。已知元素序列数据:

做一次累加生成(1-AGO)序列:


其中

的紧邻均值生成序列:

其中,

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

其中,为发展系数,为灰色作用量。设为待估参数向量,即,则灰微分方程的最小二乘估计参数列满足

其中


再建立灰色微分方程的白化方程(也叫影子方程):

白化方程的解(也叫时间响应函数)为

那么相应的GM(1,1)灰色微分方程的时间响应序列为:

再做累减还原可得

即为预测方程。

注1:原始序列数据不一定要全部使用,相应建立的模型也会不同,即不同;

注2:原始序列数据必须要等时间间隔、不间断。

3.算法步骤

(1) 数据的级比检验
  为了保证灰色预测的可行性,需要对原始序列数据进行级比检验。
  对原始数据列

计算序列的级比:  

若所有的级比都落在可容覆盖内,则可进行灰色预测;否则需要对做平移变换,,使得满足级比要求。

(2) 建立GM(1,1)模型,计算出预测值列。

(3) 检验预测值:

① 相对残差检验,计算

  

,则认为达到一般要求,若 ,则认为达到较高要求;

② 级比偏差值检验

  根据前面计算出来的级比, 和发展系数, 计算相应的级比偏差:

  

, 则认为达到一般要求,若, 则认为达到较高要求。

(4) 利用模型进行预测。

三、程序实现 python实现

  需要安装numpy和Torch加速等

# condig:utf-8
import torch as th
import numpy as np
class GM(): def __init__(self):
# 判断是否可用 gpu 编程 , 大量级计算使用GPU
self._is_gpu = False # th.cuda.is_available() def fit(self,dt:list or np.ndarray):
self._df :th.Tensor = th.from_numpy(np.array(dt,dtype=np.float32)) if self._is_gpu:
self._df.cuda() self._n:int = len(self._df) self._x,self._max_value = self._sigmod(self._df) z:th.Tensor = self._next_to_mean(th.cumsum(self._x,dim=0)) self.coef:th.Tensor = self._coefficient(self._x, z) del z self._x0:th.Tensor = self._x[0] self._pre:th.Tensor = self._pred() # 归一化
def _sigmod(self,x:th.Tensor):
_maxv:th.Tensor = th.max(x)
return th.div(x,_maxv),_maxv # 计算紧邻均值数列
def _next_to_mean(self, x_1:th.Tensor): z:th.Tensor = th.zeros(self._n-1)
if self._is_gpu:
z.cuda() for i in range(1,self._n): # 下标从0开始,取不到最大值
z[i - 1] = 0.5 * x_1[i] + 0.5 * x_1[i - 1] return z # 计算系数 a,b
def _coefficient(self,x:th.Tensor,z:th.Tensor): B:th.Tensor = th.stack((-1*z, th.ones(self._n-1)),dim=1) Y:th.Tensor = th.tensor(x[1:],dtype=th.float32).reshape((-1,1)) if self._is_gpu:
B.cuda()
Y.cuda() # 返回的是a和b的向量转置,第一个是a 第二个是b;
return th.matmul(th.matmul(th.inverse(th.matmul(B.t(), B)), B.t()),Y) def _pred(self,start:int=1,end:int=0): les:int = self._n+end resut:th.Tensor = th.zeros(les) if self._is_gpu:
resut.cuda() resut[0] = self._x0 for i in range(start,les):
resut[i] = (self._x0 - (self.coef[1] / self.coef[0])) * \
(1 - th.exp(self.coef[0])) * th.exp(-1 * self.coef[0] * (i))
del les
return resut # 计算绝对误差
def confidence(self):
return round((th.sum(th.abs(th.div((self._x-self._pre),self._x)))/self._n).item(),4) # 预测个数,默认个数大于等于0,
def predict(self,m:int=1,decimals:int=4): y_pred:th.Tensor = th.mul(self._pre,self._max_value) y_pred_ = th.zeros(1) if m<0:
return "预测个数需大于等于0"
elif m>0:
y_pred_:th.Tensor = self._pred(self._n,m)[-m:].mul(self._max_value)
else:
if self._is_gpu:
return list(map(lambda _: round(_, decimals), y_pred.cpu().numpy().tolist()))
else:
return list(map(lambda _:round(_,decimals),y_pred.numpy().tolist())) # cat 拼接 0 x水平拼接,1y垂直拼接
result:th.Tensor = th.cat((y_pred,y_pred_),dim=0) del y_pred,y_pred_ if self._is_gpu:
return list(map(lambda _: round(_, decimals), result.cpu().numpy().tolist())) return list(map(lambda _:round(_,decimals),result.numpy().tolist())) if __name__=="__main__":
ls = np.arange(91,100,2)
print(type(ls))
# ls = list(range(91, 100, 2))
gm = GM()
gm.fit(ls)
print(gm.confidence())
print(ls)
print(gm.predict(m=2))

  

python 实现 灰色预测 GM(1,1)模型 灰色系统 预测 灰色预测公式推导的更多相关文章

  1. 用python做时间序列预测九:ARIMA模型简介

    本篇介绍时间序列预测常用的ARIMA模型,通过了解本篇内容,将可以使用ARIMA预测一个时间序列. 什么是ARIMA? ARIMA是'Auto Regressive Integrated Moving ...

  2. ARIMA模型实例讲解——网络流量预测可以使用啊

    ARIMA模型实例讲解:时间序列预测需要多少历史数据? from:https://www.leiphone.com/news/201704/6zgOPEjmlvMpfvaB.html   雷锋网按:本 ...

  3. 人脸检测及识别python实现系列(3)——为模型训练准备人脸数据

    人脸检测及识别python实现系列(3)——为模型训练准备人脸数据 机器学习最本质的地方就是基于海量数据统计的学习,说白了,机器学习其实就是在模拟人类儿童的学习行为.举一个简单的例子,成年人并没有主动 ...

  4. 评分模型的检验方法和标准通常有:K-S指标、交换曲线、AR值、Gini数等。例如,K-S指标是用来衡量验证结果是否优于期望值,具体标准为:如果K-S大于40%,模型具有较好的预测功能,发展的模型具有成功的应用价值。K-S值越大,表示评分模型能够将“好客户”、“坏客户”区分开来的程度越大。

    评分模型的检验方法和标准通常有:K-S指标.交换曲线.AR值.Gini数等.例如,K-S指标是用来衡量验证结果是否优于期望值,具体标准为:如果K-S大于40%,模型具有较好的预测功能,发展的模型具有成 ...

  5. python 之路,Day27 - 主机管理+堡垒机系统开发

    python 之路,Day27 - 主机管理+堡垒机系统开发   本节内容 需求讨论 构架设计 表结构设计 程序开发 1.需求讨论 实现对用户的权限管理,能访问哪些机器,在被访问的机器上有哪些权限 实 ...

  6. 性能测试 基于Python结合InfluxDB及Grafana图表实时监控Android系统和应用进程

    基于Python结合InfluxDB及Grafana图表实时监控Android系统和应用进程   By: 授客 QQ:1033553122     1. 测试环境 2. 实现功能 3. 使用前提 4. ...

  7. Python 小案例实战 —— 简易银行存取款查询系统

    Python 小案例实战 -- 简易银行存取款查询系统 涉及知识点 包的调用 字典.列表的混合运用 列表元素索引.追加 基本的循环与分支结构 源码 import sys import time ban ...

  8. 数学建模-灰色预测模型GM(1,1)_MATLAB

    GM(1,1).m %建立符号变量a(发展系数)和b(灰作用量) syms a b; c = [a b]'; %原始数列 A A = [174, 179, 183, 189, 207, 234, 22 ...

  9. python进行机器学习(五)之模型打分

    一.画出模型的残差值分布情况 #!/usr/bin/python import pandas as pd import numpy as np import csv as csv import mat ...

随机推荐

  1. shell通配符

    wildcard 通配服   匹配.c文件 *.sh----常看当前目录下sh文件 *.c----常看当前目录下c文件 []---表示中括号 e.g [0,1,2,3,4]----能匹配0,1,2,3 ...

  2. 编程中易犯错误汇总:一个综合案例.md

    # 11编程中易犯错误汇总:一个综合案例 在上一篇文章中,我们学习了如何区分好的代码与坏的代码,如何写好代码.所谓光说不练假把式,在这篇文章中,我们就做一件事——一起来写代码.首先,我会先列出问题,然 ...

  3. [Algorithm] Finding Prime numbers - Sieve of Eratosthenes

    Given a number N, the output should be the all the prime numbers which is less than N. The solution ...

  4. 5天noip训练心得

    day1 100+95+0=195 T1 二分答案,并查集,很像noip2017 day2 T1 T2 缩环,然后数据结构维护求答案,貌似也是原题 T3 树形dp,比赛上没有做出来, day2 90+ ...

  5. [Docker]docker搭建私有仓库(ssl、身份认证)

    docker搭建私有仓库(ssl.身份认证) 环境:CentOS 7.Docker 1.13.1 CentOS 7相关: https://www.cnblogs.com/ttkl/p/11041124 ...

  6. 《剑指offer》算法题第九天

    今日题目: 整数中1出现的次数 把数组排成最小的数 丑数 第一个只出现一次的字符位置 今天的题目相对比较难,特别是第1题和第3题很考验数学功底,下面我们一题一题来看看. 1.整数中1出现的次数 题目描 ...

  7. luogu 5561 [Celeste-B]Mirror Magic 后缀数组+RMQ+multiset

    思路肯定是没有问题,但是不知道为啥一直 TLE 两个点~ #include <bits/stdc++.h> #define N 2000006 #define setIO(s) freop ...

  8. fflush函数

    /*** flush.c ***/ #include<stdio.h> #include<string.h> #include<stdlib.h> int main ...

  9. Linux Shell脚本,删除旧文件,保留最新的几个文件

    删除某一目录下文件,只保留最新的几个 #!/bin/bash #保留文件数 ReservedNum= FileDir=/home/dev/saas_test/testcases/report/html ...

  10. Hive使用与安装步骤

    1.Hive安装与配置 Hive官网:https://hive.apache.org/ 1. 安装文件下载 从Apache官网下载安装文件 http://mirror.bit.edu.cn/apach ...