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

时间:2016-12-12 17:00:16

标签: machine-learning scikit-learn cluster-analysis

例如,我似乎无法将此相似性指标与sklearn KDTree一起使用,但我需要因为我正在使用测量单词矢量相似度。对于这种情况,什么是快速强大的自定义算法?我知道Local Sensitivity Hashing,但它应该调整&测试了很多以寻找params。

2 个答案:

答案 0 :(得分:2)

当您首先对所有数据点进行标准化时,您使用余弦相似性获得的排名等同于欧几里德距离的排名顺序。因此,您可以使用KD树到KDTrees的k个最近邻居,但是您需要重新计算余弦相似度。

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

答案 1 :(得分:1)

根据table at the end of this page,余弦支持k-d-tree应该是可能的:ELKI支持带有R树的余弦,你也可以为k-d树推导出边界矩形;并且k-d-tree支持该表中的至少五个度量。所以我不明白它为什么不起作用。 不幸的是,sklearn中的索引支持通常不是很完整(尽管有所改进);所以不要把它作为参考。

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

  • 转换数据,使余弦成为欧几里德距离
  • 使用边界框和边界框的最小角度(看起来是ELKI为R树做的事情)

你应该知道k-d-tree对于高维数据不能很好地工作,并且余弦最常用于非常高维数据。 k-d树总是只看一个维度。如果您希望所有d维使用一次,则需要O(2 ^ d)个数据点。对于高d,没有办法使用所有属性。 R树在这里略胜一筹,因为它使用了边界框;这些在所有尺寸上都会随着每次分割而缩小,因此修剪确实会变得更好。但这也意味着它需要大量内存来存储此类数据,并且树构造可能会遇到同样的问题。 所以从本质上讲,不要用于高维数据。

但也不要认为Cosine会神奇地改善你的结果,特别是对于高d数据。它被高估了。正如上面的转换所表明的那样,不能成为余弦对欧几里得的系统利益:余弦是欧几里德的一个特例。

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