我一直在探索和了解KNN的KD树(K Nearest Neighbors问题) 什么时候搜索不起作用?或者是否值得或不改善天真的搜索。 这种方法有什么缺点吗?
答案 0 :(得分:3)
K-d树在高维度上不能很好地工作(你必须访问很多很多树枝)。 One rule of thumb如果您的数据维度为k
,那么如果您的数据点数超过2^k
,那么k-d树只会有任何好处。
在高维度中,您通常希望切换到近似最近邻搜索。如果你还没有遇到它,FLANN(github)是一个非常有用的库(使用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)