“그라 놀라 바”와 같은 구조의 덩어리를 찾는 알고리즘?


19

저는 행성 과학 연구원이고 제가 진행하고있는 프로젝트 중 하나 는 토성의 고리 에 대한 N- 몸 시뮬레이션입니다. 이 특정 연구의 목표는 입자들이 그들 자신의 중력 하에서 함께 응집되는 것을 관찰하고, 세포 내의 모든 입자의 평균 속도에 대한 덩어리의 총 질량을 측정하는 것입니다. 우리는 이것이 거대한 구조물이 거의 가장자리 고리에 그림자를 드리 우는 Saturnian 여름 동지 동안 Cassini 우주선이 관찰 한 것을 설명 할 수 있는지 알아 내려고 노력하고 있습니다 . 아래는 주어진 타임 스텝이 어떻게 보이는지에 대한 스크린 샷입니다. (각 입자의 직경은 2m이고 시뮬레이션 셀 자체는 약 700m입니다.)

_N_-body 세포는 검은 배경에 작은 음영 구체로 표시된 입자와 토성의 고리 시뮬레이션.

내가 사용하는 코드는 이미 모든 시간 단계에서 평균 속도를 내뿜습니다. 내가해야 할 일은 덩어리 사이의 입자의 질량을 결정하는 방법을 알아내는 것입니다. 나는 모든 입자의 위치, 질량, 크기 등을 알고 있지만, 102,000-105,000과 함께 입자 30,000-40,000이 사람의 눈에 명백한 하나의 가닥을 구성한다는 것을 쉽게 알지 못합니다.

따라서 내가 작성해야하는 알고리즘은 모든 입자 위치를 통과하고, 어떤 입자가 덩어리에 속하는지 알아 낸 다음 가능한 한 사용자가 입력 한 매개 변수 (복제 성 및 객관성)가 적은 코드 여야합니다. 질량. 셀의 모든 것에 반대되는 "각"덩어리 / 가닥에 대해 할 수 있다면 좋을 것입니다. 그러나 실제로 분리하기 위해 필요 하지는 않습니다 .

내가 생각한 유일한 것은 모든 입자 사이의 거리를 계산하는 일종의 N 2 거리 계산을 수행하는 것입니다. 예를 들어, 가장 가까운 100 입자가 특정 거리 내에 있으면 그 입자는 클러스터. 그러나 그것은 꽤 조잡 해 보였고 CS 사람들과 프로그래머가보다 우아한 해결책을 알고 싶었습니까?


내 솔루션으로 편집 : 내가 한 일은 가장 가까운 이웃 / 클러스터 접근 방식을 취하고 quick-n-dirty N 2 구현을 먼저 수행하는 것이 었습니다 . 따라서 모든 파티클을 가져 와서 다른 모든 파티클까지의 거리를 계산하십시오. 클러스터에서 임계 값은 d 거리 내에 N 개의 파티클 이 있는지 여부입니다 ( 불행히도 우선 순위를 설정 해야하는 두 가지 매개 변수). 응답 / 의견, 그중 일부가 없어도 도망 가지 않을 것입니다).

그런 다음 거리를 정렬하지 않고 단순히 순서 N 검색을 수행하고 d 내의 입자에 대한 카운터를 증가 시키고 그 계수를 6의 계수만큼 증가시킵니다 . 그런 다음 "어리석은 프로그래머의 나무"를 추가했습니다 트리 코드에 대해서는 아무것도 옆에 없습니다). 시뮬레이션 셀을 설정된 그리드 수로 나눕니다 (그리드 크기 ≈7 d 일 때 가장 좋은 결과 ) 주 그리드가 셀과 정렬되고 하나의 그리드는 xy의 절반으로 오프셋되고 다른 하나는 1/4 ± X 및 ± Y . 그런 다음 코드는 파티클을 그리드로 나누고 각 파티클 N 은 해당 셀의 다른 파티클까지 거리를 계산하면됩니다.

이론적으로 이것이 실제 트리라면 N 2 속도 와 반대로 N * log ( N ) 차수 를 가져와야 합니다. 50,000 입자 하위 세트의 경우 속도가 17 배 증가하고 150,000 입자 셀의 경우 속도가 38 배 증가했습니다. 첫 번째는 12 초, 두 번째는 53 초, 500,000 입자 셀의 경우 460 초입니다. 이는 코드가 시뮬레이션을 한 단계 앞당겨 실행하는 데 걸리는 시간과 비교할 수있는 속도이므로이 시점에서 합리적입니다. 아-그리고 그것은 완전히 스레드되어 있으므로 그것을 던질 수있는만큼 많은 프로세서가 필요합니다.


3
나는이 주제에 대해 특별히 지식이 없기 때문에 도움을 거의 제공 할 수 없지만 클러스터 분석에 관한 Wikipedia 기사 를 읽었 습니까? 매우 활발한 연구 분야 인 것 같습니다.
Cole Campbell

나는 시각적으로 클러스터의 일부가 아니지만 알고리즘 적으로있을 수있는 얇은 가닥 중 일부를 "따라야"한다고 생각하기 때문에 적어도 DBSCAN과 같은 클러스터 코드에 대해 경계합니다. 분화구를 연구하면서 다른 작업에 사용하기 때문에 DBSCAN 유형 코드에 대한 경험이 있습니다.
스튜어트 로빈스

1
이와 같은 가닥을 식별하는 모든 코드에는 일종의 "감도"설정이 포함됩니다.
Robert Harvey

2
동의했다. 여기서 가장 어려운 점은 "뭉치"가 잘 정의 된 용어가 아니라는 것입니다. 하루가 끝나면 일종의 잡음 제거 패스와 결합 된 일종의 클러스터 분석 알고리즘 (실제로 제안 된 솔루션이 이미 존재 함)을 사용해야 합니다.
Cole Campbell

2
당신이 당신의 사진에 당신이 생각하는 것 (혹은 유효하지 않은 것)
jk

답변:


3

첫 번째 제안은 문제를 두 가지 문제로 줄이는 것입니다. 먼저 원하는 것을 파악한 다음 원하는 것을 효율적으로 얻는 방법을 찾으십시오. 아직 정의하지 않은 것을 효율적으로 얻을 수 없습니다. 이 답변에이 정의를 찾는 데 도움이되는 몇 가지 아이디어가 있습니다. 나는 당신이 좋아하는 아이디어를 비효율적으로 구현하고, 너무 큰 데이터 세트에 적용하고, 손으로 결과를 평가하고, 정의를 조정하고 반복 할 것입니다 (아마도 다른 질문을 할 것입니다). 당신의 정의. 그런 다음, 정의 결과를 효율적으로 계산하는 방법에 대해 다른 질문을하는 것이 좋습니다 (여전히 도움이 필요한 경우).

따라서 '가닥'에 대한 직관적 인 아이디어에 해당하는 것이 무엇인지 살펴 보겠습니다. 스트랜드는 대략 균일하게 분포 된 점들로 구성되어있는 것처럼 보이지만 (원본 데이터 세트의) 확대 된 그림을 만들어이를 확인해야합니다. . 나는 그들이이 답변에 있다고 가정합니다.

초기 아이디어는 모든 지점에서 가장 가까운 이웃을 보는 것입니다. 점 X를 선택하고 가장 가까운 이웃 Y를 호출하고 D를 X와 Y 사이의 거리로 설정합니다. 그런 다음 반경 D * A를 가진 X 주위의 원 C를 봅니다. 여기서 A는 튜닝 매개 변수입니다 (예 : A = 3). X가 스트랜드의 일부인 경우 C의 모든 점 Z에 대해 Z에서 가장 가까운 이웃 W까지의 거리는 D와 거의 같을 것으로 예상됩니다. 상당히 짧으면 A보다 많거나 다른 매개 변수 B) 그러면 X는 분명히 X보다 서로 더 가까운 지점에 가까운 것이므로 X는 아마도 가닥의 일부가 아닐 것입니다.

그러나이 기준은 완전하지 않습니다. 포인트가 밀집된 영역과 포인트가 밀집된 영역 사이의 '테두리'를 감지하는 기준 만 제공합니다. 우리는 여전히 포인트를 함께 묶어야합니다.

사진에 이것이 간단하지 않다는 것을 보여주는 기능이 있습니다. 사진의 오른쪽 아래 구석에는 길잃은 점이 많은 비교적 넓은 영역이 있습니다. 이 스트레이 포인트 자체는 대략 균일하게 분포되어 있으므로, 스트랜드의 모든 포인트 (및 다른 모든 포인트)를 제거하려면 스트랜드 감지 알고리즘이이 스트레이 포인트 세트를 스트랜드로 표시 할 것으로 예상됩니다! 따라서 클러스터를 만들 때주의해야합니다.

아이디어는 다음을 수행하는 것일 수 있습니다. 우리는이 점들에 대해 그래프를 만들 것입니다. 정점은 점이고 가장자리는 두 점의 밀도가 비슷하다는 것을 나타냅니다. 모든 시점에서 위의 기준을 확인합니다. 체크 아웃하면 가장자리가있는 X를 C의 모든 점에 연결합니다. 체크 아웃하지 않으면 가장자리를 추가하지 않고 X를 'stray'로 표시합니다. 모든 지점에서이 작업을 수행 한 후 연결된 구성 요소 집합을 고려합니다.. 이것들은 하나의 (사진의 경우 다른 데이터 세트에는 가닥의 모든 점으로 구성된 연결된 구성 요소가 여러 개있을 수 있음), 단일 스트레이 포인트와 이러한 '스트레이 가닥'으로 구성된 더 많은 구성 요소로 구성되어야합니다. 그러나이 스트레이 스트랜드에는 점으로 표시된 점이 있으므로 '점박이'로 표시된 점을 포함하는 구성 요소는 무시해도됩니다.

이 아이디어의 위험은 스트랜드를 따라 움직일 때 스트랜드의 밀도가 점차 낮아져 밀도가 너무 낮아서 점유 점이 될 때까지 스트랜드의 밀도가 점차 낮아지는 기능이있을 수 있습니다. 우리의 기준이 '로컬'이므로이를 감지하지 못하고이 스트레이 포인트를 스트랜드의 일부로 표시 할 수 있습니다. 이것이 문제가 될지 확실하지 않습니다. 밀도 변화가 사진에서 급격히 변하는 것처럼 대부분의 빗나간 점이 기준에 잡힐 것 같습니다.

이 문제가 발생하면 연결된 구성 요소를 대신 사용할 수 있습니다. 모든 점 X에 대해 가장 가까운 이웃 D (X)까지의 거리를 계산합니다. 최소 D (X)부터 시작하여 BFS (또는 DFS , 순서는 중요하지 않음)를 수행합니다. 우리가 시작한 D (Y)가 D (X)보다 훨씬 크지 않은 점 Y를 (조정 가능한 요소에 의해) 추가합니다. D (Y)가 너무 큰 점 Y를 만나면 모서리 (X, Y)를 제거하고 Y를 '줄기'로 표시하고 BFS에서 Y를 방문하지 않은 것처럼 행동합니다. 올바르게 조정하면 위에서 설명한 문제를 방지 할 수 있습니다.

이 문제를 해결하기위한 대안은 조금 더 국부적으로 작용합니다 .BFS를 수행하고 가장 낮은 D (X)를 추적 할 수 있습니다 (D (X)를 점 주위의 밀도 측정으로 사용합니다). BFS 단계 이전에, 우리가이 D (X)보다 훨씬 큰 D (Y)를 가진 Y를 만난다면, 우리는 내가 제공 한 다른 (잠재적) 솔루션과 동일하게 행동합니다.

면책 조항 : 지금 당장 생각했던 위의 모든 아이디어는,이 특정 문제가 전에 연구되었는지 실제로 알지 못하기 때문에 난센스가 생길 수 있습니다. 당신에게 현명하게 들리는 아이디어 (내 아이디어 또는 자신의 아이디어)를 시도하고 그들이 실제로 효과가 있는지 알아 낸 다음 효율적으로 구현하는 데 집중하십시오.


2

모듈 식 분해 를 사용하면 모든 입자를 리프로 포함하는 트리를 만들 수 있으며 상위 노드가 클러스터를 클러스터합니다. 해당 트리를 기반으로 루트에서 리프까지 아래쪽의 모든 노드에 적용되는 측정 값을 정의 할 수 있습니다. 측정 값이 사용자 정의 임계 값에 도달하면 하향 이동을 중지합니다. 그러한 측정 중 하나는 클러스터 내 모든 입자의 볼록 껍질의 밀도 일 수 있습니다.


1

기계 학습 클러스터링 알고리즘을 사용하고 있다고 생각합니다.

Python SciKit Learn 툴킷 의이 페이지 에는 DBSCAN 알고리즘 (Wikipedia)이 원하는 것을 제안하는 그림이 있습니다 . 입력 매개 변수의 크기는 이웃 크기이므로 이상적이며 대부분의 다른 클러스터링 알고리즘은 미리 알지 못하는 클러스터 수를 원합니다.

"소음이있는 대규모 공간 데이터베이스에서 클러스터를 발견하기위한 밀도 기반 알고리즘"Ester, M., HP Kriegel, J. Sander 및 X. Xu, 포틀랜드, 또는 , AAAI Press, 226–231 쪽. 1996


0

나는이 문제에 대해 생각하고있다. 나는 물리 전문가가 아니므로 나와 함께 견뎌내십시오.

덩어리를 결정하는 데 중요한 입자 사이의 거리가 아닌 것 같습니다. 중력 필드가 겹치는 지 여부입니다.

입자 P를 가져 와서 다른 입자가 겹치는 중력장을 갖는지 결정하십시오.

그런 다음 그 중 하나를 수행하고 동일한 작업을 수행하십시오. 당신의 목표는 덩어리에서 모든 입자를 찾는 것이 아니라 그 경계를 찾는 것입니다.

모든 덩어리가 발견 될 때까지이 과정을 반복하십시오.

이제 돌아가서 덩어리의 질량을 결정하십시오. 길 잃은 입자를 제거하고 덩어리 경계를 사용하여 질량을 찾을 수 있습니다.

이것이 도움이되는지 확실하지 않지만, 내가 생각할 수있는 전부입니다.


무엇 중력장은 ?
David Cowden

0

각 시간 단계가 끝나면 데이터를 그래프로 변환하고 최소 스패닝 트리를 계산 한 다음 특정 임계 값을 초과하는 가장자리를 제거 할 수 있습니다. 이렇게하면 덩어리가 생기고 각 덩어리의 입자를 쉽게 열거 할 수 있습니다.

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