我已经在Python中为CRP问题编写了代码。问题本身可以在这里找到:
http://cog.brown.edu/~mj/classes/cg168/slides/ChineseRestaurants.pdf

并简要说明一下:
假设我们要将进入餐厅的人员分配给潜在的无限数量的桌子。如果$ z_i $代表分配给进入餐厅的第$ i $个人的随机变量,则应满足以下条件:

对于$ n_a> 0 $,概率$ p(z_i = a | z_1,...,z_ {i-1})= \ frac {n_a} {i-1 + \ alpha},第i个人将坐在表$ a $中,并有概率$ p(z_i = a | z_1,...,z_ {i-1})= \ frac {\ alpha} {i-1 + \ alpha}第i个人会围坐在一张新桌子旁。

我不太确定我的代码是否正确,因为我很惊讶表的最终数量很少。

如果有人可以说实施是否正确以及是否有任何可能的改进,我将很高兴。

import numpy as np
def CRP(alpha,N):
    """Chinese Restaurant Process with alpha as concentration parameter and N
    the number of sample"""
    #Array which will save for each i, the number of people people sitting
    #until table i
    summed=np.ones(1) #first person assigned to the first table
    for i in range(1,N):
        #A loop that assigns the people to tables

        #randind represent the random number from the interval [1,i-1+alpha]
        randind=(float(i)+alpha)*np.random.uniform(low=0.0, high=1.0, size=1)
        #update is the index for the table that the person should be placed which
        #if greater than the total number, will be placed in a new table
        update=np.searchsorted(summed,randind,side='left')
        if randind>i:
            summed=np.append(summed,i+1)
        else:
            zerovec=np.zeros(update)
            onevec=np.ones(summed.size-update)
            summed+=np.append(zerovec,onevec)
    #This part converts summed array to tables array which indicates the number
    #of persons assigned to that table
    tables=np.zeros(summed.size)
    tables[0]=summed[0]
    for i in range(1,summed.size):
        tables[i]=summed[i]-summed[i-1]
    return tables
a=CRP(0.9999,1000)
print a

最佳答案

建议。忘记您编写的代码。构造代码的声明式测试。通过采用这种方法,您将从了解正确答案的示例开始。例如,那将回答Brainiac的问题。

然后编写您的程序。您可能会发现,如果您开始以这种方式解决问题,则可以首先创建子问题,还可以为其编写测试。在它们全部通过之前,没有必要着手解决整个问题。

10-07 17:46