灰色系统预测GM(1,1)模型

原创 2017年01月12日 17:18:50

预备知识
(1)灰色系统
白色系统是指系统内部特征是完全已知的;黑色系统是指系统内部信息完全未知的;而灰色系统是介于白色系统和黑色系统之间的一种系统,灰色系统其内部一部分信息已知,另一部分信息未知或不确定。
(2)灰色预测
灰色预测,是指对系统行为特征值的发展变化进行的预测,对既含有已知信息又含有不确定信息的系统进行的预测,也就是对在一定范围内变化的、与时间序列有关的灰过程进行预测。尽管灰过程中所显示的现象是随机的、杂乱无章的,但毕竟是有序的、有界的,因此得到的数据集合具备潜在的规律。灰色预测是利用这种规律建立灰色模型对灰色系统进行预测。
目前使用最广泛的灰色预测模型就是关于数列预测的一个变量、一阶微分的GM(1,1)模型。它是基于随机的原始时间序列,经按时间累加后所形成的新的时间序列呈现的规律可用一阶线性微分方程的解来逼近。经证明,经一阶线性微分方程的解逼近所揭示的原始时间序列呈指数变化规律。因此,当原始时间序列隐含着指数变化规律时,灰色模型GM(1,1)的预测是非常成功的。
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

Python代码如下:

# -*- coding: utf-8 -*-
"""
Created on Mon Aug 29 19:23:24 2016

@author: DaiPW
"""

import numpy as np
from pandas import Series
from pandas import DataFrame
import pandas as pd
import matplotlib.pyplot as plt


def Identification_Algorithm(x):    #辨识算法
    B = np.array([[1]*2]*5)
    tmp = np.cumsum(x)
    for i in range(len(x)-1):
        B[i][0] = ( tmp[i] + tmp[i+1] ) * (-1.0) / 2
    Y = np.transpose(x[1:])
    BT = np.transpose(B)
    a = np.linalg.inv(np.dot(BT,B))
    a = np.dot(a,BT)
    a = np.dot(a,Y)
    a = np.transpose(a)
    return a;

def GM_Model(X0,a,tmp):          #GM(1,1)模型
    A = np.ones(len(X0))
    for i in range(len(A)):
        A[i] = a[1]/a[0] + (X0[0]-a[1]/a[0])*np.exp(a[0]*(tmp[i]-1)*(-1))
    print ('GM(1,1)模型为:\nX(k) = ',X0[0]-a[1]/a[0],'exp(',-a[0],'(k-1))',a[1]/a[0])
    XK = Series(A,index=pd.period_range('2000','2005',freq = 'A-DEC'))   
    print ('GM(1,1)模型计算值为:')
    print (XK)
    return XK;

def Return(XK):                 #预测值还原
    tmp = np.ones(len(XK)) 
    for i in range(len(XK)):
        if i == 0:
            tmp[i] = XK[i]
        else:
            tmp[i] = XK[i] - XK[i-1]
    X_Return = Series(tmp,index=pd.period_range('2000','2005',freq = 'A-DEC'))
    print ('还原值为:\n')
    print (X_Return)
    return X_Return

if __name__ == '__main__':
    #初始化原始数据
    date = pd.period_range('2000','2005',freq = 'A-DEC')
    tmp = np.array([1,2,3,4,5,6])
    data = np.array([132,92,118,130,187,207])
    X0 = Series(data,index = date)
    X0_copy = Series(data,index=tmp)
    print ('原始数据为:\n')
    print(X0)

    #对原始数据惊醒一次累加
    X1 = np.cumsum(X0)
    print ('原始数据累加为:')
    print(X1)

    #辨识算法
    a = Identification_Algorithm(data)
    print ('a矩阵为:')
    print (a)

    #GM(1,1)模型
    XK = GM_Model(X0,a,tmp)

    #预测值还原
    X_Return = Return(XK)

    #预测值即预测值精度表
    X_Compare1 = np.ones(len(X0))
    X_Compare2 = np.ones(len(X0))
    for i in range(len(data)):
        X_Compare1[i] = data[i]-X_Return[i]
        X_Compare2[i] = X_Compare1[i]/data[i]*100
    Compare = {'GM':XK,'1—AGO':np.cumsum(data),'Returnvalue':X_Return,'Realityvalue':data,'Error':X_Compare1,'RelativeError(%)':X_Compare2}
    X_Compare = DataFrame(Compare,index=date)
    print ('预测值即预测值精度表')
    print (X_Compare)

    #模型检验
    error_square = np.dot(X_Compare,np.transpose(X_Compare))    #残差平方和
    error_avg = np.mean(error_square)                           #平均相对误差

    S = 0                                                       #X0的关联度
    for i in range(1,len(X0)-1,1):
        S += X0[i]-X0[0]+(XK[-1]-XK[0])/2
    S = np.abs(S)

    SK = 0                                                      #XK的关联度
    for i in range(1,len(XK)-1,1):
        SK += XK[i]-XK[0]+(XK[-1]-XK[0])/2
    SK = np.abs(SK)

    S_Sub = 0                                                   #|S-SK|b
    for i in range(1,len(XK)-1,1):
        S_Sub += X0[i]-X0[0]-(XK[i]-XK[0])+((X0[-1]-X0[0])-(XK[i]-XK[0]))/2
    S_Sub = np.abs(S_Sub)

    T = (1+S+SK)/(1+S+SK+S_Sub)

    if T >= 0.9:
        print ('精度为一级')
        print ('可以用GM(1,1)模型\nX(k) = ',X0[0]-a[1]/a[0],'exp(',-a[0],'(k-1))',a[1]/a[0])
    elif T >= 0.8:
        print ('精度为二级')
        print ('可以用GM(1,1)模型\nX(k) = ',X0[0]-a[1]/a[0],'exp(',-a[0],'(k-1))',a[1]/a[0])
    elif T >= 0.7:
        print ('精度为三级')
        print ('谨慎用GM(1,1)模型\nX(k) = ',X0[0]-a[1]/a[0],'exp(',-a[0],'(k-1))',a[1]/a[0])
    elif T >= 0.6:
        print ('精度为四级')
        print ('尽可能不用GM(1,1)模型\nX(k) = ',X0[0]-a[1]/a[0],'exp(',-a[0],'(k-1))',a[1]/a[0])


    X2006 = Series(np.array([259.4489]),index=pd.period_range('2006','2006',freq = 'A-DEC'))
    X_Return = X_Return.append(X2006)
    print (X_Return)

    B = pd.DataFrame([X0,X_Return],index=['X0','X_Return'])
    B = np.transpose(B)
    B.plot()

程序运行截图如下:
这里写图片描述
这里写图片描述
实际样本曲线与灰色系统系统预测的曲线如下:
这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。若需转载,请注明http://blog.csdn.net/qq_30091945 举报

相关文章推荐

灰色理论预测模型

灰色理论 通过对原始数据的处理挖掘系统变动规律,建立相应微分方程,从而预测事物未来发展状况。 优点:对于不确定因素的复杂系统预测效果较好,且所需样本数据较小; 缺点:基于指数率的预测没有考虑系...
  • zc0325
  • zc0325
  • 2016-04-30 22:19
  • 4992

【数学建模】灰色预测GM(1,1)代码

灰色预测中的GM(1,1)模型及其代码

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

灰色系统模型GM(1,1)的R语言实现

1、建模 ##建立灰色模型GM(1,1)对应的函数 ##x表示原始数据数列,k表示数据个数 gm11 { n x1 for(i in 1:n)   ##一次累加 { x1[i] }...

时间序列之灰色预测

灰色预测是针对灰色系统所做的预测。控制论中,信息的多少常以颜色的深浅来表示,信息充足、确定为白色;信息缺乏、不确定为黑色;部分确定部分不确定为灰色。灰色系统指信息不完全的系统,信息的不完全可能是系统因...

异步赠书:Kotlin领衔10本新书(活动已结束)

敲重点:        活动规则:试读样章,评论区留言说一下你对本书的一些感想,同时关注异步社区博客,并留言你想要得到的图书。        活动时间:即日起-9月14日(活动奖项公告在9月15日日)...

灰色预测的MATLAB程序

灰色预测适用于小样本的预测,常用来解决一些不确定性的问题。         理论知识书上都有介绍,下面仅列出程序设计,同时方便自己比赛。         MATLAB是实现灰色预测过程的首选,用MAT...

时间序列(一)

Python代码如下:# -*- coding: utf-8 -*- """ Created on Fri Jan 13 11:20:10 2017@author: DaiPuWei """''' ...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)