Dirichlet vs pymc3中的二项式

时间:2014-12-02 17:03:56

标签: pymc pymc3

我无法使用pymc3从Dirichlet / Multinomial分布中采样。 我尝试创建一个简单的测试用例,使用Dirichlet / Multinomial重新创建一个Beta /二项式,其中n = 2,但我无法让它工作。

下面我有一些适用于二项式的代码但是没有用于多项式。 一个明显的区别是多项式模型受到更多限制: 即,开始时,在二项式模型中将评级设置为10,在多项式中将评级设置为[10,10]。 pymc3 Dirichlet代码确实说“只预期k-1的{​​{1}}元素”,但只有形状2的数组似乎在我的代码中有用。

输出显示在二项式情况下对xnum_friends进行采样,但在多项式情况下不进行采样。两者都在对rating进行抽样调查。谢谢!

哦,friends_ratings也崩溃了“浮点错误8”。当传入值为1的两个整数时,它似乎只会失败。Dirichlet('d', np.array([1,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))]

1 个答案:

答案 0 :(得分:4)

PyMC3不会自动标准化Dirichlet。到目前为止,您必须使用simplextransform明确地执行此操作。有关示例,请参阅here

有一个问题是自动进行此转换:https://github.com/pymc-devs/pymc3/issues/315

EDIT(2015年9月14日):PyMC3现在自动转换dirichlet分布(与任何其他分布一样)。因此您不需要再手动指定。