2011-04-06 124 views

回答

20

我认为你应该使用scikit ann

关于最近的neighbour here有一个很好的教程。

根据文档:

安为近似最邻近(ANN)库(http://www.cs.umd.edu/~mount/ANN/),由David M.摩和苏尼的Arya开发了SWIG生成Python包装。安提供一个不可变kdtree实现(经由ANN)能够执行k-最近邻和近似k

+0

+1这个库是非常容易的工作。 – 2011-04-06 12:56:38

+0

+1,非常有用的链接! – juanchopanza 2011-04-06 13:03:28

+0

一个用于有用的链接 – pylover 2012-06-15 19:28:14

5

我写了一个脚本来比较FLANN和scipy.spatial.cKDTree,无法获得ANN包装器来编译。您可以尝试一下,看看适用于您的应用程序的内容。我的测试用例与FLANN相比,cKDTree的运行时间相当,FLANN的速度快了1.25倍。当我增加testSize FLANN的速度比cKDTree快两倍。由于它不是标准python软件包的一部分,因此像FLANN似乎更难以整合,具体取决于项目。

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')