문제

사용자가 서로 상호 작용하는 응용 프로그램이 있습니다.나는 이러한 상호 작용을 시각화하여 사용자 클러스터가 존재하는지 여부(상호 작용이 더 빈번한 그룹 내에서)를 확인할 수 있도록 하고 싶습니다.

각 사용자에게 2D 점을 할당했습니다(각 좌표는 0과 1 사이임).내 생각은 두 사용자의 포인트가 상호 작용할 때 서로 더 가까워진다는 것입니다. 이는 "흡인력"이며 상호 작용 로그를 계속해서 반복해서 살펴봅니다.

물론 사용자도 밀어낼 수 있는 '척력'이 필요합니다. 그렇지 않으면 사용자가 모두 한 지점으로 붕괴될 것입니다.

먼저 각 XY 좌표의 최저 및 최고를 모니터링하고 위치를 정규화하려고 시도했지만 작동하지 않았습니다. 상호 작용 수가 적은 소수의 사용자는 가장자리에 머물고 나머지는 모두 가운데로 무너졌습니다.

사용자가 상호 작용할 때 사용자 간의 "흡인력"과 사용자가 모두 단일 지점으로 붕괴되는 것을 방지하는 "척력"에 대해 점을 이동하기 위해 어떤 방정식을 사용해야 하는지 아는 사람이 있습니까?

편집하다:질문에 대한 응답으로 저는 약 100만 명의 사용자와 약 1천만 건의 사용자 간 상호 작용을 다루고 있음을 지적해야 합니다.누구든지 나를 위해 이 작업을 수행할 수 있는 도구를 추천할 수 있다면 나는 귀를 기울일 것입니다 :-)

도움이 되었습니까?

해결책

과거에 이런 종류의 작업을 시도했을 때 스프링 모델을 사용하여 다음과 같이 연결된 노드를 함께 끌어왔습니다. dx = -k*(x-l). dx 입장 변화다. x 현재 위치이고, l 원하는 분리이고, k 스프링 강도와 안정성 사이의 균형이 잘 맞을 때까지 조정하는 스프링 계수는 0.1 미만입니다.데 l > 0 모든 것이 중간에 끝나지 않도록 보장합니다.

게다가 모든 노드 사이의 일반적인 "척력"은 다음과 같이 노드를 분산시킵니다. dx = k / x^2.두 노드가 가까울수록 더 커집니다. k 합리적인 효과를 얻으려면

다른 팁

몇 가지 가능성을 추천해 드릴 수 있습니다.먼저 상호작용을 로그 스케일링하거나 시그모이드 함수를 통해 실행하여 범위를 압축해 보세요.이렇게 하면 시각적으로 더 부드러운 간격 분포를 얻을 수 있습니다.

이 확장 문제와 무관:graphviz의 일부 렌더링 전략, 특히 "neato" 및 "fdp" 프로그램을 살펴보세요.매뉴얼 페이지에서:

  neato  draws  undirected graphs using ``spring'' models (see Kamada and
  Kawai, Information Processing Letters 31:1, April 1989).   Input files
  must  be  formatted  in the dot attributed graph language.  By default,
  the output  of  neato  is  the  input  graph  with  layout coordinates
  appended.

  fdp  draws  undirected  graphs using a ``spring'' model. It relies on a
  force-directed approach in the spirit of Fruchterman and Reingold  (cf.
  Software-Practice & Experience 21(11), 1991, pp. 1129-1164).

마지막으로, 스케일링 전략 중 하나, 인력, 반발력 대신 일종의 항력 계수를 고려하십시오.실제로 물건을 더 가까이 옮기는 중 그리고 그러면 나중에 더 멀리 순환 동작이 나타날 수도 있습니다.

모든 것이 포함된 모델을 고려해보세요. ~ 할 것이다 결국 무너지지만 천천히.그런 다음 일부 조건이 충족될 때까지 실행합니다(노드가 레이아웃 영역의 중심을 가로지르는 등).

끌림이나 운동량은 움직임에 대한 기본적인 저항과 움직임을 조절하는 양으로 인코딩될 수 있습니다.차등적으로 적용될 수 있습니다(사물이 얼마나 멀리 갔는지, 공간에 어디에 있는지, 얼마나 많은 다른 노드가 가까이 있는지 등에 따라 느리게 움직일 수 있습니다).

도움이 되었기를 바랍니다.

스프링 모델은 이를 수행하는 전통적인 방법입니다.상호 작용을 기반으로 각 노드 사이에 인력을 만들고, 거리의 역제곱을 기반으로 모든 노드 사이에 반발력을 만듭니다.그런 다음 에너지를 최소화하여 해결하십시오.노드가 몇 개 이상인 경우 이에 대한 효율적인 솔루션을 얻으려면 상당히 강력한 프로그래밍이 필요할 수 있습니다.시작 위치가 무작위인지 확인하고 프로그램을 여러 번 실행하십시오.이와 같은 경우에는 거의 항상 여러 개의 로컬 에너지 최소값이 포함되어 있으므로 좋은 것을 얻었는지 확인하려고 합니다.

또한 노드가 몇 개밖에 없는 한 이 작업을 3D로 수행하겠습니다.추가적인 자유도를 통해 더 나은 솔루션이 가능하며, 2D보다 좋지는 않더라도 3D에서도 클러스터를 시각화할 수 있어야 합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top