【问题标题】:Ordering the n-1 nearest neighbours for each of n data points为 n 个数据点中的每一个排序 n-1 个最近邻
【发布时间】:2019-03-09 14:33:24
【问题描述】:

假设我们在数据集中有 n 个数据点。对于给定的点,我们可以根据到该点的(度量)距离对其他 n-1 个点进行排序。

如果我们有一个度量距离函数(例如 L 范数),那么为数据集中的每个点计算此值的最有效方法是什么?

天真的方法似乎是依次对每个点的距离列表进行排序,每个点的成本为 O(n log n),即所有点的 O(n^2 log n)。考虑到每次都必须遍历完整的树,使用 k-d 树似乎并没有更好。

例如,有没有更好的方法可以利用三角不等式?

【问题讨论】:

  • 我认为您理解正确。 O(n^2 log n)。但是如果我理解正确的话,这里不能使用简单的 BST 吗?
  • 也许 O(n^2 log n) 对于获取包含 n^2 项的序列的成本并不太高

标签: algorithm sorting data-structures nearest-neighbor kdtree


【解决方案1】:

由于您的输出为 O(n^2),您将无法获得比这更好的结果。

我认为这归结为您可以根据到点 q 的距离对所有其他点进行排序的速度。如果您有索引结构(例如,KD-Tree 或 R-Tree),您可以使用 distance browsing 对所有其他点进行排序 w.r.t。问。

距离浏览的基本思想是有一个优先队列 pq,它的条目按到 q 的最小距离排序。 pq 可以包含索引结构的点和条目。首先将索引结构的根条目放入 pq。然后你开始从 pq 弹出元素。当你遇到一个条目(节点)时,你解决它并将子节点放回 pq。当您遇到一个点时,您会找到 q 的下一个最近邻。

总体而言,索引结构有 O(n) 个条目。从 pq 弹出一个元素是 O(log |pq|)。这使得运行时 O(n * log |pq|)。问题是 pq 中平均有多少个元素。

我没有证据证明这一点,但是让我假设队列中的平均元素数应该在 L_1 和 2D 空间的 O(sqrt(n)) 左右。请注意,队列的大小很大程度上取决于距离度量和点的维度。

将所有这些放在一起,您可以构建索引结构 (O(n log n)),然后为每个点 q 对所有其他点进行排名 (O(n * log(sqrt(n))))

总体而言,这为您提供了O(n * log(n) + n^2 * log(sqrt(n))) 的运行时间。

但是,要回显@MBo:对于 O(n^2 * log (n)) 的改进不大,这是一个很大的麻烦

【讨论】:

  • n^2 * log(sqrt(n)) 并不是对n^2 * log(n) 的改进,尤其是在考虑到增加的比例常数之后。您还可以为平方根提供更多理由吗?不过看起来令人印象深刻。
  • Welp,你是对的。关于平方根:所有接近当前搜索半径的条目都在 pq.所有其他条目要么已经解决,要么覆盖了非常大的区域,在我的估计中被忽略了。因此,您可以查看具有一定宽度 epsilon 的搜索半径(圆周)与整个空间的比率。
猜你喜欢
  • 2018-09-17
  • 2022-10-04
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
相关资源
最近更新 更多