2013-03-18 8 views
0

SciPy.Spatial에서 KDQuery 함수로 재생 중입니다. 데이터 크기가 커지면 문제가 발생합니다. 알고리즘이 대형 데이터 세트에 대해 효율적으로 설계되지는 않았지만 크기가 출력에만 영향을 미치고 출력에는 영향을 미치지 않아야한다는 것을 소스에서 알 수 있습니다. (는 ValueError list.remove (X)리스트에없는 X)Scipy.Spatial.KDTree.query - 대용량 데이터 세트 문제

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) 

이 난 목록에없는 값의 오류를 반환 여기

는 코드이다. 10^5 미만의 데이터 크기의 경우이 코드는 예상대로 작동합니다.

오류의 가능한 원인 중 하나는 재귀 한계에 도달했기 때문입니다. 이것을 탐색하기 위해 재귀 깊이를 1,000,000 (sys.setrecursionlimit(1000000))으로 설정했습니다. 이것은 문제를 완화하지 않습니다.

+0

'ps.common' 네임 스페이스 란 무엇입니까? –

+0

모듈 수준의 가져 오기를 처리하는 또 다른 파일 – Jzl5325

답변

1

오류 코드에서 row.remove(i) 문에 오류가 발생합니다. 문제는 임의의 데이터 세트에 중복 포인트가있을 수 있으며, 때로는 동일한 포인트가 3 번 이상 반복 될 수 있다는 것입니다. 이것은 데이터 세트가 클 때가 능성이 높습니다. 그런 일이 발생하면 점의 세 가장 가까운 이웃은 점 자체를 포함하지 않을 수 있습니다. 이로 인해 row.remove(i)의 오류가 발생합니다.