灰色预测实现见:https://www.jianshu.com/p/a35ba96d852b

from pandas import Series
from pandas import DataFrame
import pandas as pd
import matplotlib.pyplot as plt class Gray_model:
def __init__(self):
self.a_hat = None
self.x0 = None def fit(self,
series=pd.Series(index=[1996, 1997, 1998, 1999], data=[1, 2, 3, 4])):
"""
Series is a pd.Series with index as its date.
:param series: pd.Series
:return: None
"""
self.a_hat = self._identification_algorithm(series.values)
self.x0 = series.values[0] def predict(self, interval):
result = []
for i in range(interval):
result.append(self.__compute(i))
result = self.__return(result)
return result def _identification_algorithm(self, series):
B = np.array([[1] * 2] * (len(series) - 1))
series_sum = np.cumsum(series)
for i in range(len(series) - 1):
B[i][0] = (series_sum[i] + series_sum[i + 1]) * (-1.0) / 2
Y = np.transpose(series[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 score(self, series_true, series_pred, index):
error = np.ones(len(series_true))
relativeError = np.ones(len(series_true))
for i in range(len(series_true)):
error[i] = series_true[i] - series_pred[i]
relativeError[i] = error[i] / series_pred[i] * 100
score_record = {'GM': np.cumsum(series_pred),
'1—AGO': np.cumsum(series_true),
'Returnvalue': series_pred,
'Real_value': series_true,
'Error': error,
'RelativeError(%)': (relativeError)
}
scores = DataFrame(score_record, index=index)
return scores def __compute(self, k):
return (self.x0 - self.a_hat[1] / self.a_hat[0]) * np.exp(-1 * self.a_hat[0] * k) + self.a_hat[1] / self.a_hat[
0] def __return(self, series):
tmp = np.ones(len(series))
for i in range(len(series)):
if i == 0:
tmp[i] = series[i]
else:
tmp[i] = series[i] - series[i - 1]
return tmp def evaluate(self, series_true, series_pred):
scores = self.score(series_true, series_pred, np.arange(len(series_true))) error_square = np.dot(scores, np.transpose(scores))
error_avg = np.mean(error_square) S = 0 # X0的关联度
for i in range(1, len(series_true) - 1, 1):
S += series_true[i] - series_true[0] + (series_pred[-1] - series_pred[0]) / 2
S = np.abs(S) SK = 0 # XK的关联度
for i in range(1, len(series_true) - 1, 1):
SK += series_pred[i] - series_pred[0] + (series_pred[-1] - series_pred[0]) / 2
SK = np.abs(SK) S_Sub = 0 # |S-SK|b
for i in range(1, len(series_true) - 1, 1):
S_Sub += series_true[i] - series_true[0] - (series_pred[i] - series_pred[0]) + ((series_true[-1] -
series_true[0]) - (
series_pred[i] -
series_pred[0])) / 2
S_Sub = np.abs(S_Sub) T = (1 + S + SK) / (1 + S + SK + S_Sub) level = 0
if T >= 0.9:
level = 1
# print ('精度为一级')
elif T >= 0.8:
level = 2
# print ('精度为二级')
elif T >= 0.7:
level = 3
# print ('精度为三级')
elif T >= 0.6:
level = 4
# print ('精度为四级')
return 1 - T, level def plot(self, series_true, series_pred, index):
df = pd.DataFrame(index=index)
df['Real'] = series_true
df['Forcast'] = series_pred
plt.figure()
df.plot(figsize=(7, 5))
plt.xlabel('year')
plt.show()

灰色预测 GM11模型的更多相关文章

  1. 【数学建模】day14-建立GM(1,1)预测评估模型应用

    学习建立GM(1,1)灰色预测评估模型,解决实际问题: SARS疫情对某些经济指标的影响问题 一.问题的提出 2003 年的 SARS 疫情对中国部分行业的经济发展产生了一定影响,特别是对部分 疫情较 ...

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

    来源公式推导连接 https://blog.csdn.net/qq_36387683/article/details/88554434 关键词:灰色预测 python 实现 灰色预测 GM(1,1)模 ...

  3. R实现灰色预测

    1.简介 预测就是借助于对过去的探讨去推测.了解未来.灰色预测通过原始数据的处理和灰色模型的建立,发现.掌握系统发展规律,对系统的未来状态做出科学的定量预测.对于一个具体的问题,究竟选择什么样的预测模 ...

  4. 灰色预测原理及JAVA实现

    最近在做项目时,用户不想使用平均值来判断当前数据状态,想用其他的方式来分析数据的变化状态,在查找了一些资料后,想使用灰色预测来进行数据的预测.下面的内容是从网上综合下来的,java代码也做了一点改动, ...

  5. [matlab] 21.灰色预测、线性回归分析模型与最小二乘回归 (转载)

    灰色预测的主要特点是只需要4个数据,就能解决历史数据少,序列的完整性以及可靠性低的问题,能将无规律的原始数据进行生成得到规律性较强的生成序列,易于检验 但缺点是只适合中短期的预测,且只适合指数级增长的 ...

  6. 灰色预测--matlab&python实现

    function SGrey X0 = input('请输入原始负荷数据:'); %输入原始数据 n = length(X0); %原始n年数据 %累加生成 X1 = zeros(1,n); for ...

  7. matlab批量灰色预测

    没事玩了一下matlab 发现现在网上的代码都是一组数据预测 所以我就写个批量数据的预测 顺便学习下matlab ----------------------------------我是快乐的分割线- ...

  8. 使用sklearn进行数据挖掘-房价预测(6)—模型调优

    通过上一节的探索,我们会得到几个相对比较满意的模型,本节我们就对模型进行调优 网格搜索 列举出参数组合,直到找到比较满意的参数组合,这是一种调优方法,当然如果手动选择并一一进行实验这是一个十分繁琐的工 ...

  9. Tensorflow&CNN:验证集预测与模型评价

    版权声明:本文为博主原创文章,转载 请注明出处:https://blog.csdn.net/sc2079/article/details/90480140 - 写在前面 本科毕业设计终于告一段落了.特 ...

随机推荐

  1. [转帖]七牛云对HTTPS 的解释

     感觉对RTT 还有 建立连接的说明挺好的 转帖一下 学习   https://www.cnblogs.com/qiniu/p/6856012.html   序•魔戒再现   几天前,OpenSSL  ...

  2. vue 引入组件

    <comA></comA>此时可用在模板里 //a为vue文件,里面定义了模板import comA from './components/a' export default ...

  3. HDU4183_Pahom on Water

    题意为给你若干个圆,每个圆的颜色对应一个频率,如果两个圆有公共部分,那么这两个圆之间可以走,你可以从起点开始,从频率小的圆走向频率大的圆并且到达终点后,从频率大的圆走向频率小的圆,最终回到起点,路径中 ...

  4. Spring Cloud与微服务构建:微服务简介

    Spring Cloud与微服务构建:微服务简介 单体架构及其不足 1.单体架构简介 在软件设计中,经常提及和使用经典的3曾模型,即表示层.业务逻辑层和数据访问层. 表示层:用于直接和用户交互,也成为 ...

  5. 再谈MySql索引

    一.索引简介 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 索引分单列索引(主键索引.唯一索引.普通索引)和组合索引.单列索引,即一个索引只包含单个列 ...

  6. Concise and clear CodeForces - 991F(dfs 有重复元素的全排列)

    就是有重复元素的全排列 #include <bits/stdc++.h> #define mem(a, b) memset(a, b, sizeof(a)) using namespace ...

  7. 【刷题】BZOJ 4636 蒟蒻的数列

    Description 蒟蒻DCrusher不仅喜欢玩扑克,还喜欢研究数列 题目描述 DCrusher有一个数列,初始值均为0,他进行N次操作,每次将数列[a,b)这个区间中所有比k小的数改为k,他想 ...

  8. Vue设置页面的title

    原文地址:http://www.cnblogs.com/JimmyBright/p/7410771.html 前端框架如Vue.React等都是单页面的应用,也就是说整个web站点其实都是一个inde ...

  9. 【JQuery】DOM元素

    一.前言         接着上一章的内容,继续本章的学习. 二.内容 .get 获得由选择器指定的DOM元素, 可输入匹配元素的index编号 $(selector).get(index) .ind ...

  10. 使用LD_Preload的Linux权限升级技巧

      0x00 前言 共享库是程序在启动时加载的库.正确安装共享库后,之后启动的所有程序将自动使用新的共享库. 0x01 共享库名称 每个共享库都有一个名为soname的特殊名称.soname有前缀li ...