Python中的中文餐厅流程实现

时间:2013-10-16 14:20:13

标签: python random distribution sampling

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

并简要说明一下: 假设我们想要将进入餐馆的人分配给可能无限数量的表。如果$ z_i $表示为进入餐厅的$ i $'人分配的随机变量,则应保留以下内容:

概率$ p(z_i = a | z_1,...,z_ {i-1})= \ frac {n_a} {i-1 + \ alpha} for $ n_a> 0 $,$ 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

1 个答案:

答案 0 :(得分:1)

建议。忘记你写的代码。构造代码的声明性测试。通过采用这种方法,您可以从您知道正确答案的示例开始。例如,那会回答Brainiac的问题。

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