2014-12-02 5 views
1

pymc3을 사용하여 Dirichlet/Multinomial 분포에서 샘플링하는 데 문제가 있습니다. Dirichlet/Multinomial을 n = 2로 사용하여 Beta/Binomial을 다시 만들 수있는 간단한 테스트 케이스를 만들려고했지만 작동하지 않습니다.pymc3의 Dirichlet vs Binomial

아래에 나는 다항식에서 작동하지만 다항식에서는 실패하는 코드가 있습니다. 명백한 차이점 중 하나는 다항식 모델이 더 제한적이라는 것입니다 : 즉, 시작하려면 등급이 이항 모델에서 10으로 설정되고 다항식에서 [10,10]으로 설정됩니다. pymc3 Dirichlet 코드는 "첫 번째 k-1 요소가 x 인 것으로 예상되지만"모양 2 배열 만 내 코드에서 작동하는 것 같습니다.

출력 결과는 다항식 경우 num_friendsrating이 샘플링되지만 다항식 경우는 샘플링되지 않습니다. friends_ratings 모두에서 샘플링 중입니다. 감사!

Oh 또한 Dirichlet('d', np.array([1,1]))은 "부동 소수점 오류 8"과 충돌합니다. 값 1의 두 정수가 전달 될 때만 실패하는 것으로 나타납니다. 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

PyMC3 자동으로 디리클레을 정상화하지 않습니다. 지금까지 simplextransform을 사용하여 명시 적으로이 작업을 수행해야합니다. 예를 들어 here을 참조하십시오. https://github.com/pymc-devs/pymc3/issues/315

EDIT (2015년 9월 14일) :

이 비록 자동 변환 만드는 문제가 PyMC3은 자동적 (다른 분포 됨) 디리클레 분포를 변환한다. 따라서 수동으로 더 이상 지정할 필요가 없습니다.

+0

링크는 깨진 :( –

+0

나는 링크를 업데이트 – twiecki

+0

가 대단히 감사합니다;.) –