1

pymc3 でディリクレ/多項分布からのサンプリングに問題があります。n=2 の Dirichlet/Multinomial を使用して Beta/Binomial を再作成する簡単なテスト ケースを作成しようとしましたが、うまくいきません。

以下に、二項では機能するが多項では失敗するコードをいくつか示します。明らかな違いの 1 つは、多項式モデルがより制約されていることです。つまり、評価はまず、2 項式モデルでは 10 に設定され、多項式モデルでは [10,10] に設定されます。pymc3 ディリクレ コードでは、「の最初のk-1要素のみxが期待されます」と表示されますが、私のコードでは形状 2 の配列のみが機能するようです。

出力は、num_friendsratingが二項の場合にサンプリングされていることを示していますが、多項の場合にはサンプリングされていません。friends_ratings両方でサンプリングされています。ありがとう!

あ、Dirichlet('d', np.array([1,1]))「浮動小数点エラー 8」でもクラッシュします。値 1 の 2 つの整数が渡された場合にのみ失敗するように見えますnp.array([1.,1.])

import pymc as pm
import numpy as np

print "TEST BINOMIAL"
with pm.Model() as model:
    friends_ratings = pm.Beta('friends_ratings', alpha=1, beta=2)
    num_friends = pm.DiscreteUniform('num_friends', lower=0, upper=100)
    rating = pm.Binomial('rating', n=num_friends, p=friends_ratings)

    step = pm.Metropolis([num_friends, friends_ratings, rating])
    start = {"friends_ratings":.5, "num_friends":20, 'rating':10}

    tr = pm.sample(5, step, start=start, progressbar=False)    
    print "friends", [tr[i]['num_friends'] for i in range(len(tr))]
    print "friends_ratings", [tr[i]['friends_ratings'] for i in range(len(tr))]
    print "rating", [tr[i]['rating'] for i in range(len(tr))]

print "TEST DIRICHLET"
with pm.Model() as model:
    friends_ratings = pm.Dirichlet('friends_ratings', np.array([1.,1.]), shape=2)
    num_friends = pm.DiscreteUniform('num_friends', lower=0, upper=100)    
    rating = pm.Multinomial('rating', n=num_friends, p=friends_ratings, shape=2)

    step = pm.Metropolis([num_friends, friends_ratings, rating])
    start = {'friends_ratings': np.array([0.5,0.5]), 'num_friends': 20, 'rating': [10,10]}

    tr = pm.sample(5, step, start=start, progressbar=False)    
    print "friends", [tr[i]['num_friends'] for i in range(len(tr))]
    print "friends_ratings", [tr[i]['friends_ratings'] for i in range(len(tr))]
    print "rating", [tr[i]['rating'] for i in range(len(tr))]

出力:

TEST BINOMIAL
friends [22.0, 24.0, 24.0, 23.0, 23.0]
friends_ratings [0.5, 0.5, 0.41, 0.41, 0.41]
ratingf [10.0, 11.0, 11.0, 11.0, 11.0]
TEST DIRICHLET
friends [20.0, 20.0, 20.0, 20.0, 20.0]
friends_ratings [array([ 0.51369621,  1.490608  ]), ... ]
rating [array([ 10.,  10.]), array([ 10.,  10.]), ... ]
4

1 に答える 1

4

PyMC3 はディリクレを自動的に正規化しません。これまでのところ、 を使用して明示的にこれを行う必要がありますsimplextransform例については、こちらを参照してください。

ただし、この変換を自動化することには問題があります: https://github.com/pymc-devs/pymc3/issues/315

編集 (2015 年 9 月 14 日): PyMC3 は、ディリクレ分布を (他の分布と同様に) 自動的に変換するようになりました。したがって、手動で指定する必要はもうありません。

于 2014-12-08T09:37:57.797 に答える