【问题标题】:Find a subset of k most distant point each other找到彼此最远的k个点的子集
【发布时间】:2017-07-15 20:02:36
【问题描述】:

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

【问题讨论】:

  • 您是否有一个特定的目标函数,其共域是完全有序的? ​(例如,你知道你更喜欢距离[1,3,5]还是[2,3,4]?)​​​​​​
  • 不,我没有特定的目标函数:只是我想选择这 k 个点,使它们彼此最远。我最初认为是一种朴素的方法,但不幸的是它效果不佳:我只是将距离另一个点最远的点视为起点,然后我找到离该点最远的点,然后我再次计算剩余点与这两个点的距离,取平均值,然后选择与我已经选择的两个点具有最大平均距离的点,这对于所有剩余点,直到我到达 k。

标签: algorithm


【解决方案1】:

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

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

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

为此,我将使用长度为 kn(n-1)/2 的位向量,其中 k 将随 n 增长,因此位向量的长度可能与 O(n^3) 一样多。我可以摆脱这个,因为这仍然只是 n 中的多项式。我将每个位向量分成 n(n-1)/2 个长度为 k 的字段,其中每个字段负责表示两点之间的连接或缺乏连接。我声称存在一组长度为 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。

【讨论】:

  • 我认为您的想法总体上是正确的,但是,对于每个点都是二进制字符串并且度量是汉明距离的问题,您认为您的构造/想法仍然有效吗?
  • 是的,我可能忽略了原始图是完整的:对于每一对点都存在一条连接这两个点的弧,我想要的是:从所有可能的 k-cliques 中选择一个它们使得连接集团顶点的弧的权重之和(即距离)尽可能最大。然而,NP 完全吗?
  • @Petar 你很正确地发现我错过了这个,但我认为问题是可以修补的,我已经编辑了我的答案以尝试修补它。
  • @Dario 我认为我的(修改后的)答案表明,如果您在所有情况下都需要一个准确的答案,包括距离都非常相似且 k 随问题大小。当然,对于固定 k,尝试所有派系的蛮力解决方案是成本 O(n^k) 左右,至少在理论上是多项式时间。
  • @mcdowella,我想我可能没有很好地解释我的问题。
【解决方案2】:

@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 添加到我的子图中,因为它以更统一的方式与其他两个相距甚远。 我希望现在我的问题很清楚。 你认为你的提法已经正确了吗?

【讨论】:

  • 我已经回答了您的问题“这是一个 NP 难题吗?”我已经证明了这一点,通过展示一个完全解决了你的问题的程序可以用来寻找派系。寻找 clique 是一个 NP-hard 问题,因此这表明您的问题至少与 clique 一样难。由于它是 NP 难的,因此您最好的选择是寻找某种启发式解决方案或近似值。我刚刚添加了另一个示例,用于尝试最大化 k 点之间的距离总和的情况。我知道这可能不是您想要的,但我看不出您到底想要什么。
【解决方案3】:

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

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

这从它的聚类前身继承了以下属性,这可能至少对测试有用:如果可以将点划分为 k 个类,使得同一类中任意两个点之间的距离总是小于它们之间的距离那么,不同类别中的任意两个点,当您发现无法进行局部改进的 k 点时,这些 k 点应该都来自不同的类别(因为如果不是,则从同一类别中换出一对点中的一个会增加它们之间的距离总和)。

【讨论】:

    猜你喜欢
    • 2010-10-03
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多