如何选择常规密度的点

时间:2012-06-11 06:19:42

标签: algorithm geometry selection subset sampling

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

鉴于

  1. 一组 A 不规则间隔点
  2. 距离dist的度量标准(例如,欧几里德距离),
  3. 和目标密度 d
  4. 如何选择满足以下条件的最小子集 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个均匀分布的2-D点或标准正态分布。然后我用它们尝试了自上而下和自下而上的方法。这就是我得到的:

    bottom-up.norm top-down.norm

    RC为红色,RE为蓝色。 X轴是所选点的数量。你认为自下而上可以做得好吗?我是这么看动画,但似乎自上而下明显更好(看看稀疏区域)。尽管如此,并不是太可怕,因为它更快。

    我把所有东西收拾好。

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

4 个答案:

答案 0 :(得分:3)

您可以使用图形建模您的问题,将点视为节点,如果距离小于 d ,则将两个节点与边连接,现在您应该找到最小的顶点数,使它们成为连接顶点覆盖图的所有节点,这是minimum vertex cover problem(一般是NP-Hard),但你可以使用快速2近似:重复将边的两个端点带入顶点覆盖,然后去除他们来自图表。

P.S:确定你应该选择与图完全断开的节点。删除这些节点后(意味着选择它们),你的问题就是顶点覆盖。

答案 1 :(得分:2)

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

<强>更新

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

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

  1. 以B empty开头
  2. 从A中选择一个随机点x并将其放在B
  3. 从每个点y移除A,使得dist(x,y)< d
  4. 虽然A不为空,但请转到2
  5. kd-tree可用于相对快速地执行步骤3中的查找。

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

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

    有关突变,使表示一个子集B中的染色体,我随机选择一个覆盖A.所有点然后最小轴对齐双曲盒内部的超球,我从乙除去所有也都在超球的点和使用随机选择再次完成它。

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

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

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

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

答案 2 :(得分:1)

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

  1. 将整个空间划分为粒度网格d。形式上:分区A使得(x1,...,xn)和(y1,...,yn)在(floor(x1 / d),...,floor(xn / d)时完全位于同一分区中))=(地板(Y1 / d),...,地板(YN / d))。
  2. 从每个网格空间中选择一个点(任意) - 即,从步骤1中创建的分区中的每个集合中选择一个代表。如果某些网格空间为空,请不要担心!只是不要选择这个空间的代表。
  3. 实际上,实现不需要做任何实际的工作来完成第一步,而第二步可以通过点一次完成,使用分区标识符的散列((floor(x1 / d)) ,...,floor(xn / d)))检查我们是否已经选择了特定网格空间的代表,这样可以非常非常快。

    其他一些距离指标可能能够使用适应的方法。例如,欧几里德度量可以使用d / sqrt(n)-size网格。在这种情况下,你可能想要添加一个后处理步骤,试图稍微减少覆盖(因为上面描述的网格不再是半径d球 - 球稍微重叠相邻的网格),但是我我不确定那部分会是什么样子。

答案 3 :(得分:0)

懒惰,这可以转换为集合覆盖问题,可以通过混合整数问题求解器/优化器来处理。这是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分钟内没有找到最佳子集,但它表示它知道真正的最小值并且只选择了一个点。