【发布时间】:2013-01-05 22:12:39
【问题描述】:
我一直在探索和学习 KNN 的 KD 树(K 最近邻问题) 什么时候搜索不起作用?或者是否值得或不改进天真的搜索。 这种方法有什么缺点吗?
【问题讨论】:
标签: machine-learning kdtree knn
我一直在探索和学习 KNN 的 KD 树(K 最近邻问题) 什么时候搜索不起作用?或者是否值得或不改进天真的搜索。 这种方法有什么缺点吗?
【问题讨论】:
标签: machine-learning kdtree knn
K-d 树在高维度(您必须访问大量树枝)中效果不佳。 One rule of thumb 是,如果您的数据维度是 k,那么只有当您拥有比 2^k 更多的数据点时,k-d 树才会有任何好处。
在高维度中,您通常希望改用近似最近邻搜索。如果您还没有遇到过它,FLANN (github) 是一个非常有用的库(使用 C、C++、python 和 matlab API);它具有很好的 k-d 树、蛮力搜索和几种近似技术的实现,它可以帮助您自动调整它们的参数并轻松地在它们之间切换。
【讨论】:
这取决于你的距离函数。
您不能将 k-d-trees 与任意距离函数一起使用。闵可夫斯基规范应该没问题。但在很多应用中,您会希望使用更高级的距离函数。
此外,随着维数的增加,k-d-trees 的工作效果会越来越差。
原因很简单: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 个维度,那么单个维度的平方差几乎不可能大于平方差的总和。
【讨论】: