灰色预测模型:
灰色预测模型是一种用于处理不完全信息的预测方法,适用于数据样本少、系统不确定性高的情况。
灰色预测模型的核心思想是利用已有的部分信息对未来进行预测。它的基本形式是灰色模型GM(1,1),其中“1”表示一个方程、一个变量的模型。这个模型通过对原始数据序列进行累加生成序列,然后建立一个差分方程进行建模,最后利用这个模型来预测未来的数据。本文按照最基础的单序列,一阶模型
解题:
假设我们有一个时间序列数据(比如月销售量)如下:
月销量 | 30 | 35 | 40 | 45 | 50 |
第几月 | 1 | 2 | 3 | 4 | 5 |
求解:使用灰色模型预测第6个月的销量
1:计算累加生成序列
解得累加生成序列:
2.建立差分方程:
解均值序列为:
3.构造矩阵:
目标矩阵:
4.使用最小二乘法求解模型参数
求解目标方程为:
化为矩阵形式:
也就是如下形式
最小二乘法就是求取最小值时的U
求解U的估计值为:
求出a和b的值带入到微分方程中:
计算得:
a = -0.1173
b = 29.7412
带入得
python代码:
- import numpy as np
- import matplotlib.pyplot as plt
-
- class GM11:
- def __init__(self, X, T):
- self.X = X
- self.T = T
- self.X1= []
- self.Z = []
- self.U = None
- def caculateXSum(self):#计算X1矩阵和Z矩阵
- count = 0
- X1 = []
- Z = []
-
- for i in range(0, len(self.X),1):
- count = count + self.X[i]
- X1.append(count)
- for j in range(0, len(X1) - 1,1):
- Z.append((X1[j] + X1[j + 1])/2)
- self.X1 = X1
- self.Z = Z
- def caculateAB(self):#计算U矩阵的值
- Y = (np.array(self.X[1:])).reshape(-1,1)
- B = np.array(self.Z)*-1
- ones_column = np.ones((B.shape[0], 1))
- B = np.hstack((B.reshape(-1,1), ones_column))
- #print(B)
- #print(Y)
- self.U = np.linalg.inv(B.T @ B) @ B.T @ Y
- #self.U = np.dot(np.linalg.inv(np.dot(B.T,B)),np.dot((B.T),Y))
- def caculateX(self, t):#计算最终的X
- if self.U is None:
- self.caculateXSum()
- self.caculateAB()
- t = t - 1
- a = self.U[0]
- b = self.U[1]
- result = (self.X[0] - b/a)*(np.e ** (-1*a*(t))) + b/a
- return result[0]
-
-
- X = np.array([30, 35, 40, 45, 50])
- T = np.array([1, 2, 3, 4, 5])
- GM11 = GM11(X, T)
- n = 6#预测第n个值
- result = GM11.caculateX(6)
- print(f'解得u矩阵为:{GM11.U[0]},{GM11.U[1]}')
- print(f'预测得x({n})的值为:{result}')
- #print(X)
-
- #绘图
- X1 = GM11.X1
- for i in range(1,4,1):
- X1.append(GM11.caculateX(5 + i))
- #print(X1)
- X = []
- X.append(X1[0])
- for i in range(1, len(X1), 1):
- X.append(X1[i] - X1[i - 1])
- plt.plot(range(len(X) - 3), X[0:-3], 'o-', label='Original')
- plt.plot(range(len(X) - 4, len(X)), X[-4:], 'x--', label='Future Prediction')
- plt.legend()
- plt.show()
效果图:
评论记录:
回复评论: