【问题标题】:python arma fitting running too slow?python arma 拟合运行太慢?
【发布时间】:2015-04-20 01:49:18
【问题描述】:

我正在做这个任务,我试图运行这个程序 5000 次,并做一个适合模型的 AR(1) 和 AR(2)。首先,我定义了一个生成时间序列的函数,如下所示:

def ts_gen_ar1(size,sigma,alpha1):
    wt = np.random.normal(0,sigma**2,size=size)
    x = np.zeros(size)
    for i in np.arange(1,size):
        x[i] = 0.2 + alpha1*x[i-1] + wt[i]
return x

然后我执行了以下需要很长时间才能工作的语句

sample_ar1 = []
sample_ar2 = []
for i in range(0,5000):
    rt = ts_gen_ar1(2500,1,0.8)
    coeff_ar1 = sm.tsa.ARMA(rt,order=(1,0)).fit().params[1]
    coeff_ar2 = sm.tsa.ARMA(rt,order=(2,0)).fit().params[1:]
    sample_ar1.append(coeff_ar1)
    sample_ar2.append(coeff_ar2)

有人可以建议如何加快速度吗?当我的程序说 MLE 无法在某些迭代中收敛时,我也遇到了拟合错误。

谢谢

【问题讨论】:

  • 您使用的是哪个版本的 statsmodels?
  • 您可能希望遵循答案中的建议,但如果您真的需要故障安全 ARMA 估计,您可以查看我的解决方案here
  • 你好 jseabold 先生。谢谢,我一直在关注你的帖子。我完全错过了那个功能。我会立即尝试,看看是否有帮助。不过,我仍然需要加快迭代速度……因为运行两种拟合算法大约需要 15-20 分钟。但是,如果我将进程拆分为不同的单元格并一个一个地执行,那么每个单元格大约需要 6 分钟。我将尝试遵循答案中的建议

标签: python for-loop time-series statsmodels autoregressive-models


【解决方案1】:

在普通 Python 中用于时间序列分析的递归循环很慢。

在这种情况下生成样本的最简单的解决方案是使用 scipy.signal.lfilter 或 statsmodels 中的包装器 arma_generate_sample http://statsmodels.sourceforge.net/devel/generated/statsmodels.tsa.arima_process.arma_generate_sample.html

另一种加速随机数生成的可能性是对许多样本进行矢量化运行,例如在 100 个进程的块上运行它。您仍然有时间循环,但您可以以使用更多内存为代价来减少复制循环的数量。

sm.tsa.ARMA 使用用 cython 编写的卡尔曼滤波器并且运行速度很快,但它适用于一般的 ARMA 过程,它比估计 AR 模型所需的工作更多。 sm.ts.AR 在平稳性假设下(默认情况下)通过最大似然估计 AR 过程的参数。

最简单最快的是通过OLS估计AR过程,不需要非线性优化,或者使用Yule-Walker statsmodels.sourceforge.net/devel/generated/statsmodels.regression.linear_model.yule_walker.html

最后两个可以根据初始观察估计参数,但不会具有 AR 和 ARMA 模型所具有的完整的估计后功能,例如预测。

【讨论】:

  • 您可以通过 method='css' 通过 OLS 进行 ARMA 估计,并且仍然有花里胡哨的功能。
猜你喜欢
  • 2017-05-19
  • 1970-01-01
  • 1970-01-01
  • 2016-08-10
  • 2014-12-19
  • 1970-01-01
  • 2020-02-04
  • 2017-11-14
  • 1970-01-01
相关资源
最近更新 更多