2011-04-06 20 views

cevap

20

scikit ann'u kullanmanız gerektiğini düşünüyorum.

En yakın neightbour here hakkında iyi bir öğretici var. Belgelere göre

:

ann David M. Dağı ve Sunil Arya tarafından geliştirilen Yaklaşık yakın Komşu (ANN) Kütüphanesi (http://www.cs.umd.edu/~mount/ANN/), bir yudum oluşturulan piton sarıcı. ann k-en yakın komşu ve yaklaşık k

+0

1 bu kütüphane ile çalışmak çok kolaydır. –

+0

+1, çok kullanışlı linkler! – juanchopanza

+0

faydalı linkler için – pylover

3

scipy.spatial.cKDTree hızlı ve sağlam olduğunu gerçekleştirebilir (YSA ile) bir değişmez kdtree uygulamasını sağlar. NN enterpolasyonu için kullanmayla ilgili bir örnek için, bkz. (Ahem) inverse-distance-weighted-idw-interpolation-with-python SO. Eğer yapmak istediğiniz nedir

(sen daha iyi cevaplar veya kod örneklerini alabilirsiniz, "Ben 3d 1M puan var ve 1k yeni noktaların = 5 yakın komşuları k istiyoruz" mesela söyleyebilseydim.
komşuları bir kez bulduktan sonra?)

5

FLANN ve scipy.spatial.cKDTree ile karşılaştırmak için bir komut dosyası yazdım, ANN paketleyiciyi derleyemedim. Başvurunuz için neyin işe yaradığını görmek için bunu kendiniz deneyebilirsiniz. CKDTree, FLANN ile test durumum için karşılaştırılabilir bir çalışma süresine sahipti, FLANN ~ 1.25x daha hızlıydı. TestSize artırdığımda FLANN, cKDTree'den ~ 2 kat daha hızlıydı. Standart bir python paketinin parçası olmadığından FLANN'in projeye bağlı olarak entegrasyonunun daha zor olacağı düşünülmektedir.

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') 
İlgili konular