【问题标题】:How can I find just the kth-nearest neighbor?我怎样才能找到第 k 个最近的邻居?
【发布时间】:2020-10-29 01:47:47
【问题描述】:

我有一个包含近 4000000 个条目的数据框。基于 3 个特征,我想找到每个点与其第 1000 个最近邻居之间的距离。到目前为止,我已经尝试过这样的:

from sklearn.neighbors import NearestNeighbors    
neigh = NearestNeighbors(n_neighbors=1000)
nbrs = neigh.fit(df[features])
distances, indices = nbrs.kneighbors(df[features])

Afterwars 我会对distances 数组进行切片,以获得一个数组,其中每个条目的距离仅为第 1000 个最近邻居,因为这是我唯一关心的一个。但是我没有走那么远,因为我没有足够的内存来存储形状为 (4000000, 1000) 的数组。
有没有办法可以只保存到第 1000 个邻居的距离并丢弃所有其他 999?

背景是我正在努力寻找适合 epsilon 运行 DBSCAN 算法的方法,但显然我的数据点彼此太接近。我已经为 5 个和 100 个邻居尝试了上面的代码。然而,除了一些异常值之外,距离几乎为 0。 Quantiles for distances to the 100th neighbor

【问题讨论】:

标签: python scikit-learn dbscan


【解决方案1】:

你不妨试试:

from sklearn.neighbors import KDTree
x = np.random.randn(4000000,3)
kdt = KDTree(x)

closest_1000th =[]
for i in range(x.shape[0]):
    dist, _ = kdt.query(x[i,:].reshape(1,-1),1000)
    closest_1000th.append(dist[0, -1])

在我的 4Gb RAM 笔记本电脑上,完成这项任务大约需要 1 小时。

帽子提示@bogovicj。

【讨论】:

  • 很高兴你写了详细信息 +1
  • @bogovicj 你不妨写下你的,我会投赞成票! (我的真实尝试都没有奏效,这就是原因)
  • 嗨,我认为切片存在语法错误,但我明白了。谢谢