PythonでK最近傍法を計算したいと思います。どのライブラリを使用する必要がありますか?
4 に答える
scikitannを使うべきだと思います。
ここに最も近いneightbourについての良いチュートリアルがあります。
ドキュメントによると:
annは、 David M.MountとSunilAryaによって開発された、近似最近傍(ANN)ライブラリ( http://www.cs.umd.edu/~mount/ANN/ )用のSWIG生成のPythonラッパーです。annは、k最近傍法と近似kを実行できる不変のkdtree実装(ANN経由)を提供します
これは、scipy.spatial.cKDTreeとpyflann.FLANNを比較するスクリプトです。アプリケーションにとってどちらが速いかを自分で確認してください。
import cProfile
import numpy as np
import os
import pyflann
import scipy.spatial
# Config params
dim = 4
data_size = 1000
test_size = 1
# Generate data
np.random.seed(1)
dataset = np.random.rand(data_size, dim)
testset = np.random.rand(test_size, dim)
def test_pyflann_flann(num_reps):
flann = pyflann.FLANN()
for rep in range(num_reps):
params = flann.build_index(dataset, target_precision=0.0, log_level='info')
result = flann.nn_index(testset, 5, checks=params['checks'])
def test_scipy_spatial_kdtree(num_reps):
flann = pyflann.FLANN()
for rep in range(num_reps):
kdtree = scipy.spatial.cKDTree(dataset, leafsize=10)
result = kdtree.query(testset, 5)
num_reps = 1000
cProfile.run('test_pyflann_flann(num_reps); test_scipy_spatial_kdtree(num_reps)', 'out.prof')
os.system('runsnake out.prof')
scipy.spatial.cKDTree は高速で安定しています。NN補間に使用する例については、SOの(ahem) inverse-distance-weighted-idw-interpolation-with-pythonを参照してください。
(たとえば、「3Dに1Mのポイントがあり、1kの新しいポイントのk = 5の最近傍が必要」と言えば、より良い答えやコード例が得られる可能性があります
。彼ら ?)
kd-treeアプローチを実行しようとしている場合は、ネイティブにscipyにあります:http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.KDTree.html#scipy.spatial.KDTree