【问题标题】:Fast data structure for merging vectors with "don't cares?"用于将向量与“无关”合并的快速数据结构?
【发布时间】:2016-08-12 02:28:19
【问题描述】:

我有一个相当大的 n d 维向量集合,其中包含整数坐标(d 约为 50),但在某些情况下,坐标是一个特殊的“无关”值,我将用它来表示*。我正在尝试找到一种有效的算法来将所有比较相等的向量合并在一起,其中“相等”表示“向量中的每一对坐标都匹配,假设 * 条目可以匹配任何内容。”例如,给定这些行向量:

[* 1 2 * *]
[1 1 * 2 *]
[2 1 3 * 1]
[2 * 3 * *]
[1 * 3 4 *]

我们会将它们分成这些集群:

[* 1 2 * *], [1 1 * 2 *]
[2 1 3 * *], [2 * 3 * *]
[1 * 3 4 *]

要求是所有簇都需要其中的所有向量成对等效。有可能有很多方法可以将符合这些标准的事物聚集在一起,因此对于“不太多”的一些松散定义,应该有“不太多”的集群。

当然可以通过成对比较所有向量并将匹配的向量配对,然后重复此操作,直到所有向量都聚集在一起。另一种选择(我们当前使用的)是从其自己的集群中的第一个向量开始,然后为每个向量检查它是否与任何现有集群匹配,或者是否需要进入自己的集群。这些方法要么是二次方的,要么运行时间与向量数量乘以集群数量的乘积成正比,这对于我们的应用程序来说还不够快。

有没有解决这个特定问题的有效算法?

【问题讨论】:

  • 你有关于整数坐标范围的一些信息吗?还有关于什么是“相当大”?
  • 向量的数量在几十万,整数坐标的范围大致在几万到几十万。
  • 有一点我不清楚:V1 可以匹配 V2,V2 可以匹配 V3,但 V1 可能不匹配 V3。那么,这里是否有一些选择可以做,例如最小化向量组(并且每个向量只属于一个组)?或者你想在这个例子中有 2 个组 (V1, V2) 和 (V2, V3) 吗?
  • 好问题!每个向量都必须属于一个组。
  • 所以我们的目标是尽量减少组的数量,或者只是“顺其自然”?

标签: algorithm vector time-complexity cluster-analysis


【解决方案1】:

所以看起来这个问题是 NP-hard - 不仅是 NP-hard,它还是 NP- 之一可能很难得到大致答案的难题。

为了说明这一点,这里有一个从色数问题(给定图表,着色所需的最少颜色数是多少?)到这个问题的快速简化。我将举例说明。想象一下我们有这个图表:

   A -- B -- C
   |    |    |
   D -- E -- F

我将从这个图开始,并形成一组“不关心”的向量,这样每个集群对应于一组节点,它们之间没有运行边(一个独立的集合)。总体而言,每个聚类将代表一组可以被赋予相同颜色的节点,因此找到最小聚类对应于找到图形的色数。

由于图中有六个节点,每个向量将有六个分量。我们将在图中的每个节点形成一个向量。例如,节点 A 的向量将是

[ 0 1 * 1 * * ]

向量的各列,依次指代节点A、B、C、D、E、F。A列中的0表示“这是A的向量”。 B 和 D 列中的 1 表示“从该节点到节点 B 和 D 有边”。其他列中的 * 表示“在此节点和其他节点之间没有运行任何边”。如果我们为图中的所有节点形成一组向量,我们将得到:

     A B C D E F
A: [ 0 1 * 1 * * ]
B: [ 1 0 1 * 1 * ]
C: [ * 1 0 * * 1 ]
D: [ 1 * * 0 1 * ]
E: [ * 1 * 1 0 1 ]
F: [ * * 1 * 1 0 ]

现在,想象一下尝试对这些向量进行聚类。请注意,如果您取任意两个相邻节点(例如 B 和 E),它们的向量不匹配,因为 B 向量在 B 列中有 0,而 E 向量在 B 列中有 1。但是,如果您采用任何不相邻的节点,那么它们将匹配,因为

  • 节点本身的列将在一个向量中包含 0,在另一个向量中包含 *,因为每个向量都标有它所在的节点,并且它们之间没有边,并且
  • 每个向量中的每一列都是 1 或 *。

总体而言,这意味着向量集群对应于在它们之间没有边运行的节点集合,因此找到最小集群可以为图着色。在这种情况下,请注意原始图形可以通过将 A、C 和 E 设为相同颜色而将 B、D 和 F 设为另一种颜色来进行 2 着色。如果我们查看向量,它们可以聚类为 A、C 和 E 以及 B、D 和 F:

     A B C D E F
A: [ 0 1 * 1 * * ]
C: [ * 1 0 * * 1 ]
E: [ * 1 * 1 0 1 ]

B: [ 1 0 1 * 1 * ]
D: [ 1 * * 0 1 * ]
F: [ * * 1 * 1 0 ]

更一般地,给定一个具有 n 个节点的图,形成这种形式的 n 个向量,其中每个向量对应一个节点,该节点的列中为 0,每个相邻节点的列中为 1,以及* 在所有其他列中。然后最小的簇数对应于原始图的色数,这种减少可以在多项式时间内完成。

问题在于找到图的最小色数的问题是 NP-hard 并且没有已知的近似算法可以接近常数因子近似。因此,除非P = NP,否则我描述的原始问题可能没有好的近似算法。

我需要解决的问题的特殊情况可能更容易近似,所以我可能会发布一个后续问题,其中包含我正在尝试做的更多细节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-01
    • 2011-04-09
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 2015-05-22
    相关资源
    最近更新 更多