我如何才能找到第k个最近的邻居?

问题描述

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

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

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

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

解决方法

您不妨尝试:

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。