当前位置:   article > 正文

数学建模-灰色预测最强讲义 GM(1,1)原理及Python实现_灰色预测模型gm(1,1)

灰色预测模型gm(1,1)

目录

一、GM(1,1)模型预测原理

二、GM(1,1)模型预测步骤

2.1 数据的检验与处理

2.2 建立模型

2.3 检验预测值

三、案例 


灰色预测应用场景:时间序列预测

灰色预测的主要特点是模型使用的不是原始数据序列,而是生成的数据序列。其核心体系是灰色模型,即对原始数据做累加生成得到近似的指数规律再进行建模的方法。

优点是不需要很多的数据,一般只需要4个数据就可以,能解决历史数据少、序列的完整性及可靠性低的问题;能利用微分方程来充分挖掘系统的本质,精度高;能将无规律的原始数据进行生成得到规律性较强的生成序列,运算简便,易于检验,具有不考虑分布规律,不考虑变化趋势。

缺点是只适用于中短期的预测,只适合指数增长的预测。

一、GM11)模型预测原理

二、GM11)模型预测步骤

2.1 数据的检验与处理

2.2 建立模型

2.3 检验预测值

三、案例 

由北方某城市1986-1992年道路交通噪声平均值声级数据如表,进行未来10年的预测。

解:

级比检验

首先导入数据,做级比检验

  1. import pandas as pd
  2. import numpy as np
  3. data = pd.read_excel(r"C:\Users\Terry\Desktop\城市交通噪声数据.xlsx")
  4. x_0 = np.array(data["噪声分贝"].to_list()) # [1,2,3] ndarray
  5. x_0
  1. # 级比检验
  2. def level_ratio_test(x):
  3. # 可容覆盖范围
  4. n = len(x)
  5. cover_range = [np.exp(-2/(n+1)), np.exp(2/(n+1))]
  6. # 计算x[i]/x[i+1]的值,即计算级比
  7. lambda_x = x[:-1] / x[1:]
  8. for i in lambda_x:
  9. if i < cover_range[0] or i > cover_range[1]:
  10. print("不通过级比检验,无法使用GM(1,1)")
  11. return
  12. print("通过级比检验,可以使用GM(1,1)")
  13. level_ratio_test(x_0)

注:这里直接写了一个函数,计算量可容覆盖范围,循环判断是每个数的级比是否满足要求,如果不满足,跳出循环,并输出无法使用GM(1,1),如果循环结束,仍然没有输出无法使用,则标明所有级比均通过检验可以输出“通过级比检验,可以使用GM(1,1)”

建模及预测

  1. # 1.计算一次累加生成序列z_1
  2. x_1 = x_0.cumsum()
  3. # 2.计算均值生成序列z_1
  4. z_1 = (x_1[:-1] + x_1[1:]) / 2.0
  5. # 3.计算B矩阵
  6. B = np.vstack([-z_1, np.ones(len(x_0)-1)]).T
  7. # 4.计算Y矩阵
  8. Y = x_0[1:].reshape((-1, 1))
  9. # 5.计算a,b
  10. # a为发展系数 b为灰色作用量
  11. [[a], [b]] = np.linalg.inv(B.T @ B) @ B.T @ Y # 计算参数
  12. # 6.原始年份的预测值
  13. x_1_predict = []
  14. n = len(x_0)
  15. for k in range(n): # 如果预测k个未来年份 这里就n+k 假设预测未来5年就n+5
  16. x_1_predict.append((x_0[0]-b/a)*np.exp(-a*k) + b/a)
  17. # 7.还原数据
  18. x_0_predict = np.hstack([x_0[0],np.diff(x_1_predict)])

结果检验

  1. import pandas as pd
  2. result = pd.DataFrame({"原始数据":x_0,
  3. "预测数据":x_0_predict})
  4. # 残差:真实值 - 预测值
  5. result["残差"] = result["原始数据"] - result["预测数据"]
  6. # 相对误差
  7. result["相对误差"] = (abs(result["原始数据"] - result["预测数据"]) / result["原始数据"]).map('{:.2%}'.format)
  8. # 级比偏差
  9. lambda_x = x_0[:-1] / x_0[1:]
  10. result["级比偏差值"] = np.append(np.nan, abs(1-(1-0.5*a)/(1+0.5*a)*lambda_x))
  11. result

相对误差、级别偏差均小于0.1,达到较高要求。

结果描述及未来预测

通过绘制折线图来看真实值和预测值的比较

  1. result = result.set_index(data.年份)
  2. import pandas as pd
  3. import matplotlib.pyplot as plt
  4. import seaborn as sns
  5. # 输出高清图像
  6. %config InlineBackend.figure_format = 'retina'
  7. %matplotlib inline
  8. #设定 seaborn 风格
  9. sns.set()
  10. with plt.xkcd():
  11. #用 matplotlib 画出每个序列的折线
  12. plt.figure(figsize=(10,6))
  13. plt.plot(result['原始数据'], label='Original data',marker='o',color='g')
  14. plt.plot(result['预测数据'], label='Predicted data',marker='X',color='r')
  15. # 设定图例和标题
  16. plt.legend()
  17. plt.title('Comparison of Original Data and Predicted Data')
  18. # 设置坐标轴范围
  19. plt.ylim(60, 85)
  20. # 显示图表
  21. plt.show()

  1. # 假设预测10年
  2. x_1_predict = []
  3. for k in range(n+10): # 如果预测k个未来年份 这里就n+k 假设预测未来5年就n+5
  4. x_1_predict.append((x_0[0]-b/a)*np.exp(-a*k) + b/a) # 递推计算 第k+1个数 比如k=0的时候 就是第一个预测值
  5. x_1_predict
  6. # 7.还原数据
  7. x_0_predict = np.hstack([x_0[0],np.diff(x_1_predict)])
  8. x_0_predict
  9. year = data["年份"].tolist()
  10. for i in range(10):
  11. year.append(year[-1]+1)
  12. x_0_predict_more = pd.DataFrame({"未来预测":x_0_predict,"年份":year})
  13. x_0_predict_more = x_0_predict_more.set_index("年份")
  14. x_0_predict_more.iloc[0:n-1,:] = np.nan
  15. with plt.xkcd():
  16. #用 matplotlib 画出每个序列的折线
  17. plt.figure(figsize=(10,6))
  18. plt.plot(result['原始数据'], label='Original data',marker='o',color='g')
  19. plt.plot(result['预测数据'], label='Predicted data',marker='X',color='r')
  20. plt.plot(x_0_predict_more['未来预测'], label='Predicted Future data',marker='1',color='b',linestyle='--')
  21. # 设定图例和标题
  22. plt.legend()
  23. plt.title('Comparison of Original Data and Predicted Data')
  24. # 设置坐标轴范围
  25. plt.ylim(60, 80)
  26. # 显示图表
  27. plt.show()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/618194
推荐阅读
相关标签
  

闽ICP备14008679号