【问题标题】:how to sort numeric vectors?如何对数字向量进行排序?
【发布时间】:2009-07-13 04:55:32
【问题描述】:

现在,有很多有序的数字向量(大约 50 维)。每个维度都是0~200之间的整数。 我想对它们进行排序以确保同一个桶中的相似向量,相邻桶中的所有向量也具有一定的相似性。 例如 和 应该在同一个桶中(桶号为 010),但 和 (它们也在同一个桶中)在相邻的桶中(桶号为011)

如何设计这样的排序功能?

【问题讨论】:

  • 请解释第二对向量的“相似性”。我可以看到第一对在三个维度上是相同的,你在乎哪三个?您是否期望 也会散列到 10?
  • 也许这个例子不好。我希望的相似之处是两个向量之间的角度余弦很小。实际上,我想将文本转换为向量,其中每个维度对应于文本中的一个概念。我想所有文本都具有相同数量的概念,因此它们的向量维度相同。

标签: sorting indexing vector


【解决方案1】:

你想要一个Morton code。它交错每个维度的位,以帮助将相似的值保持在一起。它通常用于 2D 和 3D,但它适用于任何维度。

将每个 D 值表示为 B 位的二进制字,然后将这些位交错以形成一个新的 D*B 位长数。那是您的查找表编号。如果您想要更小的数字,请丢弃较低的位以获得更少的 bin。

一个更好(但计算起来更烦人)的函数是 multidimensional Hilbert curve mapping. 这在实践中很难使用,但它确实具有您可以获得的最佳索引位置。

【讨论】:

  • 我一直在使用这种空间填充曲线,但不知道它叫什么(或者它已经被发明了)。谢谢。
【解决方案2】:

听起来您正在尝试按位置对向量进行排序。

也许您真正想要的是四叉树的概括。如果每个长度为 R 的向量被认为是 R 空间中的一个坐标(R==2 -> 2d 平面空间,r==3 -> 3d 空间等),那么您可以将该 R 立方体沿每个维度分成两半, 得到 2R 个内部 R-超立方体。只要一个立方体包含超过 1 个不相等的坐标,就继续这个过程。然后,您可以遍历这棵 R-超立方体树,以有效地定位相邻向量。

【讨论】:

  • 但是为了构造 R-超立方体,需要计算任意两个向量之间的相似度/距离吗?大量向量非常耗时。
  • 您不计算距离,您将空间划分为每个 n 个向量的至少 n 个超立方体。您分别对每个维度进行比较。
【解决方案3】:

你所描述的并不像正常意义上的“好”散列函数。

您能否更具体地说明如何从这些特定序列中获得这些桶号(010、011)?您的哈希函数基本上将是相同的过程。

【讨论】:

    【解决方案4】:

    您想要的几乎与哈希完全相反:对于哈希,您希望避免相似的值最终出现在同一个存储桶中。

    您似乎正在寻找spatial index; R-Trees 听起来最有前途。

    【讨论】:

      【解决方案5】:

      听起来像点聚类。这是一个非常活跃的领域。尝试谷歌搜索“向量量化”、k-means 聚类、树状图......

      【讨论】:

      • 我知道这就像集群,但是集群很耗时。并且系统中的向量数量是动态的。系统中可能插入了 1000 多个新向量。所以集群必须重做。
      【解决方案6】:

      也许这个例子不好。我希望的相似之处是两个向量之间的角度余弦很小。实际上,我想将文本转换为向量,其中每个维度对应于文本中的一个概念。我想所有文本都具有相同数量的概念,因此它们的向量维度相同。 – 曲奇

      我假设你的意思是余弦接近 1,所以它们都接近同一个方向。接近于零的余弦意味着角度大约是正交的。

      顺便说一句,如果你这样做,那么这意味着(1,2,3,4,5)和(10,20,30,40,49)应该非常接近(尽管实际数字相差甚远)。因此,您希望在使用任何空间索引方法之前对向量进行归一化。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-15
        • 2011-12-12
        • 1970-01-01
        • 1970-01-01
        • 2018-09-15
        • 2016-04-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多