kdtree是否用于加速k-means聚类?

时间:2013-12-14 20:13:39

标签: python cluster-analysis k-means kdtree

我正在使用k-means做一个项目,我的教授建议使用kdtree。我在python中发现了kdtree的这个实现(我知道也有scipy,但我找不到任何示例实现)。我的问题与tittle一样,是用kdtree来加速k-means,还是我错了?

data = [(2,2),(1,0),(2,3),(10,5),(59,8),(4,2)]

tree = KDTree.construct_from_data(data)
nearest = tree.query(query_point=(5,4), t=3)
print nearest

输出:

[(4, 2), (2, 3), (2, 2)]

2 个答案:

答案 0 :(得分:3)

正如"Making k-means even faster", p 137,论文所示,kd-tree 可以用于k意味着算法加速低维数据,而直接的Lloyd算法对于更高维度更有效。

  

对于高维数据,诸如k-d树之类的索引方案效果不佳

见纸上的解释。

我建议您使用已建立的k-means实现之一,并且只有在遇到严重问题时才会担心速度提升。例如,afaik,sklearn的KMeans基于Lloyd的原始算法。

答案 1 :(得分:1)

可以使用,但它非常重要。大多数人只实施直接的非加速解决方案。

问题是大多数kd-tree实现只支持最近邻居查询。

如果你有大量的群集k ,这只会得到回报,并在群集上构建索引。

对于完整的kd-tree-k-means加速,您需要实现二分NN-join ,其中您将拥有点和集群中心的索引。我不知道任何支持这种情况的kd-tree实现。