2011-04-06 22 views
13

में निकटतम पड़ोसी मैं पाइथन में के-निकटतम पड़ोसी की गणना करना चाहता हूं। मुझे किस लाइब्रेरी का उपयोग करना चाहिए?के पाइथन

उत्तर

20

मुझे लगता है कि आपको scikit ann का उपयोग करना चाहिए।

निकटतम नाइटबर here के बारे में एक अच्छा ट्यूटोरियल है।

प्रलेखन के अनुसार:

एन लगभग निकटतम पड़ोसी (एएनएन) लाइब्रेरी (http://www.cs.umd.edu/~mount/ANN/), डेविड एम माउंट और सुनील आर्य द्वारा विकसित करने के लिए एक बड़ा घूँट-उत्पन्न अजगर आवरण है। एन अपरिवर्तनीय kdtree कार्यान्वयन (एएनएन) के माध्यम से जो प्रदर्शन कर सकते हैं k-निकटतम पड़ोसी और अनुमानित कश्मीर

+0

+1 इस पुस्तकालय के साथ काम करने के लिए बहुत आसान है। –

+0

+1, बहुत उपयोगी लिंक! उपयोगी लिंक के लिए – juanchopanza

+0

एक – pylover

3

scipy.spatial.cKDTree तेजी से और ठोस है प्रदान करता है। एनएन इंटरपोलेशन के लिए इसका उपयोग करने के उदाहरण के लिए, एसओ पर (एहेम) inverse-distance-weighted-idw-interpolation-with-python देखें।

(अगर आप कहते हैं हो सकता है उदाहरण के लिए "मैं 3 डी में 1M अंक है, और k 1k नए अंक के = 5 निकटतम पड़ोसियों चाहते हैं", आपको बेहतर उत्तर या कोड उदाहरण मिल सकता है।
क्या आप के साथ करना चाहते हैं पड़ोसियों ने उन्हें एक बार पाया है?)

5

मैंने FLANN और scipy.spatial.cKDTree की तुलना करने के लिए एक स्क्रिप्ट लिखी, संकलन करने के लिए एएनएन रैपर नहीं मिला। आप अपने आवेदन के लिए क्या काम करेंगे यह देखने के लिए आप यह कोशिश कर सकते हैं। सीकेडीटी के पास फ्लैन के साथ मेरे टेस्ट केस के लिए एक तुलनात्मक रन टाइम था, FLANN ~ 1.25x तेज था। जब मैंने टेस्टसाइज़ FLANN बढ़ाया तो सीकेडीटी की तुलना में ~ 2x तेज था। ऐसा लगता है कि फ्लैगन परियोजना के आधार पर एकीकृत करना अधिक कठिन होगा क्योंकि यह मानक पायथन पैकेज का हिस्सा नहीं है।

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