0

SciPy.Spatial のKDQuery関数で遊んでいます。データ サイズが非常に大きくなると、問題が発生します。アルゴリズムは必ずしも大規模なデータセットに対して効率的に設計されているわけではありませんが、(ソースから) サイズは処理時間を増やすだけで、出力には影響しないようです。

コード スニペットを次に示します。

sizes = [ 10**i for i in range(5,6) ] #10^5 for this test
data = np.random.random_integers(0,100,(sizes[-1],2))
for size in sizes:
    kd = ps.common.KDTree(data)
    nnq = kd.query(data,k=2+1, p=2)
    info = nnq[1] #This is the indices of the neighbors
    neighbors = {}
    idset = np.arange(len(info)) #Indices of the input point
    for i, row in enumerate(info):
        row = row.tolist()
        row.remove(i)
        neighbors[idset[i]] = list(row)

これは、i がリストにない場合に値エラーを返します (ValueError list.remove(x): x not in list)。10^5 未満のデータ サイズの場合、このコードは期待どおりに機能します。

エラーの潜在的な理由の 1 つは、再帰の制限に達したことです。これを調べるために、再帰の深さを 1,000,000 に設定しました ( sys.setrecursionlimit(1000000))。これは問題を軽減しません。

4

1 に答える 1

1

エラーは、コードのステートメントで発生しますrow.remove(i)。問題は、ランダム データ セットに重複したポイントが含まれる可能性があり、同じポイントが 3 回以上繰り返される場合があることです。これは、データ セットが大きい場合に発生する可能性が非常に高くなります。その場合、ポイントの 3 つの最近傍にポイント自体が含まれない場合があります。これにより、エラーが発生しrow.remove(i)ます。

于 2013-03-19T16:43:51.500 に答える