用python实现拉丁超立方体采样

用python实现拉丁超立方体采样,python,random,sampling,Python,Random,Sampling,我想在多维(2,3,4)中对函数定义的分布进行采样: 分布可能是丑陋的、非标准的(如数据上的3D样条曲线、高斯和等)。为此,我想对2..4维空间进行统一采样,然后用一个额外的随机数接受或拒绝样本中空间的给定点 是否有现成的python库用于此目的 是否有python库用于使用拉丁超立方体采样或其他统一采样方法在2..4维空间中生成点?使用独立随机数的蛮力抽样通常会导致空间的密集区域越来越少 如果1)和2)不存在,是否有人愿意为相同或类似的问题共享他的实现 我将在python代码中使用它,但也承认

我想在多维(2,3,4)中对函数定义的分布进行采样:

分布可能是丑陋的、非标准的(如数据上的3D样条曲线、高斯和等)。为此,我想对2..4维空间进行统一采样,然后用一个额外的随机数接受或拒绝样本中空间的给定点

  • 是否有现成的python库用于此目的

  • 是否有python库用于使用拉丁超立方体采样或其他统一采样方法在2..4维空间中生成点?使用独立随机数的蛮力抽样通常会导致空间的密集区域越来越少

  • 如果1)和2)不存在,是否有人愿意为相同或类似的问题共享他的实现


  • 我将在python代码中使用它,但也承认与其他解决方案的链接。

    此二维示例在二维上均匀采样,以恒定概率选择每个点(从而保持点的二元分布数量),从样本空间中随机选择且不替换这些点,并生成一对向量,然后将其传递给函数f:

    import numpy as np
    import random
    resolution = 10
    keepprob = 0.5
    min1, max1 = 0., 1.
    min2, max2 = 3., 11. 
    keepnumber = np.random.binomial(resolution * resolution, keepprob,1)
    array1,array2  = np.meshgrid(np.linspace(min1,max1,resolution),np.linspace(min2,max2,resolution))
    randominixes  = random.sample(list(range(resolution * resolution)), int(keepnumber))
    randominixes.sort()
    vec1Sampled,vec2Sampled  = array1.flatten()[randominixes],array2.flatten()[randominixes]
    

    我想这是一个迟来的答案,但这也是为未来的游客。我刚刚在git上注册了。它是最小的,但非常容易使用。如果变量是独立的,则可以使用拉丁超立方体采样生成n维采样的均匀随机变量。下面是一个比较蒙特卡罗和拉丁超立方体抽样与零相关性二维多维均匀性(LHS-MDU)的示例图

    import lhsmdu
    import matplotlib.pyplot as plt
    import numpy
    
    l = lhsmdu.sample(2,10) # Latin Hypercube Sampling of two variables, and 10 samples each.
    k = lhsmdu.createRandomStandardUniformMatrix(2,10) # Monte Carlo Sampling
    
    fig = plt.figure()
    ax = fig.gca()
    ax.set_xticks(numpy.arange(0,1,0.1))
    ax.set_yticks(numpy.arange(0,1,0.1))
    plt.scatter(k[0], k[1], color="b", label="LHS-MDU")
    plt.scatter(l[0], l[1], color="r", label="MC")
    plt.grid()
    plt.show()
    

    现在,pyDOE库提供了一个工具来生成基于拉丁超立方体的样本

    要在n个维度上生成样本,请执行以下操作:

    lhs(n, [samples, criterion, iterations])
    

    其中n是维度的数量,samples是样本空间的总数。

    这里是Sahil M对Python 3的回答的更新(从Python 2更新为Python 3,并对代码和图形进行了一些小的代码更改):


    我曾经在运行这个脚本时遇到一个Python内存错误。有什么建议可以解释为什么会发生这种情况,或者如何更改脚本,使其在将来不再发生

    这对我来说马上就失败了:ndexError:只有整数、片(
    )、省略号(
    )、numpy.newaxis(
    None
    )和整数或布尔数组是有效的索引。失败的一行是l=lhsmdu.sample(2,10)(我在python3上)@SantiPeñate Vera很抱歉回复太晚了。这目前仅适用于Python 2.7,如果您仍打算使用它,我不介意花费一些时间使其与Python 3兼容。我现在不急于使用该库,但如果您将其移植到Python 3,我肯定会使用它。我曾尝试pip安装“lhsmdu”,但在此名称下没有模块。它之前不在pip上。我现在已经把它挂起来了。你能再检查一次吗?我如何指定种子值以便每次都得到相同的结果?不确定是否相关,但我将这些值保存在文本文件中以便以后使用。就我个人而言,我还没有检查过,每次尝试的结果都会有所不同,但我认为在我的硬盘中保存一份副本可能是个好主意。问题是我事先不知道我的'n'和'p'参数。但是,通过在导入pyDOE之后在主脚本中导入numpy,然后执行numpy.random.seed(seed_值),我能够在不修改pyDOE源代码的情况下解决问题。这确保了运行之间的数字相同。pyDOE2是仍在维护的pyDOE分支。它的一个改进是,您可以将随机种子直接传递到
    lhs
    。回答此问题需要更多信息。你能把它作为一个新问题或一个问题发布在Github上吗?是的,我会的。对于小样本,它做得很好。对于更大的样本或/和更多的变量,它有时会崩溃,或者需要很长时间才能生成(对于复杂的操作来说,这是可以接受的,但是的,功率稍大一点会很有用),以防有人在这个答案上突然出现,已经更新,现在运行速度快了20倍。感谢更新。但是,速度太慢,无法生成9D1000个样本。
    lhs(n, [samples, criterion, iterations])
    
    import lhsmdu
    import matplotlib.pyplot as plt
    import numpy
    
    l = lhsmdu.sample(2,10) # Latin Hypercube Sampling of two variables, and 10 samples each.
    k = lhsmdu.createRandomStandardUniformMatrix(2,10) # Monte Carlo Sampling
    
    fig = plt.figure()
    ax = fig.gca()
    ax.set_xticks(numpy.arange(0,1,0.1))
    ax.set_yticks(numpy.arange(0,1,0.1))
    plt.scatter([k[0]], [k[1]], color="r", label="MC")
    plt.scatter([l[0]], [l[1]], color="b", label="LHS-MDU")
    plt.legend()
    plt.grid()
    plt.show()