我尝试实现一个简单的 ARMA 模型,但是很难让它运行。向错误项添加参数时,一切正常(请参见return x_m1 + a*e
下面注释掉的语句),但是如果我向自回归部分添加参数,我会得到一个FloatingPointError
or LinAlgError
or 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
似乎更可取。
任何帮助都非常受欢迎!