web-dev-qa-db-ja.com

pythonのK最近傍

PythonでK最近傍法を計算したいと思います。どのライブラリを使用する必要がありますか?

13
sramij

scikit ann を使うべきだと思います。

最も近いneightbourについての良いチュートリアルがあります ここ

ドキュメントによると:

annは、SWIGによって生成されたpython近似最近傍(ANN)ライブラリのラッパー( http://www.cs.umd.edu/~mount/ANN/ =)、David M.MountとSunilAryaによって開発されました。annは、k最近傍法と近似kを実行できる不変のkdtree実装を(ANN経由で)提供します。

22
Sandro Munda

FLANNとscipy.spatial.cKDTreeを比較するスクリプトを作成しましたが、ANNラッパーをコンパイルできませんでした。これを自分で試して、アプリケーションで何が機能するかを確認できます。 cKDTreeの実行時間はFLANNを使用したテストケースと同等で、FLANNは約1.25倍高速でした。 testSizeを大きくすると、FLANNはcKDTreeよりも約2倍高速でした。 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')
5
Chris Flesher

scipy.spatial.cKDTree 高速で安定しています。 NN補間に使用する例については、SOの(ahem) inverse-distance-weighted-idw-interpolation-with-python を参照してください。

(たとえば、「3Dに1Mのポイントがあり、1kの新しいポイントのk = 5の最近傍が必要」と言えば、より良い回答やコード例が得られる可能性があります。
隣人を見つけたら、どうしますか?)

3
denis

Kd-treeアプローチを実行しようとしている場合は、ネイティブにscipyにあります: http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.KDTree.html#scipy。 Spatial.KDTree

3
Max Bileschi