实现 gm(1,1)预测的 python 代码
时间: 2023-06-02 17:08:24 浏览: 106
GM(1,1)预测程序
4星 · 用户满意度95%
可以提供如下的 Python 代码实现:
```python
import numpy as np
from scipy.optimize import curve_fit
def gm11(x):
"""
使用灰色预测模型GM(1,1)对序列进行预测。
"""
n = len(x)
x1 = x.cumsum() # 一次累加
z1 = (x1[:n - 1] + x1[1:]) / 2.0 # 紧邻均值
z1 = z1.reshape((n - 1, 1))
B = np.append(-z1, np.ones_like(z1), axis = 1)
Y = x[1:].reshape((n - 1, 1))
[[a], [b]] = np.dot(np.dot(np.linalg.inv(np.dot(B.T, B)), B.T), Y) # 计算参数
predict = (x[0] - b / a) * np.exp(-a * (n - 1)) - (x[0] - b / a) * np.exp(-a * (n - 2))
predict = np.hstack((x[0], predict))
return predict
def ea_gm11(x, p = 1):
"""
使用灰色预测模型GM(1,1)对序列进行预测,使用残差比值来评估模型。
"""
n = len(x)
x1 = x.cumsum() # 一次累加
z1 = (x1[:n - 1] + x1[1:]) / 2.0 # 紧邻均值
z1 = z1.reshape((n - 1, 1))
B = np.append(-z1, np.ones_like(z1), axis = 1)
Y = x[1:].reshape((n - 1, 1))
[[a], [b]] = np.dot(np.dot(np.linalg.inv(np.dot(B.T, B)), B.T), Y) # 计算参数
predict = (x[0] - b / a) * np.exp(-a * (n - 1)) - (x[0] - b / a) * np.exp(-a * (n - 2))
e = x - predict # 残差
S1_ = np.abs(e).mean() # 原始序列平均值
S2_ = np.abs(e[1:]).mean() # 一次累加序列平均值
C = S2_ / S1_ # 残差比值
if C <= p:
print('模型检验通过。')
return predict, C
else:
print('模型检验不通过。')
return None, C
```
其中 `gm11` 函数是对序列进行 GM(1,1) 预测的函数,`ea_gm11` 函数是在 `gm11` 函数的基础上增加了使用残差比值来评估模型,并返回残差比值的函数。
阅读全文