【问题标题】:How to select points at a regular density如何以规则密度选择点
【发布时间】:2012-06-14 01:42:17
【问题描述】:

如何以常规密度选择点的子集?更正式地说,

给定

  1. 一组 A 不规则间隔的点,
  2. 距离度量dist(例如,欧几里得距离),
  3. 和目标密度d

如何选择满足以下条件的最小子集B

  • 对于 A 中的每个点 x
  • B中存在一个点y
  • 满足dist(x,y) <= d

我目前最好的选择是

  • A本身开始
  • 选出最接近(或特别接近)的几个点
  • 随机排除其中一个
  • 只要条件成立就重复

并重复整个过程以获得好运。但是有更好的方法吗?

我正在尝试使用 280,000 个 18-D 点来执行此操作,但我的问题是总体策略。所以我也想知道如何用二维点来做。而且我真的不需要最小子集的保证。欢迎任何有用的方法。谢谢。


自下而上的方法

  • 随机选择一个点
  • 在未选中的y 中进行选择,其中min(d(x,y) for x in selected) 最大
  • 继续前进!

我将其称为自下而上的,我最初发布的自上而下。这在开始时要快得多,所以对于稀疏采样,这应该会更好吗?

绩效衡量

如果不需要保证最优性,我认为这两个指标可能有用:

  • 覆盖范围:max {y in unselected} min(d(x,y) for x in selected)
  • 经济半径:min {y in selected != x} min(d(x,y) for x in selected)

RC 是允许的最小值d,这两者之间没有绝对的不平等。但RC <= RE 更可取。

我的小方法

为了稍微演示一下“性能测量”,我生成了 256 个二维点,这些点均匀分布或按标准正态分布分布。然后我用他们尝试了我的自上而下和自下而上的方法。这就是我得到的:

RC 是红色,RE 是蓝色。 X 轴是选定点的数量。你认为自下而上可以一样好吗?我是这么看动画的,但似乎自上而下的效果要好得多(看看稀疏区域)。不过,考虑到它要快得多,也不算太可怕。

这里我把所有东西都打包好了。

http://www.filehosting.org/file/details/352267/density_sampling.tar.gz

【问题讨论】:

  • 我看不出您的方法如何满足您提供的代码中所述的条件 (for every x in A there is an y in B such that dist(x, y) < d)。我也找不到您正在使用的 python h2 包。
  • 我的小方法是倒退——它创建对some d有效的选择。抱歉,h2 是我收集的可重用代码块……我不知道我使用了它。

标签: algorithm geometry selection subset sampling


【解决方案1】:

你可以用图来建模你的问题,假设点为节点,如果两个节点的距离小于d,则用边连接两个节点,现在你应该找到最小的顶点数,使得它们是它们的连接顶点覆盖了图的所有节点,这是minimum vertex cover problem(通常是 NP-Hard),但您可以使用快速 2 近似:重复将边的两个端点放入顶点覆盖,然后将它们从图表。

P.S:请确保您应该选择与图表完全断开连接的节点,删除此节点(意味着选择它们)后,您的问题是顶点覆盖。

【讨论】:

  • 是的,这个问题属于套路。但是在这个问题中,我们有一个普遍的性质,即如果 A 和 B 接近并且 B 和 C 接近,那么 A 和 C 往往接近。这就是为什么我认为可能有更好的方法。谢谢。
  • @h2kyeong,你怎么有这个属性?“如果 A 和 B 接近,B 和 C 接近,那么 A 和 C 往往接近”?假设 A 和 B 和 C 在直线上(第一个 A,第二个 B,然后是 C)和 ||A-B||=d, ||B-C||=d, but ||A-C|| = 2d。所以你不能假设你有这个属性,除非你在你的问题中明确提到它,在这种情况下问题太容易了。
  • 是的,例如欧式距离,上限为 2 d,下限为零。我并不是说它仅限于 d;但是 2 d 在比例上仍然很小。同时,距离函数可以为所有点对分配任意值,它仍然是顶点覆盖的子问题。
  • @h2kyeong,我不明白你的意思,如果你把limit设置为d你怎么说2d就可以了?
  • 我只是说许多距离函数远非随机。因此,我们对更快的解决方案比对顶点覆盖的解决方案更有希望。可悲的是,我了解到即使在高维度中挑选出最接近的一对也不是那么容易......
【解决方案2】:

遗传算法在这里可能会产生好的结果。

更新

我一直在玩这个问题,这些是我的发现:

获取满足所述条件的一组点的简单方法(称为随机选择)如下:

  1. B 开头为空
  2. 从A中随机选择一个点x,放到B中
  3. 从 A 中删除每个点 y 使得 dist(x, y)
  4. 当 A 不为空时转到 2

kd-tree 可用于相对快速地执行步骤 3 中的查找。

我在 2D 中运行的实验表明,生成的子集的大小大约是自上而下方法生成的子集的一半。

然后,我使用这种随机选择算法播种了一种遗传算法,使子集的大小进一步减少了 25%。

对于突变,给定一个代表子集 B 的染色体,我在最小的轴对齐超级框中随机选择一个超级球,该超级框覆盖了 A 中的所有点。然后,我从 B 中删除所有也在超级球中的点,然后使用随机选择再次完成。

对于交叉,我采用了类似的方法,使用随机超球来划分母亲和父亲染色体。

我已经使用 my wrapperGAUL 库在 Perl 中实现了所有内容(GAUL 可以从 here 获得。

脚本在这里:https://github.com/salva/p5-AI-GAUL/blob/master/examples/point_density.pl

它接受来自标准输入的 n 维点列表,并生成一组图片,显示遗传算法每次迭代的最佳解决方案。伴随脚本https://github.com/salva/p5-AI-GAUL/blob/master/examples/point_gen.pl可用于生成均匀分布的随机点。

【讨论】:

  • 您能详细说明一下吗?当然,当对问题领域一无所知时,向其抛出遗传算法始终是一种选择。
  • @Christian,是的,您可以使用位图来表示覆盖子集。作为加权函数,您可以使用位计数(覆盖子集中的点数),例如,对于繁殖,您可以混合两个位图,随机选择子串并修复它们以确保它们覆盖子集。
  • @Christian,实际上,我正在尝试编写一个完整的解决方案 :-)
  • 因此您将其视为设置封面问题。我希望你能找到好的育种/变异方法……尤其是育种。
【解决方案3】:

这是一个假设曼哈顿距离度量的提案:

  1. 将整个空间划分为粒度为 d 的网格。形式上:分区 A 使得点 (x1,...,xn) 和 (y1,...,yn) 恰好在 (floor(x1/d),...,floor(xn/d) 时位于同一分区中))=(地板(y1/d),...,地板(yn/d))。
  2. 从每个网格空间中选择一个点(任意)——即从步骤 1 中创建的分区中的每个集合中选择一个代表。如果某些网格空间为空,请不要担心!不要为这个空间选择代表。

实际上,实现不需要做任何实际工作来完成第一步,第二步可以通过点一次完成,使用分区标识符的哈希((floor(x1/d) ,...,floor(xn/d))) 来检查我们是否已经为特定的网格空间选择了一个代表,所以这可以非常非常快。

其他一些距离度量可能能够使用经过调整的方法。例如,欧几里得度量可以使用 d/sqrt(n) 大小的网格。在这种情况下,您可能需要添加一个后处理步骤,以尝试稍微减少覆盖范围(因为上述网格不再完全是半径 d 球——这些球与相邻网格有一点重叠),但我我不确定那部分会是什么样子。

【讨论】:

  • 对这种方法的一个简单改进是使用三角形网格而不是正方形网格。这样,球之间的重叠就会减少。
  • @salva 好吧,这对于 2D 欧几里得度量可能更好,尽管六边形会更好。但是 OP 似乎想要一个更高维度的东西——你是否碰巧知道 18 维平铺形状是什么? =)
  • 六边形网格和三角形网格是相同几何结构的两个视图。只需绘制一个六边形网格,然后连接相邻六边形的中心以找到其三角形等价物。关于更高维度,三角形/四面体泛化是simplex
【解决方案4】:

为了懒惰,这可以转换为集合覆盖问题,可以由混合整数问题求解器/优化器处理。这是 GLPK LP/MIP 求解器的 GNU MathProg 模型。这里C表示哪个点可以“满足”每个点。

param N, integer, > 0;
set C{1..N};

var x{i in 1..N}, binary;
s.t. cover{i in 1..N}: sum{j in C[i]} x[j] >= 1;
minimize goal: sum{i in 1..N} x[i];

对于正态分布的 1000 个点,它在 4 分钟内没有找到最佳子集,但它说它知道真正的最小值,它只选择了一个点。

【讨论】:

    猜你喜欢
    • 2022-07-18
    • 2016-07-07
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 2019-01-28
    • 2017-11-09
    • 2018-02-15
    • 2021-06-02
    相关资源
    最近更新 更多