精华内容
下载资源
问答
  • 数学建模——灰色预测模型Python代码 “”" Spyder Editor This is a temporary script file. “”" import numpy as np import math history_data = [724.57,746.62,778.27,800.8,827.75,871.1,912.37,954.28,995....

    请添加图片描述

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

    “”"
    Spyder Editor

    This is a temporary script file.
    “”"
    import numpy as np
    import math

    history_data = [724.57,746.62,778.27,800.8,827.75,871.1,912.37,954.28,995.01,1037.2]
    n = len(history_data)
    X0 = np.array(history_data)

    #累加生成
    history_data_agg = [sum(history_data[0:i+1]) for i in range(n)]
    X1 = np.array(history_data_agg)

    #计算数据矩阵B和数据向量Y
    B = np.zeros([n-1,2])
    Y = np.zeros([n-1,1])
    for i in range(0,n-1):
    B[i][0] = -0.5*(X1[i] + X1[i+1])
    B[i][1] = 1
    Y[i][0] = X0[i+1]

    #计算GM(1,1)微分方程的参数a和u
    #A = np.zeros([2,1])
    A = np.linalg.inv(B.T.dot(B)).dot(B.T).dot(Y)
    a = A[0][0]
    u = A[1][0]

    #建立灰色预测模型
    XX0 = np.zeros(n)
    XX0[0] = X0[0]
    for i in range(1,n):
    XX0[i] = (X0[0] - u/a)*(1-math.exp(a))math.exp(-a(i));

    #模型精度的后验差检验
    e = 0 #求残差平均值
    for i in range(0,n):
    e += (X0[i] - XX0[i])
    e /= n

    #求历史数据平均值
    aver = 0;
    for i in range(0,n):
    aver += X0[i]
    aver /= n

    #求历史数据方差
    s12 = 0;
    for i in range(0,n):
    s12 += (X0[i]-aver)**2;
    s12 /= n

    #求残差方差
    s22 = 0;
    for i in range(0,n):
    s22 += ((X0[i] - XX0[i]) - e)**2;
    s22 /= n

    #求后验差比值
    C = s22 / s12

    #求小误差概率
    cout = 0
    for i in range(0,n):
    if abs((X0[i] - XX0[i]) - e) < 0.6754*math.sqrt(s12):
    cout = cout+1
    else:
    cout = cout
    P = cout / n

    if (C < 0.35 and P > 0.95):
    #预测精度为一级
    m = 10 #请输入需要预测的年数
    #print(‘往后m各年负荷为:’)
    f = np.zeros(m)
    for i in range(0,m):
    f[i] = (X0[0] - u/a)*(1-math.exp(a))math.exp(-a(i+n))
    else:
    print(‘灰色预测法不适用’)

    请添加图片描述

    展开全文
  • 灰色预测模型Python代码.txt
  • 灰色预测模型代码

    2017-11-17 15:45:28
    灰色预测模型GM(1,n)模型的matlab源代码,包括预测模型的建立,以及模型的精度检验指标c,p的计算。
  • 灰色预测python程序.py

    2020-06-09 17:28:57
    灰色预测模型适合小样本时间序列预测。
  • 可解决灰色预测问题,里面为python代码+测试数据
  • 【数学建模】灰色预测Python实现

    万次阅读 多人点赞 2019-03-14 15:52:49
    关键词:灰色预测、Python、pandas、numpy 一、前言 ...用等时距观测到的反映预测对象特征的一系列数量(如产量、销量、人口数量、存款数量、利率等)构造灰色预测模型,预测未来某一时刻的特...

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

    一、前言

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

    二、原理简述

    1.灰色预测概述

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

     

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

      GM(1,1)模型适合具有较强的指数规律的数列,只能描述单调的变化过程。已知元素序列数据:x^{(0)}=(X^{(0)}(1),X^{(0)}(2),...,X^{(0)}(n))

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

    x^{(1)}=(X^{(1)}(1),X^{(1)}(2),...,X^{(1)}(n))
    其中

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

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

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

    其中,

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

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

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

    其中,a为发展系数,b为灰色作用量。设\hat{a}为待估参数向量,即\hat{a}=(a,b)^T,则灰微分方程的最小二乘估计参数列满足\hat{a}=(B^TB)^{-1}B^TY_n

    其中

    B=\left[ \begin{matrix} -z^{(1)}(2) , 1 \\ -z^{(1)}(3) , 1 \\ ... , ... \\ -z^{(1)}(n) , 1 \end{matrix}\right], Y_n=\left[ \begin{matrix} x^{(0)}(2)\\ x^{(0)}(3) \\ ... , \\ x^{(0)}(n) \end{matrix}\right]
    再建立灰色微分方程的白化方程(也叫影子方程):

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

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

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

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

    \hat{x}^{(1)}(k+1) = [x^{(1)}(0)-\frac{b}{a}]e^{-at}+\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},\quad k=1,....n-1

    再做累减还原可得

    \hat{x}^{(0)}(k+1)=\hat{x}^{(1)}(k+1)-\hat{x}^{(1)}(k)=[x^{(0)}(1)-\frac{b}{a}](1-e^a)e^{-ak}, \quad k=1,...,n-1即为预测方程。

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

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

    3.算法步骤

    (1) 数据的级比检验
      为了保证灰色预测的可行性,需要对原始序列数据进行级比检验。
      对原始数据列X^{(0)}=(x^{(0)}(1),x^{(0)}(2),...,x^{(0)}(3))

    计算序列的级比:\lambda(k)=\frac{x^{0}(k-1)}{x^{(0)}(k)}, \quad k=2,...,n  

    若所有的级比\lambda(k)都落在可容覆盖\Theta=(e^{-2/(n+1)},e^{2/(n+2)})内,则可进行灰色预测;否则需要对X^{(0)}做平移变换,Y^{(0)}=X^{(0)}+c,使得Y^{(0)}满足级比要求。

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

    (3) 检验预测值:

    ① 相对残差检验,计算

    \varepsilon(k)=\frac{x^{(0)}(k-1)}{x^{(0)}(k)}, \quad k=2,...,n  

    \varepsilon(k)<0.2 ,则认为达到一般要求,若\varepsilon(k)<0.1 ,则认为达到较高要求;

    ② 级比偏差值检验

      根据前面计算出来的级比\lambda(k), 和发展系数a, 计算相应的级比偏差:

    \rho(k)=1-(\frac{1-0.5a}{1+0.5a})]\lambda(k)  

    \rho(k)<0.2, 则认为达到一般要求,若\rho(k)<0.1, 则认为达到较高要求。

    (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年的电影票房

    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函数



    作者:crossous
    链接:https://www.jianshu.com/p/a35ba96d852b
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

    https://blog.csdn.net/qq547276542/article/details/77865341/

    展开全文
  • 灰色预测模型GM(1,1)的全面讲解及python实现

    万次阅读 多人点赞 2020-05-27 10:21:03
    1. 灰色预测的概念 (1)灰色系统、白色系统和黑色系统 白色系统是指一个系统的内部特征是完全已知的,既系统信息是完全充分的。 黑色系统是一个系统的内部信息对外界来说是一无所知的,只能通过它与外界的联系来...

    1. 灰色预测的概念

    (1)灰色系统、白色系统和黑色系统

    白色系统是指一个系统的内部特征是完全已知的,既系统信息是完全充分的。

    黑色系统是一个系统的内部信息对外界来说是一无所知的,只能通过它与外界的联系来加以观测研究。

    灰色系统介于白色和黑色之间,灰色系统内的一部分信息是已知的,另一部分信息是未知的,系统内各因素间有不确定的关系。

    (2)灰色预测法

    所以灰色预测就是通过这样的信息前提下做的一种预测分析,即灰色预测法是一种预测灰色系统的预测方法。

    灰色预测通过鉴别系统因素之间发展趋势的相异程度,即进行关联分析,并对原始数据进行生成处理来寻找系统变动的规律,生成有较强规律性的数据序列,然后建立相应的微分方程模型,从而预测事物未来发展趋势的状况,最后得到其发展的模型。

    一般表达方式为GM(n,x)模型,其含义是:用n阶微分方程对x个变量建立模型

    关联分析实际上是动态过程发展态势的量化比较分析。所谓发展态势比较,也就是系统各时期有关统计数据的集合关系的比较。例如,某地区1977~1983年总收入与养猪、养兔收入资料见下表格。

    2. 灰色生成数列

    灰色系统理论认为,尽管客观表象复杂,但总是有整体功能的,因此必然蕴含某种内在规律。关键在于如何选择适当的方式去挖掘和利用它。灰色系统是通过对原始数据的整理来寻求其变化规律的,这是一种就数据寻求数据的现实规律的途径,也就是灰色序列的生产。一切灰色序列都能通过某种生成弱化其随机性,显现其规律性。数据生成的常用方式有累加生成、累减生成和加权累加生成,将灰色系统中的未知因素弱化,强化已知因素的影响程度,最后构建一个以时间为变量的连续微分方程,通过数学方法确定方程中的参数,从而实现预测目的。

    (1)累加生成(AGO)

    设原始序列为 ,令 

    为数列 的1次累加生成数列。类似的有:

    称为 的r次累加生成数列

    (2)累减生成(IAGO)

    如果原始数列为 ,令 ,称x1 的1次累减生成数列。

    (3)加权邻值生成:

    如果原始数列为 ,称任意一对相邻元素 互为邻值。对于常数 ,令

    由此得到的数列称为邻值生成数,权α 也称为生成系数。特别地,当α=0.5 时,则称该数列为均值生成数,也称为等权邻值生成数。

    3. 灰色模型GM(1,1)

    灰色系统理论是基于关联空间、光滑离散函数等概念定义灰导数与灰微分方程,进而用离散数据列建立微分方程形式的动态模型,即灰色模型是利用离散随机数经过生成变为随机性被显著削弱而且较有规律的生成数,建立起的微分方程形式的模型,这样便于对其变化过程进行研究和描述。

    G表示grey(灰色),M表示model(模型)

    定义 的灰导数为:

    为数列 的邻值生成数列,即

    于是定义GM(1,1,)的灰微分方程模型为: ,其中 称为灰导数, 称为发展系数, 称为白化背景值,b称为灰作用量。

    将时刻k=2,3,…,n代入上式有

    引入矩阵向量记号:

    于是GM(1,1模型可表示为Y=Bu

    那么现在的问题就是求a和b的值,我们可以用一元线性回归,也就是最小二乘法求它们的估计值:
    对于GM(1,1)的灰微分方程,如果将时刻k=2,3,…,n视为连续变量t,则之前的 视为时间t函数,于是灰导数 变为连续函数的导数 ,白化背景值 对应于导数 ,于是GM(1,1)的灰微分方程对应于的白微分方程为:

    4. GM(1,1)灰色预测的步骤

    (1)数据的检验与处理

    为了保证GM(1,1)建模方法的可行性,需要对已知数据做必要的检验处理。设原始数据列为 ,首先计算数列的级比:

    如果所有的级比都落在可容覆盖区间 内,则数列 可以建立GM(1,1)模型且可以进行灰色预测。否则,对数据做适当的变换处理,如平移变换: ,取c使得数据列的级比都落在可容覆盖内。

    (2)建立GM(1,1)模型

    不妨设 满足上面的要求,以它为数据列建立GM(1,1)模型 ,用回归分析求得a,b的估计值,于是相应的白化模型为: ,解为

    于是得到预测值:

    从而相应地得到预测值:

    5. 检验预测值

    (1)残差检验:计算相对残差: ,如果对所有的|ε(k)|<0.1,则认为到达较高的要求;否则,若对所有的|ε(k)|<0.2,则认为达到一般要求。

    (2)级比偏差值检验:计算: 。如果对所有的 ,则认为达到较高的要求;否则,对于所有的 ,则认为达到一般要求。

     

    6. 计算实例
     

    Python完整代码:

    import pandas as pd
    import numpy as np

    def step_ratio(x0):
        n =
    len(x0)
        ratio = [x0[i]/x0[i+
    1] for i in range(len(x0)-1)]
        
    print(f"级比:{ratio}")
        min_la, max_la =
    min(ratio), max(ratio)
        thred_la = [np.exp(-
    2/(n+2)), np.exp(2/(n+2))]
       
    if min_la < thred_la[0] or max_la > thred_la[-1]:
           
    print("级比超过灰色模型的范围")
       
    else:
           
    print("级比满足要求,可用GM(1,1)模型")
       
    return ratio, thred_la

    def predict(x0):
        n =
    len(x0)
        x1 = np.cumsum(x0)
        z = np.zeros(n-
    1)
       
    for i in range(n-1):
            z[i] =
    0.5*(x1[i]+x1[i+1])
        B = [-z, [
    1]*(n-1)]
        Y = x0[
    1:]
        u = np.dot(np.linalg.inv(np.dot(B, np.transpose(B))),np.dot(B, Y))
        x1_solve = np.zeros(n)
        x0_solve = np.zeros(n)
        x1_solve[
    0] = x0_solve[0] = x0[0]
       
    for i in range(1, n):
            x1_solve[i] = (x0[
    0]-u[1]/u[0])*np.exp(-u[0]*i)+u[1]/u[0]
       
    for i in range(1, n):
            x0_solve[i] = x1_solve[i] - x1_solve[i-
    1]
       
    return x0_solve, x1_solve, u

    def accuracy(x0, x0_solve, ratio, u):
        epsilon = x0 - x0_solve
        delta =
    abs(epsilon / x0)
       
    print(f"相对误差:{delta}")
       
    # Q = np.mean(delta)
        # C = np.std(epsilon)/np.std(x0)
       
    S1 = np.std(x0)
        S1_new = S1*
    0.6745
       
    temp_P = epsilon[abs(epsilon-np.mean(epsilon)) < S1_new]
        P =
    len(temp_P)/len(x0)
       
    print(f"预测准确率:{P*100}%")
        ratio_solve = [x0_solve[i]/x0_solve[i+
    1] for i in range(len(x0_solve)-1)]
        rho = [
    1-(1-0.5*u[0]/u[1])/(1+0.5*u[0]/u[1])*(ratio[i]/ratio_solve[i]) for i in range(len(ratio))]
       
    print(f"级比偏差:{rho}")
       
    return epsilon, delta, rho, P


    if __name__ == '__main__':
        data=pd.DataFrame(
    data={"year":[1986,1987, 1988, 1989, 1990, 1991, 1992], "eqL":[71.1, 72.4, 72.4, 72.1, 71.4, 72.0, 71.6]})
        x0 = np.array(data.iloc[:,
    1])
        ratio, thred_la = step_ratio(x0)
        x0_solve, x1_solve, u = predict(x0)
        epsilon, delta, rho, P = accuracy(x0, x0_solve, ratio, u)

     

    7. 优缺点:

    灰色系统预测模型的特点:无需大量数据样本,短期预测效果好,运算过程简单。

    灰色系统预测模型的不足:对非线性数据样本预测效果差。

    8. GM(1,n)模型

    GM(1,n)模型的预测原理与GM(1,1)类似,不同在于输入数据变量为N个。即
    ,其它特征数据序列分别为:

    ……

    这样,只需每个变量对应数据列建立GM(1,1)模型即可,即

     

    参考地址:https://blog.csdn.net/qq547276542/article/details/77865341

    展开全文
  • 基于python灰色预测模型

    千次阅读 2021-12-11 21:33:45
    利用python灰色系统进行预测适用于短期预测,对长期预测效果并不是很好。

    灰色系统

    我们称信息完全未确定的系统为黑色系统,称信息完全确定的系统为白色系统,灰色系统就是这介于这之间,一部分信息是已知的,另一部分信息是未知的,系统内各因素间有不确定的关系。

    特点

    • 用灰色数学处理不确定量,使之量化。
    • 充分利用已知信息寻求系统的运动规律。
    • 灰色系统理论能处理贫信息系统。

    直接上代码

    首先引入所需要的库

    import matplotlib.pyplot as plt
    import pandas as pd
    import numpy as np
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
    
    data = pd.read_excel("E:/桌面/灰色预测.xlsx",sheet_name=1)
    list1 = data["序列"]
    tlist1 = [2014,2015,2016,2017,2018]

    完整代码。

    编写函数GM11(x,n)

    fy = []
    def GM11(x,n):
        '''
        灰色预测
        x:序列,numpy对象
        n:需要往后预测的个数
        '''
        x1 = x.cumsum()#一次累加  
        z1 = (x1[:len(x1) - 1] + x1[1:])/2.0#紧邻均值  
        z1 = z1.reshape((len(z1),1))  
        B = np.append(-z1,np.ones_like(z1),axis=1)  
        Y = x[1:].reshape((len(x) - 1,1))
        #a为发展系数 b为灰色作用量
        [[a],[b]] = np.dot(np.dot(np.linalg.inv(np.dot(B.T, B)), B.T), Y)#计算待估参数  
        result = (x[0]-b/a)*np.exp(-a*(n-1))-(x[0]-b/a)*np.exp(-a*(n-2))  #预测方程
        S1_2 = x.var()#原序列方差
        e = list()#残差序列
        for index in range(1,x.shape[0]+1):
            predict = (x[0]-b/a)*np.exp(-a*(index-1))-(x[0]-b/a)*np.exp(-a*(index-2))
            e.append(x[index-1]-predict)
            print(predict)    #预测值
            fy.append(predict)
        print("后验差检验")
        S2_2 = np.array(e).var()#残差方差
        C = S2_2/S1_2#后验差比
        if C<=0.35:
            assess = '后验差比<=0.35,模型精度等级为好'
        elif C<=0.5:
            assess = '后验差比<=0.5,模型精度等级为合格'
        elif C<=0.65:
            assess = '后验差比<=0.65,模型精度等级为勉强'
        else:
            assess = '后验差比>0.65,模型精度等级为不合格'
        #预测数据
        predict = list()
        for index in range(x.shape[0]+1,x.shape[0]+n+1):
            predict.append((x[0]-b/a)*np.exp(-a*(index-1))-(x[0]-b/a)*np.exp(-a*(index-2)))
        predict = np.array(predict)
      
    
        return {
                'a':{'value':a,'desc':'发展灰数'},
                'b':{'value':b,'desc':'控制灰数'},
                'predict':{'value':result,'desc':'第%d个预测值'%n},
                'C':{'value':C,'desc':assess},
                'predict':{'value':predict,'desc':'往后预测%d个的序列'%(n)},
                }
        
     
        
    if __name__ == "__main__":
        data = np.array(list1)
        x = data[0:5]#输入数据
        #y = data[0:]#需要预测的数据
        result = GM11(x,1)
        predict = result['predict']['value']
        predict = np.round(predict,1)
        #print('真实值:',x)
        print('预测值:',predict)
        print(result)
    
    print("残差检验")
    a = []
    for i in range(5):
        a.append(abs(fy[i]-list1[i]))
        print('%.5f%%' % ((abs(fy[i]-list1[i]))/list1[i]))
    print("关联度检验")
    c= []
    for i in range(5):
        b = (min(a)+0.5*max(a))/(abs(a[i])+0.5*max(a))
        c.append(b)
    print("ρ = 0.5 关联度为:",np.mean(c))
    #print(y)
    print(predict)
    fy.append(3.8)

    检验

    后验差检验,关联度检验,残差检验。解释(上面代码已经包含)

     print("后验差检验")
        S2_2 = np.array(e).var()#残差方差
        C = S2_2/S1_2#后验差比
        if C<=0.35:
            assess = '后验差比<=0.35,模型精度等级为好'
        elif C<=0.5:
            assess = '后验差比<=0.5,模型精度等级为合格'
        elif C<=0.65:
            assess = '后验差比<=0.65,模型精度等级为勉强'
        else:
            assess = '后验差比>0.65,模型精度等级为不合格'

    后验差检验检验结果判定

     关联度与残差检验。

    print("残差检验")
    a = []
    for i in range(5):
        a.append(abs(fy[i]-list1[i]))
        print('%.5f%%' % ((abs(fy[i]-list1[i]))/list1[i]))
    print("关联度检验")
    c= []
    for i in range(5):
        b = (min(a)+0.5*max(a))/(abs(a[i])+0.5*max(a))
        c.append(b)
    print("ρ = 0.5 关联度为:",np.mean(c))

    关联度检验结果大于0.6即可。

    输出结果。

     对结果与源数据进行对比

    #作图
    import numpy as np
    import matplotlib.pyplot as plt
    x1 = np.array([2014,2015,2016,2017,2018])
    y1 = np.array(x)
    x2 = np.array([2014,2015,2016,2017,2018,2019])
    y2 = np.array(fy)
    
    plt.plot(x1,y1,'r*-',label='真实值曲线')   #真实值
    plt.plot(x2,y2,'b+-',label='预测值曲线')   #预测值
    plt.xlabel('年份')
    plt.ylabel('值')
    plt.legend()
    plt.plot()
    plt.show()

     利用python对灰色系统进行预测适用于短期预测,对长期预测效果并不是很好。若需要长期预测可使用ARIMA(p,d,q)模型。

    展开全文
  • 来源公式推导连接关键词:灰色预测 python 实现 灰色预测 GM(1,1)模型 灰色系统 预测 灰色预测公式...用等时距观测到的反映预测对象特征的一系列数量(如产量、销量、人口数量、存款数量、利率等)构造灰色预测模型...
  • 利用python实现灰色预测GM(1,1)

    千次阅读 2020-07-19 15:51:23
    GM(1,1)预测模型 GM(1,1)表示模型是一阶微分方程,且只含1个预测变量的灰色模型。造成一个一个结果的原因是多种多样的,他们占的权重我们有时也是无从只晓得的,但是再不出现意外的情况下,我们可以用结果去估计结果...
  • 现在我想做的事,对这个矩阵数列进行灰色预测![图片说明](https://img-ask.csdn.net/upload/202007/08/1594175232_278413.png)像这种,请问应该怎样input呢?才能让矩阵在这个文件中实现灰色预测
  • python 实现灰色预测模型GM(1,1)及新陈代谢GM(1,1)

    千次阅读 热门讨论 2021-01-06 15:42:14
    python 实现灰色预测模型GM(1,1)及新陈代谢GM(1,1) 新陈代谢GM(1,1)预测 新陈代谢GM(1,1)也叫做等维灰数递补动态GM(1,1)。灰色预测模型GM(1,1)的简介就不再多叙述,其优点及缺点在其他博文中均有所体现(可参考:...
  • 转载并整理自: ...灰色关联度分析 # -*- coding: utf-8 -*- from sklearn.preprocessing import StandardScaler import pandas as pd import numpy as np import os ... '''灰色关联度分析模型''' d
  • [TOC]程序简介利用灰色预测GM11模型预测股票收盘价,由于灰色预测模型适合短期预测和小样本,所以程序输入数据为5个,输出为1个,进行动态建模 程序输入:原序列、需要往后预测的个数 程序输出:预测值、模型结构(后...
  • 对于一个热衷于编程的人,看到这个想起了我实训做的预测模型,(但这个模型的代码是比较简单的,如果你学了numpy,pandas的基础,并了解一下numpy的矩阵运算即可),所以编程实现的必须的。import numpy as np ...
  • 人口预测模型灰色预测

    千次阅读 2020-12-06 13:39:19
    灰色理论概况社会、经济、农业、工业、生态、生物等许多系统,是根据研究对象所属的领域和范围命名的,而灰色系统却是按颜色命名的。用“黑’’表示信息未知,用“白”表示信息完全明确,用“灰"表示部分信息明确、...
  • 降水量的灰色马尔科夫预测模型,霍贝,,降水过程中既表现出灰色秉性,同时也有强烈的随机性。灰色GM(1,1)模型不适合长期的、随机和波动性较大的数据系列预测,但是马�
  • 版权所有 引用请注明出处function gmcal=gm1(x)%% 二次拟合预测GM(1,1)模型%x = [5999,5903,5848,5700,7884];sizexd2 = size(x,2);%求数组长度k=0;for y1=xk=k+1;if k&gt1x1(k)=x1(k-1)+x(k);%累加生成z1(k-1)=-...
  • GM(1,1)模型灰色预测模型 ( Gray Forecast Model )是通过少量的、不完全的信息,建立数学模型并做出预测的一种预测方法当我们应用运筹学的思想方法解决实际问题,制定发展战略和政策、进行重大问题的决策时,都...
  • 灰色预测模型代码matlab particle_Filter 这是python Intelligent Robotics Systems练习2:Particle Filter中的部分过滤器实现。 使用地标的移动机器人的蒙特卡洛定位考虑一个平面机器人,其三个DOF x =(x,y,θ)...
  • 分数阶灰色模型python实现

    千次阅读 2020-03-09 01:21:07
    分数阶灰色模型的原理及其python实现
  • GM(1,n)(灰色模型代码)

    2020-11-24 11:04:36
    %灰色预测模型GM(1,n)模型的matlab源代码,包括预测模型的建立,以及模型的精度检验指标c,p的计算%假设预测3步,N=3%如在命令窗口键入:%gm=ycgm1n([1.6,1.7,2,1.8,1.9],[2,2.4,3,3.2,3.1],[3,3.1,3.2,3.5,2.8],3...
  • 6.39, 7.81, 8.35]) predict_data = predict(data) # 预测x1 result = np.ediff1d(predict_data) # 递减 print('原数据:', data[1:]) print('预测结果:', result) print('相对误差:', (np.array(result[:len(data)]...
  • 灰色预测代码 # 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 ...
  • 非常好的灰色模型,让你更好的了解灰色模型,有matlab源代码
  • (2)灰色预测灰色预测,是指对系统行为特征值的发展变化进行的预测,对既含有已知信息又含有不确定信息的系统进行的预测,也就是对在一定范围内变化的、与时间序列有关的灰过程进行预测。尽管灰过程中所显示的现...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,557
精华内容 622
关键字:

灰色预测模型python代码

python 订阅