1

我尝试实现一个简单的 ARMA 模型,但是很难让它运行。向错误项添加参数时,一切正常(请参见return x_m1 + a*e下面注释掉的语句),但是如果我向自回归部分添加参数,我会得到一个FloatingPointErroror LinAlgErroror PositiveDefiniteError,具体取决于我使用的初始化方法。

该代码也包含在您可以在此处找到的要点中。模型定义在此处复制:

with pm.Model() as model:
    a = pm.Normal("a", 0, 1)
    sigma = pm.Exponential('sigma', 0.1, testval=F(.1))
    e = pm.Normal("e", 0, sigma, shape=(N-1,))

    def x(e, x_m1, a):
        # return x_m1 + a*e
        return a*x_m1 + e

    x, updates = theano.scan(
        fn=x,
        sequences=[e],
        outputs_info=[tt.as_tensor_variable(data.iloc[0])],
        non_sequences=[a]
    )
    x = pm.Deterministic('x', x)

    lam = pm.Exponential('lambda', 5.0, testval=F(.1))
    y = pm.StudentT("y", mu=x, lam=lam, nu=1, observed=data.values[1:]) # 

with model:
    trace = pm.sample(2000, init="NUTS", n_init=1000)

这里是与初始化方法相关的错误:

“ADVI”/“ADVI_MAP”:FloatingPointError: NaN occurred in ADVI optimization.

“地图”:LinAlgError: 35-th leading minor not positive definite

“坚果”:PositiveDefiniteError: Scaling is not positive definite. Simple check failed. Diagonal contains negatives. Check indexes [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71]

有关错误消息的详细信息,请查看在 pymc3 上发布的这个 github 问题

明确地说,我真的很想有一个类似扫描的解决方案,它很容易扩展到例如完整的 ARMA 模型。我知道logP通过在 pymc3/distributions/timeseries.py#L18-L46 中已经完成的定义,可以在不扫描的情况下表示呈现的 AR(1) 模型,但是我无法将这种矢量化样式扩展到完整的 ARMA 模型。我认为使用theano.scan似乎更可取。

任何帮助都非常受欢迎!

4

0 回答 0