我想在 python 中计算 K-最近邻。我应该使用什么库?
4 回答
我认为你应该使用scikit ann。
这里有一个关于最近邻居的好教程。
根据文档:
ann 是由 David M. Mount 和 Sunil Arya 开发的近似最近邻 (ANN) 库 ( http://www.cs.umd.edu/~mount/ANN/ )的 SWIG 生成的 python 包装器。ann 提供了一个不可变的 kdtree 实现(通过 ANN),它可以执行 k-最近邻和近似 k
这是一个比较 scipy.spatial.cKDTree 和 pyflann.FLANN 的脚本。亲自看看哪一个对您的应用程序来说更快。
import cProfile
import numpy as np
import os
import pyflann
import scipy.spatial
# Config params
dim = 4
data_size = 1000
test_size = 1
# Generate data
np.random.seed(1)
dataset = np.random.rand(data_size, dim)
testset = np.random.rand(test_size, dim)
def test_pyflann_flann(num_reps):
flann = pyflann.FLANN()
for rep in range(num_reps):
params = flann.build_index(dataset, target_precision=0.0, log_level='info')
result = flann.nn_index(testset, 5, checks=params['checks'])
def test_scipy_spatial_kdtree(num_reps):
flann = pyflann.FLANN()
for rep in range(num_reps):
kdtree = scipy.spatial.cKDTree(dataset, leafsize=10)
result = kdtree.query(testset, 5)
num_reps = 1000
cProfile.run('test_pyflann_flann(num_reps); test_scipy_spatial_kdtree(num_reps)', 'out.prof')
os.system('runsnake out.prof')
scipy.spatial.cKDTree 快速而可靠。有关将其用于 NN 插值的示例,请参阅 SO 上的 (ahem) inverse-distance-weighted-idw-interpolation-with-python。
(如果您可以说例如“我在 3d 中有 1M 个点,并且想要 1k 个新点的 k=5 个最近邻居”,您可能会得到更好的答案或代码示例。
一旦找到,您想对邻居做什么他们 ?)
如果您要使用 kd-tree 方法,它本身就在 scipy 中:http: //docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.KDTree.html#scipy.spatial.KDTree