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 новых точек", вы можете получить более качественные ответы или примеры кода.
Что вы хотите делать с соседями, когда вы их нашли?)