灰色系统理论及其应用系列博文:
一、灰色关联度分析法(GRA)_python
二、灰色预测模型GM(1,1)
三、灰色预测模型GM(1,n)
四、灰色预测算法改进1—背景值Z
五、灰色预测改进2—三角残差拟合

文章目录

  • 一、GM(1,n)算法
  • 二、示例
    • 2.1 数据:
    • 2.2 代码_使用GM(1,n)城市用水总量
    • 2.3 结果分析

一、GM(1,n)算法




二、示例

注:数据均来自论文《基于灰色系统理论的贵阳市城市用水总量预测》

2.1 数据:

data.csv
年份,城区人口,建成区面积,供水总量,用水人口,人口综合用水指标,城市用水总量
2002, 191.85, 98.00, 26396.00, 150.10, 175.86, 33737.99
2003, 195.96, 98.00, 25551.00, 150.10, 170.23, 33357.59
2004, 203.37, 98.00, 32661.00, 200.00, 163.31, 33211.34
2005, 206.31, 129.00, 24186.00, 203.00, 119.14, 24580.36
2006, 257.45, 132.00, 27194.00, 208.33, 130.53, 33605.80
2007, 217.27, 132.00, 24134.80, 178.88, 134.92, 29314.45
2008, 217.27, 132.00, 24427.20, 203.00, 120.33, 26144.32
2009, 217.27, 175.00, 23932.92, 207.30, 115.45, 25083.96
2010, 217.39, 162.00, 24397.00, 209.18, 116.63, 25354.55
2011, 251.00, 162.00, 25238.82, 224.26, 112.54, 28248.21
2012, 254.30, 211.34, 25886.62, 240.29, 107.73, 27395.93
2013, 265.36, 299.00, 28383.85, 250.58, 113.27, 30058.02
2014, 265.36, 299.00, 29873.56, 252.25, 118.43, 31426.16
2015, 266.01, 299.00, 30872.28, 255.92, 120.63, 32089.46
2016, 267.00, 299.00, 34038.31, 263.88, 128.99, 34440.76
2017, 285.00, 359.00, 34992.73, 281.80, 124.18, 35390.09
2018, 292.24, 369.00, 38352.66, 289.05, 132.69, 38775.93
2019, 296.72, 369.00, 40612.11, 295.83, 137.28, 40734.29

上面的数据中,最后一列城市用水总量为需要预测的数据列,其他列为相关因素列

2.2 代码_使用GM(1,n)城市用水总量

以 2002—2019 年各年间估算的城市用水总量,运用 GM(1,7) 模型分别得到原始数据序列的响应式。

# -*- coding: utf-8 -*-
# @Time : 2022/3/18 14:18
# @Author : Orange
# @File : g_pred.py.py# -*- coding: utf-8 -*-
# @Time : 2022/3/18 14:18
# @Author : Orange
# @File : g_pred.py.pyfrom decimal import *class GM11():def __init__(self):self.f = Nonedef isUsable(self, X0):'''判断是否通过光滑检验'''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_ratio)flag = Truefor i in range(2, len(rho) - 1):if rho[i] > 0.5 or rho[i + 1] / rho[i] >= 1:flag = Falseif rho[-1] > 0.5:flag = Falseif flag:print("数据通过光滑校验")else:print("该数据未通过光滑校验")'''判断是否通过级比检验'''lambds = [X0[i - 1] / X0[i] for i in range(1, len(X0))]X_min = np.e ** (-2 / (len(X0) + 1))X_max = np.e ** (2 / (len(X0) + 1))for lambd in lambds:if lambd < X_min or lambd > X_max:print('该数据未通过级比检验')returnprint('该数据通过级比检验')def train(self, X0):X1 = X0.cumsum(axis=0)  # [x_2^1,x_3^1,...,x_n^1,x_1^1] # 其中x_i^1为x_i^01次累加后的列向量Z = (np.array([-0.5 * (X1[:, -1][k - 1] + X1[:, -1][k]) for k in range(1, len(X1[:, -1]))])).reshape(len(X1[:, -1]) - 1, 1)# 数据矩阵A、BA = (X0[:, -1][1:]).reshape(len(Z), 1)B = np.hstack((Z, X1[1:, :-1]))# 求参数u = np.linalg.inv(np.matmul(B.T, B)).dot(B.T).dot(A)a = u[0][0]b = u[1:]print("灰参数a:", a, ",参数矩阵b:", b)self.f = lambda k, X1: (X0[0, -1] - (1 / a) * (X1[k, ::]).dot(b)) * np.exp(-a * k) + (1 / a) * (X1[k, ::]).dot(b)def predict(self, k, X0):''':param k: k为预测的第k个值:param X0: X0为【k*n】的矩阵,n为特征的个数,k为样本的个数:return:'''X1 = X0.cumsum(axis=0)X1_hat = [float(self.f(k, X1)) for k in range(k)]X0_hat = np.diff(X1_hat)X0_hat = np.hstack((X1_hat[0], X0_hat))return X0_hatdef evaluate(self, X0_hat, X0):'''根据后验差比及小误差概率判断预测结果:param X0_hat: 预测结果:return:'''S1 = np.std(X0, ddof=1)  # 原始数据样本标准差S2 = np.std(X0 - X0_hat, ddof=1)  # 残差数据样本标准差C = S2 / S1  # 后验差比Pe = np.mean(X0 - X0_hat)temp = np.abs((X0 - X0_hat - Pe)) < 0.6745 * S1p = np.count_nonzero(temp) / len(X0)  # 计算小误差概率print("原数据样本标准差:", S1)print("残差样本标准差:", S2)print("后验差:", C)print("小误差概率p:", p)if __name__ == '__main__':import matplotlib.pyplot as pltimport numpy as npimport pandas as pdplt.rcParams['font.sans-serif'] = ['SimHei']  # 步骤一(替换sans-serif字体)plt.rcParams['axes.unicode_minus'] = False  # 步骤二(解决坐标轴负数的负号显示问题)data = pd.read_csv("data.csv")# data.drop('供水总量', axis=1, inplace=True)# 原始数据XX = data.values# 训练集X_train = X[:, :]# 测试集X_test = []model = GM11()model.isUsable(X_train[:, -1])  # 判断模型可行性model.train(X_train)  # 训练Y_pred = model.predict(len(X), X[:, :-1])  # 预测Y_train_pred = Y_pred[:len(X_train)]Y_test_pred = Y_pred[len(X_train):]score_tRAIN = model.evaluate(Y_train_pred, X_train[:, -1])  # 评估# score_test = model.evaluate(Y_test_pred, X_test[:, -1])# 可视化plt.grid()plt.plot(np.arange(len(Y_train_pred)), X_train[:, -1], '->')plt.plot(np.arange(len(Y_train_pred)), Y_train_pred, '-o')plt.legend(['负荷实际值', '灰色预测模型预测值'])plt.title('训练集')plt.show()# # 可视化# plt.grid()# plt.plot(np.arange(len(Y_test_pred)), X_test[:, -1], '->')# plt.plot(np.arange(len(Y_test_pred)), Y_test_pred, '-o')# plt.legend(['负荷实际值', '灰色预测模型预测值'])# plt.title('测试集')# plt.show()

2.3 结果分析

以贵阳市 2002—2019 年各年间城市用水总量计算灰色预测模型,得到各关键参数如下:
1). 一阶累加X1:

2). 邻近均值生成序列Z:
z=[[ -50416.785], [ -83701.25 ], [-112597.1 ], [-141690.18 ], [-173150.305], [-200879.69 ], [-226493.83 ], [-251713.085], [-278514.465], [-306336.535], [-335063.51 ], [-365805.6 ], [-397563.41 ], [-430828.52 ], [-465743.945], [-502826.955], [-542582.065]]
3). 系数矩阵B

4.) 常量向量A
A=[[33357.59], [33211.34], [24580.36], [33605.8 ], [29314.45], [26144.32], [25083.96], [25354.55], [28248.21], [27395.93], [30058.02], [31426.16], [32089.46], [34440.76], [35390.09], [38775.93], [40734.29]]
5). 计算得灰参数矩阵u
u= [[ 2.10865303], [ -0.79661015], [ 268.27615473], [ 9.50904062], [ 2.04108088], [-289.38654309], [ 50.36476197]]
6). 计算得x1^(1)\hat{x_1}^{(1)}x1​^​(1)
x1^(1)=[33737.99,62136.41059571255,98714.77263514209,123994.65466594681,157570.90630726953,187108.145194742,213249.99530402914,238397.28249186202,263719.7944647677,291965.5572243266,319165.5173481615,349304.8797308811,380779.8949102532,412852.82970389083,447223.18020760675,482503.4498108375,521210.1028053897,561852.5575612668]\hat{x_1}^{(1)}=[33737.99, 62136.41059571255, 98714.77263514209, 123994.65466594681, 157570.90630726953, 187108.145194742, 213249.99530402914, 238397.28249186202, 263719.7944647677, 291965.5572243266, 319165.5173481615, 349304.8797308811, 380779.8949102532, 412852.82970389083, 447223.18020760675, 482503.4498108375, 521210.1028053897, 561852.5575612668]x1​^​(1)=[33737.99,62136.41059571255,98714.77263514209,123994.65466594681,157570.90630726953,187108.145194742,213249.99530402914,238397.28249186202,263719.7944647677,291965.5572243266,319165.5173481615,349304.8797308811,380779.8949102532,412852.82970389083,447223.18020760675,482503.4498108375,521210.1028053897,561852.5575612668]
7). 累减还原得x1^(0)\hat{x_1}^{(0)}x1​^​(0)
[33737.99 28398.42059571 36578.36203943 25279.8820308, 33576.25164132 29537.23888747 26141.85010929 25147.28718783, 25322.51197291 28245.76275956 27199.96012383 30139.36238272, 31475.01517937 32072.93479364 34370.35050372 35280.26960323, 38706.65299455 40642.45475588]
8)评估
后验差: 0.315294126575022
小误差概率p: 0.8888888888888888
9) 可视化

在上一篇文章中,用GM(1,1)预测城市用水量,得到c=0.819,p=0.44可以看出本文采取GM(1,N)模型后,效果明显提升。

灰色预测GM(1,n)模型_python相关推荐

  1. python灰色模型代码_python 实现 灰色预测 GM(1,1)模型 灰色系统 预测 灰色预测公式推导...

    来源公式推导连接 关键词:灰色预测 python 实现 灰色预测 GM(1,1)模型 灰色系统 预测 灰色预测公式推导 一.前言 本文的目的是用Python和类对灰色预测进行封装 二.原理简述 1.灰 ...

  2. python灰色预测_python 实现 灰色预测 GM(1,1)模型 灰色系统 预测 灰色预测公式推导...

    关键词:灰色预测 python 实现 灰色预测 GM(1,1)模型 灰色系统 预测 灰色预测公式推导 一.前言 本文的目的是用Python和类对灰色预测进行封装 二.原理简述 1.灰色预测概述 灰色预 ...

  3. 灰色预测GM(1,1)模型的java实现代码

    @TOC 灰色预测模型 本文以灰色预测GM(1,1)模型为主体,利用java代码实现灰色预测. 实现代码 public class GreyModel {//原始数组的个数private int si ...

  4. 「 数学模型 」“灰色预测GM(1,1)模型原理及Matlab实例”讲解

    一.前言 小白将使用的灰色预测模型的Matlab代码贴在下面,代码使用了灰色模型进行两次回归预测,缺点是精度不高,预测后的残差有点大. 灰色预测模型主要内容: GM(1,1)模型(1阶1个影响因素): ...

  5. 灰色预测GM(1,1)模型

    目录 简介 数学模型 分析步骤 对数据进行准指数规律检验 对预测效果进行评价 GM(1,1)模型拓展 MATLAB源码 简介 在这里,灰色的意思是系统的信息只有一部分,不完整,与之类似概念还有白色和黑 ...

  6. 灰色关联以及灰色预测GM(1,n),GM(1,1)模型(Python实现)

    **灰色关联以及灰色预测GM(1,n),GM(1,1)模型** 简介:本篇文章简单的介绍灰色关联以及灰色预测模型,使用python代码进行实现. 1. 灰色系统的概论 2. 关于灰色关联度那些事 3. ...

  7. python灰色预测_灰色系统预测GM(1,1)模型

    预备知识 (1)灰色系统 白色系统是指系统内部特征是完全已知的:黑色系统是指系统内部信息完全未知的:而灰色系统是介于白色系统和黑色系统之间的一种系统,灰色系统其内部一部分信息已知,另一部分信息未知或不 ...

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

    预备知识 (1)灰色系统 白色系统是指系统内部特征是完全已知的:黑色系统是指系统内部信息完全未知的:而灰色系统是介于白色系统和黑色系统之间的一种系统,灰色系统其内部一部分信息已知,另一部分信息未知或不 ...

  9. 灰色预测GM(1,1)代码

    目录 1.一项初始序列X0 2.累加序列,生成新序列 3.紧邻均值生成序列 4.求相关参数 5.由第四步求出参数 6.生成预测模型 7.累减还原,得原始数列的灰色预测值 8.模型检验 9.可视化 结果 ...

最新文章

  1. Android深度探索第四章
  2. RFID自动识别术语解释(zt)
  3. 迭代器和反向迭代器,常量迭代器和非常量迭代器
  4. React学习:脚手架搭建、antd引入-学习笔记
  5. .Net Core下通过Proxy 模式 使用 WCF
  6. el-button 图标显示在字后边_Excel和Visio联姻,自动生成跨职能流程图,还能用图标标记状态,太牛了!...
  7. akshare写etf动量滚动策略
  8. python怎么分析各个时间段的数据_Python数据分析:Python对Word数据的读写
  9. 计算机考研数据结构算法模板
  10. 理解 Delphi 的类(十) - 深入方法[15] - 调用其他单元的函数
  11. Android data分区格式F2FS改为EXT4
  12. MySQL 优化--持续整理
  13. 前端之Angular2实战:依赖注入详解与应用
  14. 《嵌入式 – GD32开发实战指南》第4章 GD32启动流程详解(Keil版)
  15. 个人向常用的一些函数的汇总成一个简易模板
  16. 天才绅士少女助手克里斯蒂娜 [数学+树状数组]
  17. 码农故事:一个辞职创业卖凉皮的程序员
  18. Apache的网页优化!!给你的网页套上一层层保护罩(网页压缩、网页缓存、隐藏版本信息、设置防盗链)
  19. 台北故宫博物院收藏:气势开张,米芾行草书法真迹《真酥帖》赏析
  20. 用A-priori算法实现frequent item set查找

热门文章

  1. Imagination宣布成立IMG实验室,致力于创造突破性技术
  2. springboot-cdn.bootcss.com失效+资源404解决方法
  3. 2021年浙江省税收优惠政策
  4. 曾经苍海难为水,除却巫山不是云
  5. 剑指Offer-42——扑克牌顺子
  6. Android SDK 2.3安装图文教程 Android模拟器上网设置
  7. 【签到】实现签到功能
  8. 如何制作高大上的PPT--了解ppt
  9. 荣耀V40正式发布:三大黑科技引擎 全方位护航游戏体验
  10. Rust China Conf 2021 首批议题确定