2017-06-22 5 views
1

PyMCからPyMC3にthis codeを翻訳してPyMC3から始めます。変数を列挙する(PyMCをPyMC3に移植する)

私はこのセグメントを翻訳するかどうかはわかりません。

v = pymc.Beta('v', alpha=1, beta=alpha, size=N_dp) 
@pymc.deterministic 
def p(v=v): 
    """ Calculate Dirichlet probabilities """ 

    # Probabilities from betas 
    # this line creates the error: 
    value = [u*np.prod(1-v[:i]) for i,u in enumerate(v)] 
    # Enforce sum to unity constraint 
    value[-1] = 1-sum(value[:-1]) 

    return value 

z = pymc.Categorical('z', p, size=len(set(counties))) 

私はp(v)と最後の行にpを交換し、@pymc.deterministicを削除する必要がありますが、問題は、私はを列挙することができないということのようだと仮定vValueError: length not known: ViewOp [id A] 'v'

翻訳のやり方や、ドキュメントの関連するビットへのリンク方法を教えていただけますか?ありがとう。

+0

、私は 'v'からそれを作ることによって、変数[値]を作成できることがわかりましたリスト内包表記の代わりにテンソルを使用: def stick_breaking(ベータ): part_remaining = tt.concatenate([[1]、tt.extra_ops.cumprod(1 - v)[:-1]]) 値= v * part_remaining 戻り値 ' – Smind

答えて

2

全体のコードブロックがで置き換えることができるように、ディリクレ分布は、実際にbuilt into pymc3次のとおりです。興味のために

with pm.Model(): 
    ... 
    v = pm.Beta('v', alpha=1, beta=alpha, shape=N_dp) 
    p = pm.Dirichlet('p', a=v, shape=N_dp) 
    ... 
    trace = pm.sample(20000) 
+0

こんにちはJLLagrange - 私はDirichleのスティック・ブレイクの構築をしているので、これはここではうまくいかないと思いますtプロセス。それ以外の場合は、無限次元のディリクレを使用する必要があります。 'p'はベータ分布ベクトル' v'によって与えられるパラメータを持つグリフィス - エンゲン - マクロスキー(GEM)分布を持つことに注意してください。 – Smind

関連する問題