绘制中间与最优ARIMA(p,d,q)模型的AIC值:技术求助
绘制ARIMA(p,q)模型AIC值的可视化方案(d=0)
你已经通过AIC最小化筛选了ARIMA模型,而且所有结果里d固定为0,变量只有p(0-5)和q(0-5),对应的AIC值也都有了,下面我给你详细讲两种可视化的实现方法,用Python的常用库就能搞定:
一、2D可视化方案(推荐先做这个,更直观)
1. 热力图(最适合离散的p、q组合)
热力图能直接把p、q的组合和对应的AIC值用颜色深浅展示出来,一眼就能看到哪个(p,q)组合的AIC最小(也就是模型最优)。这里用seaborn和pandas来实现:
首先先整理数据,把p作为行、q作为列,AIC作为值:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 假设你已经有完整的36条数据,这里根据你给的head和tail示例构造(实际替换成你的全量数据) data = [ (0,0,-2671.744), (0,1,-2686.691), (0,2,-2685.053), (0,3,-2683.094), (0,4,-2688.464), (0,5,-2686.973), # 补充中间p=1到4的q=0-5的AIC值,这里用占位符,你替换成实际数据 (1,0,0), (1,1,0), (1,2,0), (1,3,0), (1,4,0), (1,5,0), (2,0,0), (2,1,0), (2,2,0), (2,3,0), (2,4,0), (2,5,0), (3,0,0), (3,1,0), (3,2,0), (3,3,0), (3,4,0), (3,5,0), (4,0,0), (4,1,0), (4,2,0), (4,3,0), (4,4,0), (4,5,0), (5,0,-2685.982), (5,1,-2684.926), (5,2,-2683.003), (5,3,-2683.654), (5,4,-2686.069), (5,5,-2698.871) ] # 转换成DataFrame并重塑成矩阵形式 df = pd.DataFrame(data, columns=['p', 'q', 'AIC']) aic_matrix = df.pivot(index='p', columns='q', values='AIC') # 绘制热力图 plt.figure(figsize=(8,6)) sns.heatmap(aic_matrix, annot=True, fmt='.3f', cmap='viridis', cbar=True) plt.title('ARIMA(p,q)模型AIC值热力图(d=0)') plt.xlabel('q值') plt.ylabel('p值') plt.show()
注:因为AIC越小模型越好,所以热力图里颜色越暗(取决于你选的colormap)的位置,就是更优的模型组合,比如你给的结果里(p=5,q=5)的AIC最小,会显示最明显的颜色。
2. 分组折线图
如果想观察每个p值下,q变化对AIC的影响,可以做分组折线图:
plt.figure(figsize=(10,6)) # 按p分组,遍历每个p对应的q和AIC for p_val in df['p'].unique(): subset = df[df['p'] == p_val] plt.plot(subset['q'], subset['AIC'], marker='o', label=f'p={p_val}') plt.title('不同p值下q对AIC的影响(d=0)') plt.xlabel('q值') plt.ylabel('AIC值') plt.legend(title='p值') plt.grid(True, alpha=0.3) plt.show()
这个图能帮你看到每个p对应的q变化趋势,比如是不是q越大AIC越小,或者有没有拐点。
二、3D曲面图可视化
如果想更立体地展示p、q和AIC的关系,可以做3D曲面图,用matplotlib的3D模块:
import numpy as np from mpl_toolkits.mplot3d import Axes3D # 生成p和q的网格 p = np.arange(0,6) q = np.arange(0,6) P, Q = np.meshgrid(p, q) # 把AIC矩阵转换成numpy数组 AIC = aic_matrix.values # 绘制3D曲面图 fig = plt.figure(figsize=(10,8)) ax = fig.add_subplot(111, projection='3d') surf = ax.plot_surface(P, Q, AIC, cmap='viridis', edgecolor='none') # 设置标签和标题 ax.set_title('ARIMA(p,q)模型AIC值3D曲面图(d=0)') ax.set_xlabel('p值') ax.set_ylabel('q值') ax.set_zlabel('AIC值') # 添加颜色条 fig.colorbar(surf, shrink=0.5, aspect=5) plt.show()
你可以拖拽旋转这个3D图,从不同角度观察AIC随p、q变化的趋势,找到全局最小值的位置。
小提示
- 如果你用的是R语言,思路类似:热力图可以用
ggplot2的geom_tile,3D图用plot3D包。 - 一定要确保你的数据是完整的6x6矩阵(p和q都从0到5),不然绘图会报错。
内容的提问来源于stack exchange,提问作者toyo10
相关产品推荐
相关产品推荐

