拉丁超立方采样与python

时间:2014-10-01 08:30:01

标签: python random sampling

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

f(x, y, ...) = ...

分布可能是丑陋的,非标准的(如数据上的3D样条,高斯等的总和等)。为此,我想统一采样2..4维空间,而不是使用额外的随机数接受或拒绝空间的给定点到我的样本中。

  1. 为此目的是否准备好使用python库?

  2. 是否有python lib用于使用拉丁超立方采样或其他统一采样方法在此2..4维空间中生成点?具有独立随机数的强力采样通常会导致空间密集程度越来越低。

  3. 如果1)和2)不存在,是否有人愿意分享他对相同或类似问题的实施。

  4. 我将在python代码中使用它,但也会确认其他解决方案的链接。

5 个答案:

答案 0 :(得分:4)

我想这是一个迟到的答案,但这也适用于未来的访客。我刚刚在git上提出了an implementation of multi-dimensional uniform Latin Hypercube sampling。它很小,但很容易使用。如果变量是独立的,则可以使用拉丁超立方采样生成在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()

MCS versus LHS

答案 1 :(得分:3)

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

https://pythonhosted.org/pyDOE/randomized.html

生成n维样本:

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

其中n是维数,样本作为样本空间的总数。

答案 2 :(得分:0)

这个2-D示例在两个维度上均匀地采样,以恒定的概率选择每个点(从而保持二项分布的点数),随机选择并且不替换来自样本空间的那些点,并生成一对向量,然后你可以通过你的函数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]

答案 3 :(得分:0)

以下是Sahil M对Python 3的回答的更新(从Python 2更新到Python 3,并对代码进行了一些较小的更改以匹配代码和图形):

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()

code visual output

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

答案 4 :(得分:0)

从 1.7 版开始,拉丁超立方体采样现在是 SciPy 的一部分。请参阅doc

from scipy.stats.qmc import LatinHypercube

engine = LatinHypercube(d=2)
sample = engine.random(n=100)