2016-08-25 4 views
1

この問題は、Theanoで私の理解が不足していると思います。私は分布とnumpyの配列の間の減算の結果である変数を作成したいという状況にあります。私は1PYMC3/Theanoで数学放送を放送する

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,) 

として形状パラメータを指定したとき、これはしかし、これは私が> 1

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

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

nl.dshape 
(2,) 

X.shape 
(100,) 

形状を指定したとき、私はそれbroadcastable

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

X2.shape 
(1, 100) 

作るためにXを転置しようとした壊し正常に動作しますしかし、今度は、.shape[0]の代わりに.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} 

以上のIループはしかし、これは洗練感じ、モデルの残りのループを使用するために私を拘束している場合、私はこの作業を行うことができます。私は、配布と同じように動作するようにこの操作を指定する方法があるのだろうかと思っていました。

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) 

答えて

2

あなたがNLとXの形状は、((2,1)、(100))となる。この場合、次に

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

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

を行うことができ、ブロードキャスト可能である。我々は2つのnumpyのアレイ(1つのTheanoテンソルと1つの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 
+0

おかげで同じ動作を得る

お知らせ!私はこれがpymc3で欲しい振る舞いを作り出していることを二重に確認しなければなりませんが、これは良い解決策であると楽観的です! –