找到k个最远点的子集

时间:2017-07-13 23:09:35

标签: algorithm

我有一组N个点(特别是这个点是二进制字符串),并且对于它们中的每个我都有一个离散度量(汉明距离),这样给定两个点,i和j,Dij是两个点之间的距离。第i和第j点。 我想找到k个元素的子集(当然k 2时我怎么能概括这个问题呢? 有什么建议?这是一个NP难题吗? 谢谢你的回答

3 个答案:

答案 0 :(得分:0)

一个概括是“找到k点,使得这些k点中任意两点之间的最小距离尽可能大”。

不幸的是,我认为这很难,因为我认为如果你能有效地做到这一点,你就能有效地找到派系。假设有人给你一个距离矩阵,并要求你找到一个k-clique。创建另一个矩阵,其中条目1表示原始矩阵具有无穷大,条目1000000表示原始矩阵具有任何有限距离。现在新矩阵中的一组k点,其中该组中任意两点之间的最小距离为1000000,对应于原始矩阵中的一组k点,它们彼此相连 - 一个集团。

这种结构没有考虑到这些点对应于位向量并且它们之间的距离是汉明距离的事实,但我认为它可以扩展到应对这一点。为了表明能够解决原始问题的程序可以用于查找派系,我需要证明,给定一个邻接矩阵,我可以为每个点构造一个位向量,以便在图中连接点对,等等在邻接矩阵中具有1,彼此之间的距离大致为A,并且在图中未连接的点对彼此相距距离B,其中A> 1。 B.注意A可能与B非常接近。实际上,三角不等式将迫使这种情况发生。一旦我显示了这一点,k在彼此的距离A处全部指向(并且距离A最小,并且k(k-1)A / 2的距离之和)将对应于一个集团,因此找到这样的程序积分会找到派系。

为此,我将使用长度为kn(n-1)/ 2的位向量,其中k将随n增长,因此位向量的长度可以与O(n ^ 3)一样多。我可以逃脱这个因为这仍然只是n中的多项式。我将每个位向量分成长度为k的n(n-1)/ 2个字段,其中每个字段负责表示两个点之间的连接或缺少连接。我声称存在一组长度为k的位向量,使得这些k长位向量之间的所有距离大致相同,除了它们中的两个比其他位置更接近。我还声称有一组长度为k的位向量,因此它们之间的所有距离大致相同,只是它们中的两个比其他位置更远。通过在这两个不同的集合之间进行选择,并通过将更近或更多的对分配给拥有位向量内的n(n-1)/ 2个字段的当前位字段的两个点,可以创建一组位 - 具有所需距离模式的向量。

我认为这些存在是因为我认为有一种结构可以创造出很高概率的模式。创建n个长度为k的随机位向量。任何两个这样的位向量具有预期的汉明距离k / 2,方差为k / 4,因此标准偏差为sqrt(k)/ 2。对于大k,我们期望不同的距离合理相似。要在此集合中创建两个非常接近的点,请将另一个点复制到另一个点。要创建相距很远的两个点,请将一个不是另一个点(一个中的0,另一个中有1,反之亦然)。

给定任意两点它们彼此的预期距离将是(n(n-1)/ 2 -1)k / 2 + k(如果它们应该相距很远)和(n(n-1) / 2 -1)k / 2(如果它们应该靠近在一起)并且我声称没有证据表明通过使k足够大,预期的差异将胜过随机变化,我将获得相当多的A和漂亮的距离我需要的很多B.

答案 1 :(得分:0)

@mcdowella,我想我可能不会很好地解释我的问题。 在我的问题中,我有二进制字符串,对于每一个我可以使用汉明距离计算到另一个的距离 以这种方式,我具有距离矩阵D,其在每个元素D(i,j)中具有有限值。 我可以看到这个距离矩阵像一个图形:事实上,每一行都是图形中的一个顶点,而在列中我有将顶点Vi连接到顶点Vj的弧的权重。 由于我解释的原因,这张图是完整的,它本身就是一个集团。 因此,如果我从原始图中随机选择k个顶点,我会得到一个也完整的子图。 从订单k的所有可能子图中我想选择最好的子图。 什么是最好的?是一个图形,使得顶点之间的距离尽可能大但也尽可能均匀。 假设我的子图中有两个顶点v1和v2,它们的距离是25,我还有另外三个顶点v3,v4,v5,这样 d(v1,v3)= 24,d(v1,v4)= 7,d(v2,v3)= 5,d(v2,v4)= 22,d(v1,v5)= 14,d(v1,v5 )= 14

对于这些距离,我认为v3离v1太远但非常靠近v2,而v4的情况与v2相差太远,但接近v1。 相反,我更喜欢将顶点v5添加到我的子图中,因为它以更均匀的方式远离其他两个。 我希望现在我的问题很清楚了。 您认为您的配方已经正确吗?

答案 2 :(得分:0)

我声称找到k点的问题使得这些点之间的最小距离或这些点之间的距离之和尽可能大是NP完全的,所以没有多项式时间精确答案。这表明我们应该寻找某种启发式解决方案,所以这里有一个,基于聚类的想法。我将描述它以最大化总距离。我认为它也可以用于最大化最小距离,也许可以用于其他目标。

选择k个任意点并记下每个点到其他点的距离之和。对于数据中的每个其他点,查看与k个选定点的距离之和,并查看是否用该点替换任何选定点将增加总和。如果是这样,请替换最多增加总和的点并继续。继续尝试,直到没有一个点可用于增加总和。这只是一个局部最优,所以重复另一组k任意/随机点,希望找到一个更好的,直到你厌倦。

这继承了它的聚类前辈下面的属性,这可能至少对测试有用:如果点可以分为k个类,使得同一个类中任意两个点之间的距离总是小于两个点之间的距离然后,当你找到k点而不能进行局部改进时,这些k点应该来自不同的类(因为如果没有,从同一个类中交换一对点中的一个会增加它们之间的距离之和)。