2008-09-18 10 views
3

사용자가 서로 상호 작용하는 응용 프로그램이 있습니다. 이러한 상호 작용을 시각화하여 사용자 클러스터가 존재하는지 (상호 작용이 더 자주 발생하는지) 확인할 수 있도록하려고합니다.사용자 클러스터를 시각화하려면 어떻게합니까?

각 사용자에게 2 차원 점을 지정했습니다 (각 좌표는 0과 1 사이입니다). 내 아이디어는 두 사용자의 상호 작용이 서로 밀접한 관계를 맺고 "매력있는 힘"이 넘치며 상호 작용 로그를 반복해서 반복적으로 사용한다는 것입니다.

당연히, 나는 "반발력 (repulsive force)"이 필요하다. 그렇지 않으면 사용자들을 서로 밀어 붙일 것이다. 그렇지 않으면 모두 단일 지점으로 붕괴 할 것이다.

처음에는 각 XY 좌표 중 가장 낮은 값과 가장 높은 값을 모니터링하고 위치를 정규화하려고 시도했지만 작동하지 않았습니다. 약간의 상호 작용이있는 일부 사용자가 가장자리에 머물렀고 나머지는 모두 접혀있었습니다 중간에.

사용자가 상호 작용할 때 "매력적"인 힘과 단일 지점에 모든 것이 붕괴되는 것을 막는 "반발하는"힘을 위해 포인트를 이동하는 데 사용해야하는 방정식을 아는 사람이 있습니까?

편집 : 질문에 대한 응답으로 약 1 백만 명의 사용자와 사용자 간의 상호 작용이 약 1 천만 건에 달한다는 점을 지적해야합니다. 누구나 나를 위해이 작업을 수행 할 수있는 도구를 추천 할 수 있다면 나는 완전히 귀를 기울입니다 :-)

+0

답변을주었습니다. 그러나 가중치가있는 상호 작용 그래프를 구성하지 않고 graphviz 스프링 모델 렌더러를 통해 실행하거나 데이터에 대해 클러스터링 알고리즘을 실행해야하는 이유는 무엇입니까? 열심히 응시하는 것 이외에 클러스터하는 방법이 있습니다. –

+0

문제는 제가 약 1 백만 명의 사용자와 1,000 만 건의 상호 작용을 처리하고 있다는 것입니다. 그래프 비즈가 그걸 감당할 수 있다고 생각하니? – sanity

+0

음 ... graphviz의 레이아웃 엔진은 다소 느릴 수 있습니다. 그러나 PERL 스크립트에서 간단한 집적 클러스터링과 방사형 레이아웃이 작동해야합니다. 연결 그래프를 graphviz 형식으로 구성하고 해당 pkg에서 twopi 또는 circo를 실행하면 작동 할 수 있습니다. –

답변

2

과거에는 이런 종류의 시도를했을 때 스프링 노드 모델을 사용하여 연결된 노드를 연결했습니다. dx = -k*(x-l). dx은 위치 변경으로 x은 현재 위치이고 l은 원하는 간격이고 k은 스프링 강도와 안정성 사이의 균형을 잘 잡을 때까지 조정할 수있는 스프링 계수이며 0.1보다 작습니다. l > 0을 가지면 모든 것이 중간에 있지 않게됩니다.

그 외에도 모든 노드 사이에 일반적인 "반발하는"힘이 확산됩니다 (예 : dx = k/x^2). 이것은 합당한 효과를 얻기 위해 k을 조정하면 두 노드가 가까울수록 커질 것입니다.

1

나는 가능한 한 추천 할 수 있습니다 : 우선, 상호 작용을 로그 - 스케일링하거나 S 자형 함수로 실행하여 범위를 스쿼시하십시오 . 이렇게하면 간격을 더 부드럽게 시각적으로 분배 할 수 있습니다.

이 스케일링 문제와 무관하게 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). 
마지막으로, 스케일링 전략 중 하나, 인력 및 항력 계수 대신에 반발력의 일종을 고려하십시오. 사실 더 가까운 곳으로 물건을 옮기는 것은 일 것입니다.

이 결국이 축소되지만 느리게 진행되는 모델을 고려해보십시오. 그런 다음 조건이 충족 될 때까지 (노드가 레이아웃 영역의 중심을 가로 지르거나 그와 같이 교차 할 때까지) 실행하십시오.

드래그 또는 운동량은 동작에 대한 기본적인 저항으로 인코딩되어 움직임을 조절할 수 있습니다. 차별적으로 적용 할 수 있습니다 (상황이 얼마나 멀리, 공간에 있는지, 다른 노드가 얼마나 가까이에 있는지 등을 기준으로 느리게 움직일 수 있습니다).

희망이 도움이됩니다.

0

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

또한 노드가 적지 않은 경우 3D로이 작업을 수행합니다. 여분의 자유도는 더 나은 솔루션을 제공하며, 2D보다 좋지 않은 경우에도 3D로 클러스터를 시각화 할 수 있어야합니다.