수백만 개의 데이터 포인트에 대해 가장 가까운 인접 계산 반복


14

3D로 수백만 개의 데이터 포인트로 실행되는 데이터 세트가 있습니다. 내가하고있는 계산을 위해서는 반경의 각 데이터 점에 대한 이웃 (범위 검색)을 계산하고 함수를 맞추고 적합에 대한 오류를 계산하고 다음 데이터 점에 대해 이것을 반복해야합니다. 내 코드는 제대로 작동하지만 데이터 포인트 당 약 1 초가 걸리는 데 시간이 오래 걸립니다! 각 포인트마다 전체 데이터 세트를 검색해야하기 때문일 수 있습니다. 프로세스를 빠르게 만들 수있는 방법이 있습니까? 어떻게 든 첫 이웃 사이에 인접 관계를 설정할 수 있다면 이것이 느려질 수 있다는 생각이 있습니다. 도움이된다면 최적의 Parzen 창 너비를 3D로 찾으려고합니다.

답변:


9

볼륨 계층 구조 (특히 BSP 트리)에 대한 인터넷 검색을 제안합니다. 포인트 클라우드가 주어지면 두 개의 동일한 서브 클라우드로 분할 된 평면을 찾을 수 있습니다. 그런 다음 테스트 지점의 반경 R 내에있는 포인트 모음을 찾아야 할 경우 먼저 테스트 지점을 해당 평면과 비교할 수 있습니다. 높이가 R 이상인 경우 평면 아래의 전체 하위 구름 또한 R보다 멀리 떨어져 있어야합니다 (따라서 그 점을 확인할 필요가 없습니다). 이 아이디어를 재귀 적으로 적용하여 궁극적으로 n 제곱 대신 n log n 유형의 복잡성을 산출 할 수 있습니다. (이것은 BSP / 이진 공간 분할입니다.


7

위치 및 근접성에 관한 정보를 보존하는 데이터를 저장하기위한 몇 가지 데이터 구조가있다; 가장 가까운 가장 가까운 이웃 (들) 결정을 허용함으로써.

특히 R-trees (및 R * -trees 와 같은 특수 형식 ) 및 X-trees 입니다. 약간 다른 용도에 최적화 된 다양한 선택.

순진한 가장 가까운 이웃 조회가 아닌 R *-트리를 선택하는 것은 특정 코드에서 10000 배의 속도를내는 데 큰 도움이되었습니다. (OK, 그 아마 몇 백은 R은 순진 룩업이 심하게 캐시를 박살 너무 코딩 된했기 때문에 나머지 대부분이었다 * - 트리이었다. :: 한숨 :: )

이러한 구조에는 일반적인 ( N 저장 포인트 수) 삽입 성능 및 저장 요구 사항과 O ( log N ) 조회 성능이 있으므로 많은 조회를 수행 할 경우 (예 : DBSCAN에서와 같이 각 포인트); 그러나 그들 중 일부는 최악의 성능을 가지고 있습니다.영형(로그)영형(로그)


5

이것은 분자 결합 역학 분야에서 가장 큰 과제 중 하나 인 비 결합 입자 사이의 모든 쌍별 상호 작용을 계산하는 것과 매우 유사합니다.

여기에서 셀 목록 (또는 이웃 목록 )을 사용하여 근처에있는 것을 파악할 수 있습니다. 이 응용 프로그램의 경우 셀 목록이 사용하기 쉬운 알고리즘 일 것입니다.

  • 상자를 일련의 셀로 나눕니다.
  • 각 입자에 대해 어느 셀에 할당해야하는지 결정하십시오 (입자 당 O (1)).
  • 그런 다음 각 입자에 대해 "자체"셀과 인접 셀을 확인하십시오. 이들 중 하나라도 사용되면 추가 검색이 필요하지 않습니다.
  • 가장 가까운 이웃이 모두 비어 있으면 파티클이 발견 될 때까지 다음 인접 이웃 등으로 확장합니다.

시스템의 입자 분포가 다소 균일 한 경우 그리드의 거칠기에 따라 알고리즘 비용이 크게 줄어 듭니다. 그러나 약간의 미세 조정이 필요합니다. 그리드가 너무 거칠면 많은 시간을 절약 할 수 없습니다. 빈 격자 셀을 순환하는 데 많은 시간을 소비하게됩니다!


셀 가장자리 길이는 최소한 검색 반경이어야하거나 각 입자에 고유 한 검색 반경이 있으면 최대 반경이어야합니다.
Pedro

MD 사례에서도 마찬가지입니다. 여기서 우리는 그 반지름이 선험적으로 무엇인지 모른다 .
aeismail

대규모 입자 구름 중력 시뮬레이션에서 비슷한 방식이 오랫동안 사용되었습니다. 그것이 여전히 최신 기술의 일부인지 모르겠습니다.
dmckee --- 전 moderator 고양이

4

점 세트에 대해 선택하는 방법 인 KD 트리옥트리 를 반드시 확인해야 합니다 (BSP는 일반 객체 용이고 그리드는 다소 균일 한 밀도 용입니다). 메모리와 계산 모두에서 오버 헤드를 최소화하면서 매우 작고 빠를 수 있으며 구현이 간단합니다.

격자 모양의 비 계층 적 공간 세분을 시도하려는 경우 점이 다소 균일하게 분포되어있는 경우 (빈 영역이 있더라도 밀도 특이성 또는 다른 고농도가 없어야 함) 구 패킹을 확인하십시오.


3

들로네 삼각 분할 (3D 아날로그) 구축을 고려해야합니다 . 2D에서는 항상 가장 가까운 이웃을 포함하는 데이터 포인트의 특수 삼각 측량입니다. 3D에서도 마찬가지이지만 4 면체도 마찬가지입니다.

한 번에 모든 삼각 분할을 만든 다음 삼각 분할에서 가장 가까운 이웃을 직접 검색 할 수 있습니다. 삼각 측량을 구축하는 좋은 알고리즘이 있다고 생각합니다 .2D에서 삼각 측량의 구성은로그() 가장 가까운 이웃에 대한 이후의 검색은 데이터 포인트 수에서 선형입니다.

그것이 도움이되기를 바랍니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.