用Python实现GM(1,1)预测

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 绘制原始数据和预测数据的对比图,直观展示预测效果。

你可能感兴趣的:(学习资源,python,开发语言)