Python 用pymc3进行概率参数估计时的维数误差
我创建了一个简单的模型来模拟正弦波:Python 用pymc3进行概率参数估计时的维数误差,python,theano,pymc3,Python,Theano,Pymc3,我创建了一个简单的模型来模拟正弦波: x = np.linspace(0,4, 100) A = 3 f = 2 noise = np.random.normal(scale = 0.1, size=100) model = A * np.sin(f * x) y = model + noise 我可以用一个基本模型来估计这些变量: with pm.Model() as model: sigma = pm.HalfCauchy('sigma', beta=10, testval=1.
x = np.linspace(0,4, 100)
A = 3
f = 2
noise = np.random.normal(scale = 0.1, size=100)
model = A * np.sin(f * x)
y = model + noise
我可以用一个基本模型来估计这些变量:
with pm.Model() as model:
sigma = pm.HalfCauchy('sigma', beta=10, testval=1.)
A = pm.Normal('Amplitude', 0, sigma=10)
f = pm.Normal('freq', 0, sigma=10)
predict = A * tt.sin(f * x)
likelihood = pm.Normal('y', mu = predict, sigma=sigma, observed=y)
step = pm.Metropolis()
trace = pm.sample(5000, step = step)
这一切都按预期进行。
然而,我想扩大规模。我想使用广播,并像这样缩放变量以创建数据:
A = np.array([1,3]).reshape((2,1))
f = np.array([1, 2]).reshape((2,1))
model = tt.sum(A * tt.sin(f * x), axis=0)
y = model + noise
到目前为止,一切顺利。现在,问题是:
如果我对pm.Model进行如下重塑,它会起作用:
with pm.Model as model:
...
A = pm.Normal('Amplitude', 2, sigma=10, shape = 2)
f = pm.Normal('freq', 1, sigma=10, shape = 2)
predict = A[0] * tt.sin(f[0] * x) + A[1] * tt.sin(f[1] * x)
...
但很明显,这并不容易扩展
所以我试了一下:
A = pm.Normal('Amplitude', 2, sigma=10, shape = (2,1))
f = pm.Normal('freq', 1, sigma=10, shape = (2,1))
predict = tt.sum(A * tt.sin(f * x), axis=0)
但这给了我一个尺寸误差:
ValueError: Input dimension mis-match. (input[0].shape[1] = 1, input[3].shape[1] = 200)
我真的不明白为什么在数据创建过程中使用theano会起作用,但在最终的模型中会出现维度不匹配的情况。
我还使用predict.tag.test_value
检查了predict的形状,它在所有情况下都是相等的