现在,有许多有序的数字向量(大约50维)。每个维度是0到200之间的整数。 我想对它们进行排序以确保相同桶中的相似向量,相邻桶中的所有向量在一定程度上也具有相似性。 例如< 1,24,25,78,9>和< 2,24,24,78,9>应该在同一个桶中(桶号是010),但是< 3,29,26,74,11>和< 4,28,29,75,10> (它们也在同一个桶中)位于相邻的桶中(桶号为011)
如何设计这样的排序功能?
答案 0 :(得分:2)
你想要一个Morton code。它交织每个维度的位以帮助将类似的值保持在一起。它通常用于2和3D,但它适用于任何维度。
将每个D值表示为B位的二进制字,然后对这些位进行交织以形成新的D * B位长数。那是你的查询表号。如果你想要一个较小的数字,丢弃较低的位以获得更少的垃圾箱。
更好(但计算起来更烦人)函数是multidimensional Hilbert curve mapping.这在实践中非常难以使用,但它确实具有您可以获得的最佳索引位置。
答案 1 :(得分:1)
听起来你正试图按地点对你的向量进行排序。
也许你真正想要的是QuadTree的概括。如果长度为R的每个向量被认为是R空间中的坐标(R == 2 - > 2d平面空间,r == 3 - > 3d空间等),则可以将该R立方体分成两半每个维度,得到2个 R 内部R-hyper立方体。每当一个立方体包含多于1个不相等的坐标时,继续此过程。然后,您可以遍历此R超立方体树以有效地定位相邻矢量。
答案 2 :(得分:0)
你所描述的并不像通常意义上的“好”散列函数。
您能否更具体地了解如何从这些特定序列到那些桶号(010,011)?你的哈希函数基本上就是同一个过程。
答案 3 :(得分:0)
你想要的几乎与哈希完全相反:对于哈希,你希望避免具有相似的值最终在同一个桶中。
好像你正在寻找spatial index; R-Trees听起来最有希望。
答案 4 :(得分:0)
听起来像点聚类。这是一个非常活跃的领域。尝试谷歌搜索“矢量量化”,k-means聚类,树状图,...
答案 5 :(得分:0)
也许这个例子并不好。我希望的相似性是两个矢量之间的角度的余弦很小。实际上,我想将文本转换为向量,其中每个维度对应于文本中的概念。我想所有文本都有相同数量的概念,因此它们的向量维度是相同的。 - 煮熟
我认为你的意思是余弦接近1,所以它们都接近同一个方向。余弦接近零意味着角度大约是正交的。
顺便说一句,如果你这样做,那就意味着,(1,2,3,4,5)和(10,20,30,40,49)应该非常接近(尽管实际数字相距甚远)。因此,您希望在使用任何空间索引方法之前规范化矢量。