0


灰色预测模型

一、什么是灰色预测

灰色系统是指系统数据有一些是未知,有一些是已知。白色系统是全都已知,黑色系统是全都未知。而灰色预测就是对含有已知和未知信息的系统进行预测,寻找数据变动规律,生成有较强规矩性的序列,再建立相应的微分方程模型,来对事物发展进行预测。

二、灰色预测建模流程图

三、建模步骤

3.1、在建模最开始,需要进行数据的级比检验

为了确定数据使用GM(1,1)模型的可行性需要在一开始对原始数据进行级比检验:

3.2、训练求解模型

对原始序列X0累加求和得到新的序列X1,可用一个指数曲线乃至一条直线的表达式逼近这个新序列,构建一阶常微分方程来求解拟合曲线的函数表达式 。表达式中含有未知数a和u,求出a和u即可解出预测方程。

对于a和u的求解我们采用最小二乘法:

参数a和u已求出,代入原微分方程,对微分方程进行求解。

3.3、模型检验

四、代码实现(python)

  1. class GM11():
  2. def __init__(self):
  3. self.f = None #预测方程
  4. def examine(self,X0):
  5. X1 = X0.cumsum() #对原始序列累加求和
  6. rho = [X0[i] / X1[i - 1] for i in range(1, len(X0))]
  7. rho_ratio = [rho[i + 1] / rho[i] for i in range(len(rho) - 1)]
  8. print("rho:", rho)
  9. print("rho_ratio:", rho_ratio)
  10. flag = True
  11. for i in range(2, len(rho) - 1):
  12. if rho[i] > 0.5 or rho[i + 1] / rho[i] >= 1:
  13. flag = False
  14. if rho[-1] > 0.5:
  15. flag = False
  16. if flag:
  17. print("数据通过光滑校验")
  18. else:
  19. print("该数据未通过光滑校验")
  20. '''判断是否通过级比检验'''
  21. lambds = [X0[i - 1] / X0[i] for i in range(1, len(X0))]
  22. X_min = np.e ** (-2 / (len(X0) + 1))
  23. X_max = np.e ** (2 / (len(X0) + 1))
  24. for lambd in lambds:
  25. if lambd < X_min or lambd > X_max:
  26. print('该数据未通过级比检验')
  27. return
  28. print('该数据通过级比检验')
  29. def train(self,X0):
  30. X1 = X0.cumsum()
  31. Z = (np.array([-0.5 * (X1[k - 1] + X1[k]) for k in range(1, len(X1))])).reshape(len(X1) - 1, 1)
  32. A = (X0[1:]).reshape(len(Z), 1)
  33. B = np.hstack((Z, np.ones(len(Z)).reshape(len(Z), 1)))
  34. # 求常微分方程中的a u参数
  35. a, u = np.linalg.inv(np.matmul(B.T, B)).dot(B.T).dot(A)
  36. u = Decimal(u[0])
  37. a = Decimal(a[0])
  38. #求解预测方程
  39. self.f = lambda k: (Decimal(X0[0]) - u / a) * np.exp(-a * k) + u / a
  40. def predict(self, k):
  41. X1_hat = [float(self.f(k)) for k in range(k)]
  42. X0_hat = np.diff(X1_hat) #还原原始序列
  43. X0_hat = np.hstack((X1_hat[0], X0_hat)) #添加上第一个数据
  44. return X0_hat
  45. def evaluate(self, X0_hat, X0):
  46. S1 = np.std(X0, ddof=1) # 原始数据样本标准差
  47. S2 = np.std(X0 - X0_hat, ddof=1) # 残差数据样本标准差
  48. C = S2 / S1 # 后验差比
  49. Pe = np.mean(X0 - X0_hat)
  50. temp = np.abs((X0 - X0_hat - Pe)) < 0.6745 * S1
  51. p = np.count_nonzero(temp) / len(X0) # 计算小误差概率
  52. print("原数据样本标准差:", S1)
  53. print("残差样本标准差:", S2)
  54. print("后验差比:", C)
  55. print("小误差概率p:", p)
  56. import matplotlib.pyplot as plt
  57. import numpy as np
  58. #保证画图正常显示
  59. plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
  60. plt.rcParams['axes.unicode_minus'] = False # 步骤二(解决坐标轴负数的负号显示问题)
  61. # 原始数据X
  62. X = np.array(
  63. [21.2, 22.7, 24.36, 26.22, 28.18, 30.16, 32.34, 34.72, 37.3, 40.34, 44.08, 47.92, 51.96, 56.02, 60.14,
  64. 64.58,
  65. 68.92, 73.36, 78.98, 86.6])
  66. # 训练集
  67. X_train = X[:int(len(X) * 0.7)]
  68. # 测试集
  69. X_test = X[int(len(X) * 0.7):]
  70. model = GM11()
  71. model.isUsable(X_train) # 判断模型可行性
  72. model.train(X_train) # 训练
  73. Y_pred = model.predict(len(X)) # 预测
  74. Y_train_pred = Y_pred[:len(X_train)]
  75. Y_test_pred = Y_pred[len(X_train):]
  76. score_test = model.evaluate(Y_test_pred, X_test) # 评估
  77. # 可视化
  78. plt.grid()
  79. plt.plot(np.arange(len(X_train)), X_train, '->')
  80. plt.plot(np.arange(len(X_train)), Y_train_pred, '-o')
  81. plt.legend(['负荷实际值', '灰色预测模型预测值'])
  82. plt.title('训练集')
  83. plt.show()
  84. plt.grid()
  85. plt.plot(np.arange(len(X_test)), X_test, '->')
  86. plt.plot(np.arange(len(X_test)), Y_test_pred, '-o')
  87. plt.legend(['负荷实际值', '灰色预测模型预测值'])
  88. plt.title('测试集')
  89. plt.show()

本文转载自: https://blog.csdn.net/m0_53653974/article/details/124829128
版权归原作者 lshan508 所有, 如有侵权,请联系我们删除。

“灰色预测模型”的评论:

还没有评论