用PYMC3/Thean广播数学运算

2024-09-26 18:04:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我认为这个问题归结为我对Theano作品缺乏理解。在这种情况下,我想创建一个变量,它是分布和numpy数组之间的减法的结果。当我将shape参数指定为1时,这种方法可以很好地工作

import pymc3 as pm
import numpy as np
import theano.tensor as T

X = np.random.randint(low = -10, high = 10, size = 100)

with pm.Model() as model:
    nl = pm.Normal('nl', shape = 1)
    det = pm.Deterministic('det', nl - x)

nl.dshape
(1,)

但是,当我指定shape>;1时,这将中断

^{pr2}$

我试着把X调过来让它可以播放

X2 = X.reshape(-1, 1).transpose()

X2.shape
(1, 100)

但现在它在.shape[1]而不是{}处声明了不匹配

with pm.Model() as model:
    nl = pm.Normal('nl', shape = 2)
    det = pm.Deterministic('det', nl - X2)

ValueError: Input dimension mis-match. (input[0].shape[1] = 2, input[1].shape[1] = 100)

如果我循环分布的元素,就可以实现这一点

distShape = 2
with pm.Model() as model:
    nl = pm.Normal('nl', shape = distShape)

    det = {}
    for i in range(distShape):
        det[i] = pm.Deterministic('det' + str(i), nl[i] - X)

det
{0: det0, 1: det1}

但是这感觉不雅观,并限制我在模型的其余部分使用循环。我想知道是否有一种方法可以指定这个操作,这样它就可以和发行版一样工作了。在

distShape = 2
with pm.Model() as model:
    nl0 = pm.Normal('nl1', shape = distShape)
    nl1 = pm.Normal('nl2', shape = 1)

    det = pm.Deterministic('det', nl0 - nl1)

Tags: importnumpymodelaswithnlx2normal
1条回答
网友
1楼 · 发布于 2024-09-26 18:04:46

你能做到的

X = np.random.randint(low = -10, high = 10, size = 100)
X = x[:,None] # or x.reshape(-1, 1)

然后呢

^{pr2}$

在这种情况下,nl和X的形状将分别为((2,1),(100,)),然后可广播。在

注意,两个NumPy数组(不仅仅是一个Theano张量和一个NumPy数组)也有相同的行为

a0 = np.array([1,2])
b0 = np.array([1,2,3,5])
a0 = a0[:,None]  # comment/uncomment this line
print(a0.shape, b0.shape)
b0-a0

相关问题 更多 >

    热门问题