K ближайший сосед в python [закрыт]

Я хотел бы вычислить K-ближайшего соседа в python. какую библиотеку мне использовать?

4 ответов


Я думаю, что вы должны использовать scikit ann.

есть хороший учебник о ближайшем neightbour здесь.

согласно документации:

ann-это SWIG-генерируемая оболочка python для приблизительной библиотеки ближайшего соседа (ANN) (http://www.cs.umd.edu / ~mount / ANN/), разработанный Дэвидом М. маунтом и Сунил Арьей. ann предоставляет неизменяемую реализацию kdtree (через ANN), которая может выполните k-ближайший сосед и приблизительное k


Я написал сценарий для сравнения ФЛАННА и сципи.пространственный.cKDTree, не удалось получить оболочку ANN для компиляции. Вы можете попробовать это для себя, чтобы увидеть, что будет работать для вашего приложения. У cKDTree было сопоставимое время выполнения для моего тестового случая с ФЛАННОМ, ФЛАНН был ~1.25 x быстрее. Когда я увеличил 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')

scipy.пространственный.cKDTree быстро и надежно. Пример использования его для интерполяции NN см. В разделе (ahem) inverse-distance-weighted-idw-интерполяция-с-python на SO.

(Если вы можете сказать, например, "у меня есть 1M точек в 3d, и хочу, чтобы k=5 ближайших соседей 1k новых точек", вы можете получить лучшие ответы или примеры кода.
Что вы собираетесь делать с соседями, когда найдете их ?)


Это изначально в scipy, если вы хотите сделать подход KD-tree: http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.KDTree.html#scipy.spatial.KDTree