用于合并矢量的快速数据结构“不关心”"

时间:2016-08-08 19:42:02

标签: algorithm vector time-complexity cluster-analysis

我有一个相当大的n维向量集合,其整数坐标(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 *]

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

通过成对地比较所有向量并匹配匹配的向量,然后重复这一步直到所有向量都被聚类,这当然是可能的。另一个选项(我们当前正在使用的那个)是从它自己的集群中的第一个向量开始,然后对每个向量进行检查,以检查它是否与任何现有集群匹配,或者它是否需要进入自己的集群。这些方法要么是二次方,要么是在时间上与矢量数乘以簇的数量成正比,这对我们的应用来说还不够快。

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

1 个答案:

答案 0 :(得分:2)

所以看起来这个问题是 NP - 硬 - 不仅是 NP - 硬,它是 NP <之一< / strong> - 可能很难得到大致答案的严重问题。

为了说明这一点,这里有一个快速减少色数问题(给出一个图表,它是什么颜色所需的最小颜色数?)到这个问题。我将以一个例子来说明。想象一下,我们有这个图:

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

我将从这个图表开始,并形成一组向量,而不是关心&#34;&#34;&#34;这样每个簇对应一组节点,它们之间没有边缘运行(一个独立的集合)。总的来说,每个聚类代表一组可以给出相同颜色的节点,因此找到最小聚类对应于找到图的色数。

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

[ 0 1 * 1 * * ]

矢量的列按顺序指节点A,B,C,D,E和F.A列中的0表示&#34;这是A的矢量。&#34; B和D列中的1表示&#34;从该节点到节点B和D的边缘。&#34;其他列中的*表示&#34;此节点与其他节点之间没有任何边缘运行。&#34;如果我们为图中的所有节点形成一组向量,我们将得到:

     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颜色为2色,B,D和F为另一种颜色。如果我们查看向量,它们可以聚类成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 - 硬,并且没有已知的近似算法甚至接近常数因子近似。因此,除非 P = NP ,否则我所描述的原始问题可能没有良好的近似算法。

我需要解决的问题的特殊情况可能更容易近似,因此我可能会发布一个后续问题,详细说明我尝试做的事情。