什么时候KD树搜索KNN不起作用?

时间:2013-01-22 15:57:05

标签: machine-learning kdtree knn

我一直在探索和了解KNN的KD树(K Nearest Neighbors问题) 什么时候搜索不起作用?或者是否值得或不改善天真的搜索。 这种方法有什么缺点吗?

3 个答案:

答案 0 :(得分:3)

K-d树在高维度上不能很好地工作(你必须访问很多很多树枝)。 One rule of thumb如果您的数据维度为k,那么如果您的数据点数超过2^k,那么k-d树只会有任何好处。

在高维度中,您通常希望切换到近似最近邻搜索。如果你还没有遇到它,FLANNgithub)是一个非常有用的库(使用C,C ++,python和matlab API);它具有良好的k-d树实现,强力搜索和几种近似技术,它可以帮助您自动调整参数并轻松切换它们。

答案 1 :(得分:2)

这取决于您的距离功能。

您不能使用具有任意距离函数的k-d树。 Minkowski规范应该没问题。但是在很多应用程序中,您将需要使用更高级的距离函数。

另外,随着维数的增加,k-d-tree的效果也大打折扣。

原因很简单:kd-trees避免查看到边界的一维距离已经大于所需阈值的点,即欧几里德距离的位置(其中z是最近的边界,y是关闭的已知点) ):

(x_j - z_j)      <=>   sqrt(sum_i((x_i - y_i)^2))
equivalently, but cheaper:
(x_j - z_j)^2    <=>   sum_i((x_i - y_i)^2)

您可以想象,修剪规则持有的可能性随着维度的数量而急剧减少。如果你有100个维度,那么单个维度的平方差异就不会大于平方差的总和。

答案 2 :(得分:1)

knn的时间复杂度:O(k * lg(n))

其中k是k个最近的邻居,而lg(n)是kd树的高度

如果数据集的维数很大,那么

kd树将无法很好地工作。

考虑到您在原点周围有很多点,为简单起见,请考虑使用二维

enter image description here

如果要查找任意点的k个近邻,则必须沿4个轴搜索,因为所有点都彼此靠近,从而导致回溯到kd树中的其他轴,

因此,对于3维空间,我们必须沿8个方向搜索

要概括n维,它是2 ^ k

因此时间复杂度变为O(2 ^ k * lg(n))