为什么我们需要对凸多边形进行三角剖分才能对其均匀采样?

问题描述

假设我要均匀采样凸多边形内的点。

这里和互联网上最常见的方法之一是对多边形进行三角剖分,并使用不同的方案在每个三角形内部生成均匀的随机点。

我发现最实用的方法是从均匀的分布中生成指数分布,例如以-log(U)并将其归一化。

在Matlab中,我们可以使用以下代码在三角形内部进行均匀采样:

vertex=[0 0;1 0;0.5 0.5]; %vertex coordinates in the 2D plane

mix_coeff=rand(10000,size(vertex,1)); %uniform generation of random coefficients
x=-log(x); %make the uniform distribution exponential
x=bsxfun(@rdivide,x,sum(x,2)); %normalize such that sum is equal to one
unif_samples=x*vertex; %calculate the 2D coordinates of each sample inside the triangle

这很好用:

enter image description here

但是,对三角形以外的任何东西使用完全相同的方案只会失败。例如对于一个四边形,我们得到以下结果:

enter image description here

很显然,采样不再是统一的,添加的顶点越多,越难到达角点。

如果我首先对多边形进行三角剖分,那么在每个三角形中进行均匀采样就很容易,显然可以完成工作。

但是为什么呢?为什么必须先进行三角剖分?

哪个特定属性具有三角形(通常是单形,因为这种行为似乎扩展到n维结构),因此对它们有效,而对其他多边形无效。

如果有人能给我关于现象的直观解释,或者只是指向一些可以帮助我了解正在发生的事情的参考文献,我将不胜感激。

解决方法

我应该指出,并非一定要对多边形进行三角剖分以便从中进行均匀采样。采样形状的另一种方法是拒绝采样,过程如下。

  1. 确定一个覆盖整个形状的边界框。对于多边形,这就像查找多边形的最高和最低x和y坐标一样简单。
  2. 在边界框中随机选择一个点。
  3. 如果该点位于形状内,请返回该点。 (对于多边形,确定该多边形的算法统称为point-in-polygon predicates。)否则,请转到步骤2。

但是,有两个因素会影响此算法的运行时间:

  1. 时间复杂度在很大程度上取决于所讨论的形状。通常,此算法的接受率是形状的体积除以边界框的体积。 (特别是,对于高尺寸形状,接受率通常非常低,部分原因是尺寸的诅咒:典型形状比其边界框覆盖的体积要小得多。)
  2. 此外,算法的效率取决于确定一个点是否在所讨论的形状中的速度。因此,复杂形状通常是由更简单的形状(例如三角形,圆形和矩形)组成的,对于这些形状而言,很容易确定点是否位于复杂形状中或确定该形状的边界框。 / li>

请注意,原则上可以将拒绝采样应用于采样任何尺寸的任何形状,而不仅仅是凸面二维多边形。因此,它适用于圆形,椭圆形和弯曲形状等。

实际上,从原则上讲,多边形可以分解为除三角形以外的多种形状,其中一种形状按其面积成比例采样,并且该形状中的一个点通过拒绝采样随机采样。 >


现在,来解释一下您在第二张图片中给出的现象:

您拥有的不是4边(2维)多边形,而是投影到2维空间的3维单面体(即四面体)。 (另请参见先前的答案。)此投影解释了为什么“多边形”内的点在内部比在角落处显得更密集。您会看到为什么将“多边形”描绘成四面体,且四个角在不同深度的原因。随着单纯形尺寸的增大,这种现象变得越来越严重,这又部分是由于维数的诅咒

,

嗯,有比较便宜的方法来对三角形中的均匀样本进行采样。您要在单纯形d + 1中采样Dirichlet分布,并进行投影,计算指数等。我会请您参考代码示例和纸质参考文献here,它只有平方根,更简单的算法。

关于在复杂区域(在您的情况下为四边形)进行统一采样非常简单:

这种方法可以轻松地扩展到密度均匀的任何复杂区域的采样:N个三角形,按概率与面积成比例的分类分布采样将为您选择三角形,然后在三角形中采样点。

更新

我们必须进行三角剖分,因为我们知道很好的算法(快速,可靠,仅2次RNG调用,...)以均匀的密度在三角形中进行采样。然后,我们可以在此基础上进行构建,好的软件是关于可重用性的,然后选择一个三角形(以另一个rng调用为代价),然后再从中进行采样,总共进行三个RNG调用,以从任意区域,凸面和凸面进行均匀密度采样凹一样。我会说相当通用的方法。三角剖分是一个解决的问题, 基本上,您只需执行一次(对权重数组A i / A total 进行三角化并构建)并采样到无穷大。

答案的另一部分是,我们(准确地说,但我从事了大约20年的随机抽样工作),不知道有一种好的算法可以从任意凸点(大于3个)中以均匀密度进行精确采样。顶点封闭多边形。您提出了一种基于预感的算法,但没有成功。而且它不起作用,因为您使用的是d+1单工中的Dirichlet distribution并将其投影回d超平面。它甚至不能扩展到四边形,也不能与任意凸多边形联系。我可以推测,即使存在这样的算法,n顶点多边形也需要对RNG进行n-1次调用,这意味着没有三角剖分设置,但是每次获取一个点的调用都会相当昂贵。

关于采样复杂度的几句话。假设您进行了三角剖分,然后对RNG进行3次调用,您将在多边形内部均匀采样一个点。 但是对三角形数目N采样的复杂度充其量为O(log(N))。您基本上会对A i / A 总计的部分和进行二进制搜索。

您可以做得更好,使用三角形的Alias sampling进行O(1)(恒定时间)采样。成本会增加一些设置时间,但可能会与三角剖分融合在一起。同样,这将需要再进行一次RNG调用。因此,对于四个RNG调用,您将获得恒定的点采样时间,而与多边形的复杂度无关,适用于任何形状

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...