import numpy as np
import matplotlib.pyplot as plt
def gm11(x0):
# 累加生成序列
x1 = np.cumsum(x0)
n = len(x0)
# 构造矩阵 B 和向量 Y
B = np.zeros((n - 1, 2))
Y = np.zeros((n - 1, 1))
for i in range(0, n - 1):
B[i][0] = -0.5 * (x1[i] + x1[i + 1])
B[i][1] = 1
Y[i][0] = x0[i + 1]
# 最小二乘法求解参数 a 和 b
a, b = np.linalg.inv(B.T @ B) @ B.T @ Y
a = a[0] # 这里确保 a 是一个标量
# 去掉多余的索引操作
b = b[0]
# 预测公式
def predict(k):
x1_pred = (x0[0] - b / a) * (1 - np.exp(a)) * np.exp(-a * (k - 1))
return x1_pred
# 生成预测序列
x1_pred = [predict(i) for i in range(1, n + 1)]
# 累减还原预测序列
x0_pred = np.zeros(n)
x0_pred[0] = x0[0]
for i in range(1, n):
x0_pred[i] = x1_pred[i] - x1_pred[i - 1]
return x0_pred
# 示例数据集
x0 = np.array([10, 12, 15, 18, 20])
x0_pred = gm11(x0)
print("预测结果:", x0_pred)
# 绘图对比
plt.plot(range(len(x0)), x0, label='Original')
plt.plot(range(len(x0_pred)), x0_pred, label='Predicted')
plt.legend()
plt.show()
代码解释:
累加生成序列:
首先,对原始序列 x0 进行累加操作得到 x1 序列,使用 np.cumsum(x0) 函数。
累加操作是 GM (1,1) 建模的基础,将原始数据的随机性降低,增强数据的规律性。
构造矩阵 B 和向量 Y:
创建一个 (n - 1, 2) 的矩阵 B 和 (n - 1, 1) 的向量 Y。
根据 GM (1,1) 的建模要求,对于 B 矩阵,其第一列元素 B[i][0] 为 -0.5 * (x1[i] + x1[i + 1]),第二列元素 B[i][1] 为 1。
对于 Y 向量,其元素 Y[i][0] 为 x0[i + 1]。
最小二乘法求解参数 a 和 b:
通过 np.linalg.inv(B.T @ B) @ B.T @ Y 求解矩阵方程,得到参数 a 和 b。
这里利用了最小二乘法的矩阵表示形式,求解灰色预测模型中的发展系数 a 和灰色作用量 b。
预测公式:
定义 predict(k) 函数,根据 GM (1,1) 的预测公式 x1_pred = (x0[0] - b / a) * (1 - np.exp(a)) * np.exp(-a * (k - 1)) 计算预测的累加序列。
该公式是根据灰色系统理论推导得出的,是 GM (1,1) 模型的核心公式。
生成预测序列:
利用 predict(k) 函数生成 x1_pred 预测累加序列。
对 k 从 1 到 n 进行计算,得到完整的预测累加序列。
累减还原预测序列:
对 x1_pred 进行累减操作,得到还原后的预测序列 x0_pred。
从累加序列还原到原始数据序列的预测值,以便和原始数据对比。
示例数据集和结果输出:
给出一个示例的 x0 数据集,并调用 GM11(x0) 函数进行预测,输出预测结果。
同时使用 matplotlib.pyplot 绘制原始数据和预测数据的对比图,直观展示预测效果。