关键词:灰色预测、Python、pandas、numpy

一、前言

本文的目的是用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) 利用模型进行预测。

三、程序实现

1.引入需要的包

import pandas as pd

import numpy as np

%matplotlib inline

import matplotlib.pyplot as plt

import matplotlib

matplotlib.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体

matplotlib.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题

下面的matplotlib是作图用的,如果不做图可以不用引入

2.构建大致框架

灰色建模的主体应该分为几步:

(1)引入、整理数据

(2)校验数据是否合格

(3)GM(1,1)建模

(4)将最新的预测数据当做真实值继续预测

(5)输出结果

因此打好的框架如下:

class GrayForecast():

#初始化

def __init__(self, data, datacolumn=None):

pass

#级比校验

def level_check(self):

pass

#GM(1,1)建模

def GM_11_build_model(self, forecast=5):

pass

#预测

def forecast(self, time=5, forecast_data_len=5):

pass

#打印日志

def log(self):

pass

#重置

def reset(self):

pass

#作图

def plot(self):

pass

3.__init__

作为初始化的方法,我们希望它能将数据格式化存储,并且可使用的类型越多越好,在这里我先实现能处理三种类型:一维列表、DataFrame、Series。如果处理DataFrame可能会出现不止一维的情况,于是设定一个参数datacolumn,用于处理传入DataFrame不止一列数据到底用哪个的问题

def __init__(self, data, datacolumn=None):

if isinstance(data, pd.core.frame.DataFrame):

self.data=data

try:

self.data.columns = ['数据']

except:

if not datacolumn:

raise Exception('您传入的dataframe不止一列')

else:

self.data = pd.DataFrame(data[datacolumn])

self.data.columns=['数据']

elif isinstance(data, pd.core.series.Series):

self.data = pd.DataFrame(data, columns=['数据'])

else:

self.data = pd.DataFrame(data, columns=['数据'])

self.forecast_list = self.data.copy()

if datacolumn:

self.datacolumn = datacolumn

else:

self.datacolumn = None

#save arg:

# data DataFrame 数据

# forecast_list DataFrame 预测序列

# datacolumn string 数据的含义

4.level_check

按照级比校验的步骤进行,最终返回是否成功的bool类型值

def level_check(self):

# 数据级比校验

n = len(self.data)

lambda_k = np.zeros(n-1)

for i in range(n-1):

lambda_k[i] = self.data.ix[i]["数据"]/self.data.ix[i+1]["数据"]

if lambda_k[i] < np.exp(-2/(n+1)) or lambda_k[i] > np.exp(2/(n+2)):

flag = False

else:

flag = True

self.lambda_k = lambda_k

if not flag:

print("级比校验失败,请对X(0)做平移变换")

return False

else:

print("级比校验成功,请继续")

return True

#save arg:

# lambda_k 1-d list

5.GM_11_build_model

按照GM(1,1)的步骤进行一次预测并增长预测序列(forecast_list)

传入的参数forecast为使用forecast_list末尾数据的数量,因为灰色预测为短期预测,过多的数据反而会导致数据精准度变差

def GM_11_build_model(self, forecast=5):

if forecast > len(self.data):

raise Exception('您的数据行不够')

X_0 = np.array(self.forecast_list['数据'].tail(forecast))

# 1-AGO

X_1 = np.zeros(X_0.shape)

for i in range(X_0.shape[0]):

X_1[i] = np.sum(X_0[0:i+1])

# 紧邻均值生成序列

Z_1 = np.zeros(X_1.shape[0]-1)

for i in range(1, X_1.shape[0]):

Z_1[i-1] = -0.5*(X_1[i]+X_1[i-1])

B = np.append(np.array(np.mat(Z_1).T), np.ones(Z_1.shape).reshape((Z_1.shape[0], 1)), axis=1)

Yn = X_0[1:].reshape((X_0[1:].shape[0], 1))

B = np.mat(B)

Yn = np.mat(Yn)

a_ = (B.T*B)**-1 * B.T * Yn

a, b = np.array(a_.T)[0]

X_ = np.zeros(X_0.shape[0])

def f(k):

return (X_0[0]-b/a)*(1-np.exp(a))*np.exp(-a*(k))

self.forecast_list.loc[len(self.forecast_list)] = f(X_.shape[0])

6.forecast

预测函数只要调用GM_11_build_model就可以,传入的参数time为向后预测的次数,forecast_data_len为每次预测所用末尾数据的条目数

def forecast(self, time=5, forecast_data_len=5):

for i in range(time):

self.GM_11_build_model(forecast=forecast_data_len)

7.log

打印当前预测序列

def log(self):

res = self.forecast_list.copy()

if self.datacolumn:

res.columns = [self.datacolumn]

return res

8.reset

初始化序列

def reset(self):

self.forecast_list = self.data.copy()

9.plot

作图

def plot(self):

self.forecast_list.plot()

if self.datacolumn:

plt.ylabel(self.datacolumn)

plt.legend([self.datacolumn])

四、使用

首先读入数据,最近11年的电影票房(电影票房.csv):

年份,票房

2007,33.27

2008,43.41

2009,62.06

2010,101.72

2011,131.15

2012,170.73

2013,217.69

2014,296.39

2015,440.69

2016,457.12

2017,559.11

f = open("电影票房.csv", encoding="utf8")

df = pd.read_csv(f)

df.tail()

11条数据

构建灰色预测对象,进行10年预测输出结果并作图

gf = GrayForecast(df, '票房')

gf.forecast(10)

gf.log()

原来的11条数据+10条预测结果

gf.plot()

全体数据作图

五、总结

我们看数据的后面几条,高达数千万,或许10年前我们也想不到现在的电影票房是曾经原来的20倍。

这么快的增长已经接近指数增长了,然而它很可能就像人口一样,它并非是指数增长,而是没有达到增速减少的阈值罢了,用灰色预测很难看到如此长远的情况,或许可以将数据改为用sigmoid函数拟合,或许能达到更加准确的结果。

sigmoid函数

python灰色预测_【数学建模】灰色预测及Python实现相关推荐

  1. 图书销量时间序列预测_数学建模_Prophet实现

    图书销量时间序列预测_数学建模_Prophet实现 前言 主要参考 代码 库导入与函数设置 导库 展示函数 取数据函数 训练函数 评估函数 数据预处理 数据集划分 数据分布查看 销售曲线查看 销售预测 ...

  2. python 广义线性模型_数学建模/机器学习:广义加性模型(GAM)及其Python实现

    笔者做过国赛也做过美赛,其中一类典型问题就是分析相关性,从而进行预测或者其他操作.这类问题通常情况下属于比较常规的问题,一般通过matlab或SPSS分析相关性,得到一个较好的数值即可. 然而有的时候 ...

  3. python秒表游戏_数学游戏Tkinter中的Python计时器

    匿名用户 我想你需要的是这个.from Tkinter import * import time class StopWatch(Frame): """ Implemen ...

  4. 数学建模——灰色预测模型Python代码

    数学建模--灰色预测模型Python代码 """ Spyder Editor This is a temporary script file. ""& ...

  5. 数学建模——层次分析法Python代码

    数学建模--层次分析法Python代码 import numpy as np class AHP: """ 相关信息的传入和准备 """ d ...

  6. 数学建模——TOPSIS综合评价模型Python代码

    数学建模--TOPSIS综合评价模型Python代码 正常代码 import numpy as np # 导入numpy包并将其命名为np ##定义正向化的函数 def positivization( ...

  7. Python灰帽子_黑客与逆向工程师的Python编程之道

    收藏自用 链接:Python灰帽子_黑客与逆向工程师的Python编程之道

  8. 数学建模:预测性模型学习——灰色预测模型(GM(1,1)模型)

    目录 前言 一.模型实现 1.流程介绍 2.灰色生成 1.累加生成算子 2.均值生成算子 3.可行性分析(级比检验) 4.建立GM(1,1)模型 1.数据预处理: 2.建立模型: 3.构造数据矩阵B及 ...

  9. 灰色关联度分析_数学建模|关联分析之术|灰度预测模型预备知识

    关联分析 作者:PureFFFmennory 联系方式:ProdigyYanng@gmail.com 1. 目的 现实客观事物的每个现象非常复杂,影响因素繁多.对某一个系统而言,需要对该系统进行因素分 ...

  10. 数学建模-灰色预测模型(预测模型)

            灰色预测是指利用GM模型对系统行为特征的发展变化规律进行估计预测,同时也可以对行为特征的异常情况发生的时刻进行估计计算,以及对在特定时区内发生事件的未来时间分布情况做出研究等等.这些工 ...

最新文章

  1. [hiho1159] Poker
  2. 程序员过关斩将--你的面向接口编程一定对吗?
  3. 【C#程序设计】教学讲义——第三章:C#语言基础
  4. Linux:驱动程序直接编译到内核(源自国嵌的视频教学)
  5. 神经网络算法-论证单层感知器的局限性
  6. javascript 功能受限、原因和解决办法(一则)
  7. Docker资源汇总
  8. linux C(hello world)三个数最大和三个数最新
  9. 淘宝买卖交流爆笑全集
  10. c语言case用法注意,switch-case基本用法与注意事项
  11. 将心比心,我要有点骨气
  12. 机器学习--Iris数据集的Fisher线性分类以及数据可视化技术的学习
  13. FC6下chm文件阅读器chmsee的安装
  14. 抖音自媒体平台上最容易上热门的7大领域,你知道吗?
  15. objectArx ---基础操作
  16. 数学建模——规划问题
  17. 计算机基础知识结束语,计算机应用基础的教学论文
  18. 给我的电脑右键菜单添加{管理}菜单...
  19. 【Kubernetes系列】Pod
  20. 冒险岛2服务器位置,跨区冒险

热门文章

  1. DS18B20温度传感器arduino程序
  2. php getcwd文件件,PHP目录函数 getcwd (取得当前工作目录)
  3. 用Python从.srt或.vtt等格式的字幕文件中提取纯文字
  4. 机器学习03:人工神经网络
  5. 对英雄联盟比赛预测(三)- 数据获取Java实现
  6. 你知道各调的特点吗?
  7. select 多选下拉框获取值
  8. 海康威视监控下载下来的mp4格式的视频,小类别MPEG-PS格式
  9. .shtml网站解析UnicodeError
  10. oracle 给表空间增加多个数据文件