如何以常规密度选择点子集?更正式的,
鉴于
dist
的度量标准(例如,欧几里德距离),如何选择满足以下条件的最小子集 B ?
dist(x,y) <= d
我目前最好的拍摄是
并重复整个程序以获得最佳运气。但有更好的方法吗?
我试图用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点或标准正态分布。然后我用它们尝试了自上而下和自下而上的方法。这就是我得到的:
RC为红色,RE为蓝色。 X轴是所选点的数量。你认为自下而上可以做得好吗?我是这么看动画,但似乎自上而下明显更好(看看稀疏区域)。尽管如此,并不是太可怕,因为它更快。
我把所有东西收拾好。
http://www.filehosting.org/file/details/352267/density_sampling.tar.gz
答案 0 :(得分:3)
您可以使用图形建模您的问题,将点视为节点,如果距离小于 d ,则将两个节点与边连接,现在您应该找到最小的顶点数,使它们成为连接顶点覆盖图的所有节点,这是minimum vertex cover problem(一般是NP-Hard),但你可以使用快速2近似:重复将边的两个端点带入顶点覆盖,然后去除他们来自图表。
P.S:确定你应该选择与图完全断开的节点。删除这些节点后(意味着选择它们),你的问题就是顶点覆盖。
答案 1 :(得分:2)
遗传算法可能会在这里产生良好的结果。
<强>更新强>:
我一直在玩这个问题,这些是我的发现:
一种简单的方法(称之为随机选择)以获得满足所述条件的一组点如下:
kd-tree可用于相对快速地执行步骤3中的查找。
我在2D中运行的实验表明,生成的子集大约是自上而下方法生成的子集的一半。
然后我使用这种随机选择算法来种子遗传算法,导致子集大小进一步减少25%。
有关突变,使表示一个子集B中的染色体,我随机选择一个覆盖A.所有点然后最小轴对齐双曲盒内部的超球,我从乙除去所有也都在超球的点和使用随机选择再次完成它。
对于交叉,我采用了类似的方法,使用随机超球来划分母亲和父亲的染色体。
我使用my wrapper为GAUL库实现了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)
这是一个假设曼哈顿距离度量的提案:
实际上,实现不需要做任何实际的工作来完成第一步,而第二步可以通过点一次完成,使用分区标识符的散列((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分钟内没有找到最佳子集,但它表示它知道真正的最小值并且只选择了一个点。