2014-12-02 22 views
1

我無法從pymc3中採樣Dirichlet/Multinomial分佈。 我試圖用n = 2創建一個簡單的測試用例來重新創建一個使用Dirichlet/Multinomial的Beta/Binomial,但是我無法使它工作。dirichlet vs pomc3中的二項式

下面我有一些適用於二項式的代碼,但多項式失敗。 其中一個明顯的差異是多項式模型更受約束: 即開始,在二項式模型中評級設爲10,在多項式中設爲[10,10]。 pymc3 Dirichlet代碼的確說「只有x的第一個k-1元素是預期的」,但只有形狀2的數組似乎在我的代碼中起作用。

輸出顯示num_friendsrating正在Binomial情況下進行採樣,但不在Multinomial情況下進行採樣。 friends_ratings正在兩個採樣中。謝謝!

哦,還有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

編輯(2015年9月14日):PyMC3現在自動變換狄利克雷分佈(如任何其他分佈)。所以你不需要再手動指定。

+0

鏈接已損壞:( – 2015-05-14 16:11:45

+0

我更新了鏈接 – twiecki 2015-05-16 11:14:16

+0

非常感謝您:) – 2015-05-16 12:09:40