我想对多维度(2,3,4)中的函数定义的分布进行采样:
f(x, y, ...) = ...
分布可能是丑陋的,非标准的(如数据上的3D样条,高斯等的总和等)。为此,我想统一采样2..4维空间,而不是使用额外的随机数接受或拒绝空间的给定点到我的样本中。
我将在python代码中使用它,但也承认其他解决方案的链接。
我想这是一个迟到的答案,但这也适用于未来的访客。我刚刚在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()
现在,pyDOE库提供了一个生成基于拉丁超立方体的样本的工具。
https://pythonhosted.org/pyDOE/randomized.html
生成n维样本:
lhs(n, [samples, criterion, iterations])
其中n是维数,样本作为样本空间的总数。
这个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]