拉丁超立方采样与python

问题描述 投票:4回答:3

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

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

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

  1. 是否有为此目的准备使用python库?
  2. 是否有python lib用于在拉丁超立方采样或其他统一采样方法中生成这个2..4维空间中的点?具有独立随机数的强力采样通常导致空间的密集区域越来越密集。
  3. 如果1)和2)不存在,是否有任何人能够分享他对相同或类似问题的实施。

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

python random sampling
3个回答
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


3
投票

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

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

生成n维样本:

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

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


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]
© www.soinside.com 2019 - 2024. All rights reserved.