Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python实现中餐厅流程_Python_Random_Distribution_Sampling - Fatal编程技术网

用Python实现中餐厅流程

用Python实现中餐厅流程,python,random,distribution,sampling,Python,Random,Distribution,Sampling,我已经用Python为CRP问题编写了一段代码。问题本身可以在这里找到: 并对其进行简要描述: 假设我们要将进入餐厅的人分配给可能无限多的桌子。如果$z_i$代表分配给进入餐厅的第$i$个人的随机变量,则以下值应保持不变: 概率$p(z_i=a|z_1,…,z_{i-1})=\frac{n_a}{i-1+\alpha}为$n_a>0$,第$i$人将坐在表$a$中,概率$p(z_i=a | z_1,…,z_{i-1})=\frac{alpha i}{i-1+\alpha i$i$人将围坐在新表周

我已经用Python为CRP问题编写了一段代码。问题本身可以在这里找到:

并对其进行简要描述: 假设我们要将进入餐厅的人分配给可能无限多的桌子。如果$z_i$代表分配给进入餐厅的第$i$个人的随机变量,则以下值应保持不变:

概率$p(z_i=a|z_1,…,z_{i-1})=\frac{n_a}{i-1+\alpha}为$n_a>0$,第$i$人将坐在表$a$中,概率$p(z_i=a | z_1,…,z_{i-1})=\frac{alpha i}{i-1+\alpha i$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

建议。忘记你写的代码吧。构造代码的声明性测试。通过这种方法,你可以从你知道正确答案的例子开始。例如,这就回答了布莱尼亚克的问题


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

建议。忘记你写的代码吧。构造代码的声明性测试。通过这种方法,你可以从你知道正确答案的例子开始。例如,这就回答了布莱尼亚克的问题


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

这应该是打开的,但没有迁移它的选项。@在巴罗什,stackexchange的分支数量每天都在增加,因为不知道有新分支,所以获得负票真的很有趣!你可能会投反对票,因为这个“问题”对除你之外的任何人都没有用处。对这个问题的任何回答只会在这个特定的时间影响这个特定的实例。它不适合在这个网站上提问的方式,但非常适合codereview网站。这不是一个代码分发网站。您可以试试github,我听说这是分发Python代码片段的好地方。StackOverflow不是来检查代码或分发代码的,它是来帮助您解决代码可能存在的问题的。如果您的代码有特定问题,欢迎您重新表述您的问题,并通过添加示例、预期结果和挑选代码中需要帮助的部分来改进它。@Naji:这不是新问题-它已经存在近三年了!这应该是打开的,但没有迁移它的选项。@在巴罗什,stackexchange的分支数量每天都在增加,而且由于不知道有新的分支,所以获得负票真的很有趣!你可能会投反对票,因为这个“问题”对除你之外的任何人都没有用处。对这个问题的任何回答只会在这个特定的时间影响这个特定的实例。它不适合在这个网站上提问的方式,但非常适合codereview网站。这不是一个代码分发网站。您可以试试github,我听说这是分发Python代码片段的好地方。StackOverflow不是来检查代码或分发代码的,它是来帮助您解决代码可能存在的问题的。如果您的代码有特定问题,欢迎您重新表述您的问题,并通过添加示例、预期结果和挑选代码中需要帮助的部分来改进它。@Naji:这不是新问题-它已经存在近三年了!我不太确定我是否理解了您的意思,但我不熟悉为随机程序编写测试样本?对于初学者,如果N=-1,0,1,您会期望什么?alpha<0,=0,等等。在这些条件的组合下,您可以使用CRP(alpha,N)断言系统的状态。如果存在具有分析确定结果的情况,则对其进行测试。在开始使用之前最好先找到bug。我实际上在这里得到了答案:我要的是累积量。至于测试随机算法,你可以使用一个接口,在生产中使用它时,你可以在这里提供随机结果,但在测试过程中,您可以提供预先确定的值,以便提前计算结果。如果您的系统具有渐近行为,那么您也可以测试它是否接近该行为。我不太确定我是否理解您的意思,但我不熟悉为随机程序编写测试样本?对于初学者,如果N=-1,0,1,您期望什么?alpha<0,=0,等等。在这些条件的组合下,您可以使用CRP(alpha,N)断言系统的状态。如果存在具有分析确定结果的情况,则对其进行测试。在开始使用之前最好先找到bug。我实际上在这里得到了答案:我要的是累积量。至于测试随机算法,你可以使用一个接口,在生产中使用它时,你可以在这里提供随机结果,但在测试过程中,您可以提供预先确定的值,以便提前计算结果。如果您的系统具有渐近行为,那么您还可以测试它是否接近该行为。