我在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
答案 0 :(得分:1)
建议。忘记你写的代码。构造代码的声明性测试。通过采用这种方法,您可以从您知道正确答案的示例开始。例如,那会回答Brainiac的问题。
然后编写你的程序。您可能会发现,如果您开始以这种方式解决问题,您可能首先创建子问题,您也可以编写测试。在它们全部通过之前,没有必要急于解决全部问题。