Я хотел бы вычислить K-ближайший сосед в python. какую библиотеку я должен использовать?
K ближайший сосед в python
Ответ 1
Я думаю, что вы должны использовать scikit ann.
Существует хороший учебник о ближайшем neightbour здесь.
Согласно документации:
ann - это SWIG-сгенерированная оболочка python для библиотеки приблизительного ближайшего соседа (ANN) (http://www.cs.umd.edu/~mount/ANN/), разработанной Дэвидом М Гора и Сунил Арья. ann предоставляет неизменяемую реализацию kdtree (через ANN), которая может выполнять k-ближайший сосед и приближенную k
Ответ 2
Я написал script для сравнения FLANN и scipy.spatial.cKDTree, не смог получить компиляцию ANN-обертки. Вы можете попробовать это для себя, чтобы увидеть, что будет работать для вашего приложения. У cKDTree было сопоставимое время выполнения для моего тестового примера с FLANN, FLANN - на 1,25 раза быстрее. Когда я увеличил testSize, FLANN был ~ 2x быстрее, чем cKDTree. Похоже, что FLANN будет сложнее интегрировать в зависимости от проекта, поскольку он не является частью стандартного пакета python.
import cProfile
from numpy import random
from pyflann import *
from scipy import spatial
# Config params
dim = 4
knn = 5
dataSize = 1000
testSize = 1
# Generate data
random.seed(1)
dataset = random.rand(dataSize, dim)
testset = random.rand(testSize, dim)
def test1(numIter=1000):
'''Test tree build time.'''
flann = FLANN()
for k in range(numIter):
kdtree = spatial.cKDTree(dataset, leafsize=10)
params = flann.build_index(dataset, target_precision=0.0, log_level = 'info')
def test2(numIter=100):
kdtree = spatial.cKDTree(dataset, leafsize=10)
flann = FLANN()
params = flann.build_index(dataset, target_precision=0.0, log_level = 'info')
for k in range(numIter):
result1 = kdtree.query(testset, 5)
result2 = flann.nn_index(testset, 5, checks=params['checks'])
import cProfile
cProfile.run('test2()', 'out.prof')
Ответ 3
scipy.spatial.cKDTree быстрый и прочный. Для примера использования его для интерполяции NN см. (Гм) inverse-distance-weighted-idw-interpolation-with-python на SO.
(Если бы вы могли сказать, например: "У меня есть 1M точек в 3d, и вы хотите k = 5 ближайших соседей из 1k новых точек",
вы можете получить более качественные ответы или примеры кода.
Что вы хотите делать с соседями, когда вы их нашли?)
Ответ 4
Это изначально в scipy, если вы ищете подход kd-tree: http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.KDTree.html#scipy.spatial.KDTree