用python写GM(2,1)代码
时间: 2024-05-13 08:14:32 浏览: 5
GM(2,1)模型是一种灰色预测模型,可以用于时间序列预测。下面是一个用Python实现GM(2,1)模型的代码示例:
```python
import numpy as np
def GM_21(data):
# 累加生成序列
cum_data = np.cumsum(data)
# 紧邻均值生成序列
mean_data = (cum_data[:-1] + cum_data[1:]) / 2
# 级比生成序列
b = np.array([-mean_data, np.ones_like(mean_data)]).T
Yn = data[1:].reshape((-1, 1))
a = np.matmul(np.matmul(np.linalg.inv(np.matmul(b.T, b)), b.T), Yn)
# 模型预测
Yn_pred = np.zeros_like(data)
Yn_pred[0] = data[0]
for i in range(1, len(data)):
Yn_pred[i] = (data[0] - a[1] / a[0]) * np.exp(-a[0] * i) + a[1] / a[0]
return Yn_pred
```
这个函数接受一个一维数组 `data` 作为输入,并返回一个一维数组,表示模型预测的结果。可以将这个函数用于时间序列预测等应用中。
相关问题
利用Python写一段灰色模型GM(2,1)代码
好的,下面是一个简单的 Python 代码示例,用于构建一个灰色模型 GM(2,1):
```python
import numpy as np
class GreyModel:
def __init__(self, data):
# 初始化数据
self.data = np.array(data)
def generate(self, n):
# 根据数据生成灰色模型GM(2,1)
X1 = self.data
X1_cumsum = np.cumsum(X1)
n = len(X1)
# 计算矩阵B
B = np.zeros((n - 1, 2))
for i in range(n - 1):
B[i][0] = -0.5 * (X1_cumsum[i] + X1_cumsum[i+1])
B[i][1] = 1
# 计算向量Y
Y = X1[1:]
# 计算GM(2,1)的参数a和u
a, u = np.dot(np.dot(np.linalg.inv(np.dot(B.T, B)), B.T), Y)
# 预测下一步的值
X1_pred = (X1[0] - u / a) * np.exp(-a * n) + u / a
# 计算残差序列
residuals = np.zeros(n)
for i in range(n):
if i == 0:
residuals[0] = X1[0] - X1_pred
else:
residuals[i] = X1[i] - (X1[0] - u / a) * np.exp(-a * i) - u / a
return X1_pred, residuals
# 创建一个灰色模型对象
gm = GreyModel([1, 3, 5, 7, 9, 11, 13, 15])
# 预测下一步的值
X1_pred, residuals = gm.generate(8)
# 输出预测结果和残差序列
print("预测结果为:", X1_pred)
print("残差序列为:", residuals)
```
以上代码实现了一个简单的灰色模型 GM(2,1)。在训练过程中,我们首先根据输入数据生成灰色模型 GM(2,1),然后使用该模型预测下一步的值,并计算残差序列。最后,输出预测结果和残差序列。
python GM(1,1) 模型代码
下面是 Python 中实现 GM(1,1) 模型的代码:
```python
import numpy as np
def GM11(x0):
"""
GM(1,1)模型预测函数
:param x0: 原始数据
:return: 预测结果
"""
x1 = np.cumsum(x0) # 累加处理
z1 = (x1[:-1] + x1[1:]) / 2.0 # 紧邻均值
z1 = z1.reshape((len(z1), 1))
B = np.append(-z1, np.ones_like(z1), axis=1)
Y = x0[1:].reshape((len(x0[1:]), 1))
# 计算参数
[[a], [b]] = np.dot(np.dot(np.linalg.inv(np.dot(B.T, B)), B.T), Y)
# 微分方程
result = (x0[0] - b / a) * np.exp(-a * np.arange(1, len(x0) + 1)) - (x0[0] - b / a) * np.exp(
-a * np.arange(len(x0)))
return result
```
使用时,只需要将原始数据传入函数 `GM11()`,即可得到 GM(1,1) 模型的预测结果。