是否可以使用具有余弦相似度的 KDTree?

Is it possible to use KDTree with cosine similarity?

看起来我不能将此相似性度量用于 sklearn KDTree,例如,但我需要,因为我正在使用测量词向量相似性。这种情况下的快速稳健定制算法是什么?我知道 Local Sensitivity Hashing,但它应该经过大量调整和测试才能找到参数。

余弦相似度排序相当于先对所有数据点进行归一化后的欧式距离排序。因此,您可以将 KD 树用于 KDTrees 的 k 最近邻,但您需要重新计算余弦相似度。

余弦相似度不是通常呈现的距离度量,但可以转化为距离度量。如果完成,则可以使用其他结构(如 Ball Trees)直接使用余弦相似度进行加速 nn。如果您对 Java 实现感兴趣,我已经在 JSAT 库中实现了它。

根据 table at the end of this page, cosine support eoth k-d-tree should be possible: ELKI 支持与 R-tree 的余弦,您也可以为 k-d-tree 导出边界矩形;并且 k-d-tree 在 table 中支持至少五个指标。所以我不明白为什么它不应该工作。 不幸的是,sklearn 中的索引支持通常不是很完整(尽管有所改进);所以不要以此为参考。

而k-d-tree理论上可以支持余弦

  • 转换数据,使余弦成为欧氏距离
  • 使用边界框和边界框的最小角度(这似乎是 ELKI 正在为 R 树所做的)

您应该知道 k-d-tree 不能很好地处理高维数据,余弦最常用于非常高维的数据。 k-d-tree 总是只关注一个维度。如果你想让所有的 d 维度都被使用一次,你需要 O(2^d) 个数据点。对于高 d,没有办法使用所有属性。 R 树在这里稍微好一点,因为它使用了边界框;这些随着所有维度的每次分裂而缩小,因此修剪确实变得更好。但这也意味着它需要大量内存来存储这些数据,而树的构造可能会遇到同样的问题。 所以本质上,不要将任何一个用于高维数据。

但也不要假设余弦会神奇地改善您的结果,尤其是对于高维数据。它被高估了。如上变换所示,不能 余弦优于欧几里德的系统优势:余弦是欧几里德的特例。

对于稀疏数据,倒排列表(c.f。Lucene,Xapian,Solr,...)是余弦索引的方式。