1

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

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

输出显示num_friendsrating在二项式情况下被采样,但不是在多项式情况下。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

1 回答 1

4

PyMC3 不会自动规范化 Dirichlet。到目前为止,您必须明确地使用simplextransform. 有关示例,请参见此处。

但是,使这种转换自动化存在一个问题:https ://github.com/pymc-devs/pymc3/issues/315

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

于 2014-12-08T09:37:57.797 回答