说到GM(1,n)模型,这里面的“1”表示模型中只有一个微分方程,而“n”则说明有n个变量参与进来。与我们之前了解的GM(1,1)模型不同,在GM(1,1)模型中只有一个因变量和一个自变量,而GM(1,n)模型则是在多变量的情况下进行预测,适合那种多因素影响下的预测问题。
比方说,咱们要预测一个地区的电力消费量,这个消费量可能不仅仅和时间有关,还可能和当地的经济发展水平、人口数量、工业结构等多个因素有关。这种多因子的情况下,就可以考虑用GM(1,n)模型来进行预测分析,它可以帮助咱们从有限的、不完全的数据中,找到这些因素与电力消费量之间的关系。
总结一下,GM(1,n)模型是灰色预测的一种扩展,它适用于数据量不大、信息不完全但又受多种因素影响的预测场景。通过对不完全信息的把握和挖掘,GM(1,n)模型能够帮助我们在复杂多变的实际问题中,找到规律,进行相对准确的预测。
灰色预测模型GM(1,n)被广泛应用于对多元变量的预测。这个模型通过灰色关联度来度量因素之间的影响关系。
给定一个多元时间序列数据集
其中, 为第 个变量向量, 。我们先生成累加序列
其中,
模型的微分方程为
通过最小二乘法求解模型参数。
然后,求解得到的微分方程,生成预测序列
预测序列 可以由以下公式得到:
最后,通过将累加生成序列反演,即求差分,得到原始预测序列
对于这种多变量的情况来说,GM(1,n)模型对于具有线性关系的多元序列具有较好的预测性能,但是当序列之间存在非线性关系时,模型的预测性能可能会下降。因此,灰色预测模型GM(1,n)更适用于短期预测,对于长期预测,需要其他更加合适的模型。
1import numpy as np
2import math as mt
3import matplotlib.pyplot as plt
4
5# 累加生成函数
6def generate_AGO(m):
7 return np.cumsum(m).tolist()
8
9# 紧邻均值生成函数
10def generate_Z(m):
11 return [(m[j]+m[j-1])/2 for j in range(1,len(m))]
12
13# 初始化原始数据和相关因素序列
14orig_data = [560823,542386,604834,591248,583031,640636,575688,689637,570790,519574,614677]
15factor_seq = [[104,101.8,105.8,111.5,115.97,120.03,113.3,116.4,105.1,83.4,73.3],
16 [135.6,140.2,140.1,146.9,144,143,133.3,135.7,125.8,98.5,99.8],
17 [131.6,135.5,142.6,143.2,142.2,138.4,138.4,135,122.5,87.2,96.5],
18 [54.2,54.9,54.8,56.3,54.5,54.6,54.9,54.8,49.3,41.5,48.9]]
19
20# 生成累加序列和B矩阵
21B = np.array(generate_Z(generate_AGO(orig_data))).reshape(-1, 1)
22Xi = np.array([generate_AGO(x)[1:] for x in factor_seq]).T
23
24# 构建B矩阵和Y向量
25B = np.hstack((-B, Xi))
26Y = np.mat(orig_data)[0, 1:].T
27
28# 求解参数
29params = np.linalg.inv(B.T.dot(B)).dot(B.T).dot(Y)
30al, b = float(params[0]), np.array(params[1:]).flatten().tolist()
31
32# 构建驱动值
33U = [sum(b[i] * xi[i] for i in range(len(xi))) for xi in Xi]
34
35# 计算预测并生成预测模型
36F = [(orig_data[0] - U[i-1] / al) / (mt.exp(al * i)) + U[i-1] / al for i in range(len(U))]
37
38# 还原生成预测数据
39F.insert(0, orig_data[0])
40predicted_data = [F[i] - F[i - 1] for i in range(1, len(F))]
41predicted_data.insert(0, orig_data[0])
42
43# 展示预测结果
44plt.plot(orig_data, 'r--', label='原始数据')
45plt.plot(predicted_data, 'b--', label='预测数据')
46plt.legend(loc='upper right')
47plt.show()
1import numpy as np
2import math as mt
3import matplotlib.pyplot as plt
4
5# 累加生成函数
6def generate_AGO(m):
7 return np.cumsum(m).tolist()
8
9# 紧邻均值生成函数
10def generate_Z(m):
11 return [(m[j]+m[j-1])/2 for j in range(1,len(m))]
12
13# 初始化原始数据和相关因素序列
14orig_data = [560823,542386,604834,591248,583031,640636,575688,689637,570790,519574,614677]
15factor_seq = [[104,101.8,105.8,111.5,115.97,120.03,113.3,116.4,105.1,83.4,73.3],
16 [135.6,140.2,140.1,146.9,144,143,133.3,135.7,125.8,98.5,99.8],
17 [131.6,135.5,142.6,143.2,142.2,138.4,138.4,135,122.5,87.2,96.5],
18 [54.2,54.9,54.8,56.3,54.5,54.6,54.9,54.8,49.3,41.5,48.9]]
19
20# 生成累加序列和B矩阵
21B = np.array(generate_Z(generate_AGO(orig_data))).reshape(-1, 1)
22Xi = np.array([generate_AGO(x)[1:] for x in factor_seq]).T
23
24# 构建B矩阵和Y向量
25B = np.hstack((-B, Xi))
26Y = np.mat(orig_data)[0, 1:].T
27
28# 求解参数
29params = np.linalg.inv(B.T.dot(B)).dot(B.T).dot(Y)
30al, b = float(params[0]), np.array(params[1:]).flatten().tolist()
31
32# 构建驱动值
33U = [sum(b[i] * xi[i] for i in range(len(xi))) for xi in Xi]
34
35# 计算预测并生成预测模型
36F = [(orig_data[0] - U[i-1] / al) / (mt.exp(al * i)) + U[i-1] / al for i in range(len(U))]
37
38# 还原生成预测数据
39F.insert(0, orig_data[0])
40predicted_data = [F[i] - F[i - 1] for i in range(1, len(F))]
41predicted_data.insert(0, orig_data[0])
42
43# 展示预测结果
44plt.plot(orig_data, 'r--', label='原始数据')
45plt.plot(predicted_data, 'b--', label='预测数据')
46plt.legend(loc='upper right')
47plt.show()
这段代码实现了灰色预测模型GM(1,n),并对预测结果进行了可视化,具体步骤如下:
通过这个程序,我们可以基于一组数据及其相关因素进行预测,然后用预测结果来进行未来趋势的判断或者进行决策。
应用领域:
适用问题:
优点:
缺点: