"R"에서 그래프 클러스터링의 접근 및 예


10

'r'의 그래프 클러스터링을 사용하여 그래프에서 노드를 그룹화 / 병합하려고합니다.

여기 내 문제의 놀랍도록 장난감 변형이 있습니다.

  • 두 개의 "클러스터"가 있습니다
  • 클러스터를 연결하는 "브리지"가 있습니다

후보 네트워크는 다음과 같습니다.
여기에 이미지 설명을 입력하십시오

연결 거리 "hopcount"를 보면 다음 행렬을 얻을 수 있습니다.

 mymatrix <- rbind(
     c(1,1,2,3,3,3,2,1,1,1),
     c(1,1,1,2,2,2,1,1,1,1),
     c(2,1,1,1,1,1,1,1,2,2),
     c(3,2,1,1,1,1,1,2,3,3),
     c(3,2,1,1,1,1,1,2,3,3),
     c(3,2,1,1,1,1,1,2,2,2),
     c(2,1,1,1,1,1,1,1,2,2),
     c(1,1,1,2,2,2,1,1,1,1),
     c(1,1,2,3,3,2,2,1,1,1),
     c(1,1,2,3,3,2,2,1,1,1))

여기에 생각 :

  • 운이 좋거나 장난감의 단순성으로 인해 매트릭스에는 명백한 패치가 있으며 (매우 큰) 매트릭스에서는 그렇지 않습니다. 점과 행 사이의 관계를 무작위로 지정하면 그렇게 깨끗하지 않습니다.
  • 한 가지 잘못되었을 수 있으므로 오타가 있으면 알려주십시오.
  • 여기서 홉 수는 행 i의 포인트를 열 j의 포인트와 연결하는 가장 짧은 홉 수입니다. 셀프 홉은 여전히 ​​홉이므로 대각선은 모두 홉입니다.

따라서이 행렬에서 더 큰 거리 (홉)의 수가 더 높습니다. 거리 대신 "연결성"을 표시하는 행렬을 원한다면 행렬의 각 셀이 곱셈 역으로 대체되는 점 역을 할 수 있습니다.

질문 :

내 길을 찾도록 돕기 위해 :

  • 그래프의 노드 수를 결합하여 노드 수를 줄이는 용어는 무엇입니까? 클러스터링, 병합, 녹이는가? 사용해야하는 단어는 무엇입니까?
  • 입증 된 기술은 무엇입니까? 주제에 대한 교과서가 있습니까? 논문이나 웹 사이트를 가리킬 수 있습니까?
  • 이제 먼저 여기를 보았습니다. 훌륭한 "첫 번째 확인"지점입니다. 내가 찾던 것을 찾지 못했습니다. 내가 그것을 놓친 경우 (아마도) CV의 주제에 대한 답변이있는 질문을 하나라도 지적 해 주시겠습니까?

내가가는 곳을 얻으려면 :

  • 네트워크의 노드를 올바르게 클러스터링하는 'R'패키지가 있습니까?
  • 이 작업을 수행하는 예제 코드를 알려주시겠습니까?
  • 축소 된 네트워크 결과를 그래픽으로 표시하는 'R'패키지가 있습니까?
  • 이 작업을 수행하는 예제 코드를 알려주시겠습니까?

미리 감사드립니다.


2
여기서는 (R) 패키지 또는 코드를 요청하는 것이 주제가 아닙니다. "find"부분을 더 두드러지게하고 "get"부분을 덜 만들고자 할 수 있습니다.
gung-복직 모니카

3
나는 @gung 기회를 얻을 때 언젠가 전체 답변을하려고합니다. 그러나 빠른 대답을 위해 여기 에 R igraph패키지를 사용하는 EngrStudent의 예제 그래프에 적용되는 커뮤니티 감지가 있습니다.
Andy W

1
IMHO이 그래프에는 클러스터가 하나만 있습니다. 그러나 겹치는 세 개의 파편이 있습니다. 나는 당신의 계획이 중도파를 파괴하려는 이유를 모른다. 이것을 공식화 할 수 없다면 알고리즘을 찾는 데 어려움을 겪을 것이다.
종료-익명-무스

2
가치가있는 것에 대해 mcl ( micans.org/mcl )은 두 클러스터를 찾습니다 (나는 실제로 Anony-Mousse의 평가에 동의하지 않으며 그래프 클러스터링에 특히 유익한 결정적 접근법을 찾지 못합니다). 단일 매개 변수 (세분화 제어)가 기본값으로 설정되어 있습니다. 이 알고리즘 (mcl-I 게시)은 생물 정보학에서 상당히 널리 사용되며 (확장 성이 높은) 소스 코드를 사용할 수 있습니다. R과의 인터페이스는 텍스트 인터페이스를 사용하여 쉽게 수행 할 수 있습니다.
micans

2
코드와 패키지를 요청하는 것은 본질적으로 항상 주제가 아닙니다. 기존 코드에 대한 도움 요청 (즉, 재현 가능한 예가 있음 )은 스택 오버플로 에 대한 주제입니다 . 이것을 모른다면 배울 차례입니다. SO에 대한 R Q에 응답하는 사용자에게는 통계 전문 지식이 없다는 생각은 이상하지만 많은 사람들이 그렇게 생각합니다. 어쨌든 그것은 사실이 아닙니다. 귀하의 Q가 SO 게시물에 의해 답변되었다는 것을 여기에 말해야합니다. OTOH는 '어떤 종류의 분석인지, 누군가가 나를 자원으로 안내 할 수 있습니까?'라고 말하는 것은 분명히 주제입니다.
gung-복직 모니카

답변:


9

특정 예에서는 커뮤니티의 노드 사이에 더 많은 연결이 있고 다른 커뮤니티의 노드 사이에 상대적으로 적은 가장자리가있는 네트워크 내 커뮤니티를 찾는 것이 좋습니다 . 이것은 완전히 분리 된 하위 그래프가있는 고립 된 커뮤니티 를 찾는 것과 다릅니다 .

다음은 Clauset et al.에igraph 설명 된 패키지와 알고리즘을 사용하여 R에서 커뮤니티 감지의 예입니다 . (2004) . 이 알고리즘을 사용하기 위해 "홉 수"를 자체 루프가없는 이진 인접 행렬로 바꿉니다. 이 알고리즘에는 직접 작성하지 않은 다이어그램 및 제공 한 데이터 (가장자리가 대칭 임)와 일치하는 무 방향 매트릭스가 필요합니다.

library(igraph)
mymatrix <- rbind(
     c(1,1,2,3,3,3,2,1,1,1),
     c(1,1,1,2,2,2,1,1,1,1),
     c(2,1,1,1,1,1,1,1,2,2),
     c(3,2,1,1,1,1,1,2,3,3),
     c(3,2,1,1,1,1,1,2,3,3),
     c(3,2,1,1,1,1,1,2,2,2),
     c(2,1,1,1,1,1,1,1,2,2),
     c(1,1,1,2,2,2,1,1,1,1),
     c(1,1,2,3,3,2,2,1,1,1),
     c(1,1,2,3,3,2,2,1,1,1))

#turn this into an adjacency matrix
adjMat <- mymatrix == 1
diag(adjMat) <- 0 #no self loops

g  <- graph.adjacency(adjMat)
plot(g)

#only works for undirected graphs, which this example is fine since symetric
fc <- fastgreedy.community(as.undirected(g))

#make colors for different communities
V(g)$color <- ifelse(membership(fc)==1,"red","blue")
plot(g)

여기에 이미지 설명을 입력하십시오

추가 분석을 위해 이러한 노드를 축소하는 것이 적절하다는 점에 대해서는 언급 할 수 없지만 이러한 커뮤니티 감지는 네트워크 탐색에 확실히 유용합니다. 다른 커뮤니티 감지 알고리즘도 많이 있습니다 (R의 네트워크 분석을위한 다른 라이브러리). 이것은이 장난감 문제에 대한 원하는 출력을 생성하는 한 가지 예입니다.


1
또한 그래프 데이터베이스 사용에 대한 이전 의견이 주어지면 그래프를 인접 행렬로 나타내지 않아도 됩니다. 노드에 대한 테이블과 각 에지에 대한 행이보다 일반적이고 효율적인 형식이며이를 igraph네트워크 로 전환 할 수 있습니다 .
Andy W

1

노드 및 연결 데이터의 저장소에 아직 연결되지 않은 경우 Rneo4j 패키지를 볼 수 있습니다. 그러나 이것은 데이터를 저장하기 위해 neo4j (RDBMS가 아닌 그래프 데이터베이스)를 사용함을 의미합니다. 나는 여기에 전문가가 아니지만 a) Anony-Mousse가 제안한대로 공식화 할 수 없거나 b) 노드와 연결 수가 특히 많거나 c) 바람이 불면이 방법이 특히 효과적이라고 생각합니다. 네트워크에 관한 추가 질문이 있습니다.


나는 그런 것이 존재하는지 몰랐다. 산뜻한! 이것은 자료의 괜찮은 예입니까? nicolewhite.github.io/RNeo4j/examples
EngrStudent

neo4j의 데이터에서 그래프 클러스터링으로 어떻게 이동합니까? mcl 또는 igraph가 작동합니까?
EngrStudent

2
neo4j에서 R로 데이터를 가져 오면 데이터에 대해 다른 R 패키지 (예 : AndyW 제안 igraph)를 사용할 수 있습니다. 또는 Rneo4j 패키지에는 데이터 검색 명령이 포함되어 있으며 Cypher 쿼리 언어 (SQL과 유사하지만 neo4j 그래프 db에 대해 사용자 정의 된)를 실행할 수 있습니다. Cypher에서는 정교한 쿼리를 수행하고 사전 정의 된 알고리즘 (가장 짧은 경로, 모든 경로, 모든 단순 경로, Dijkstra 등)을 실행할 수 있습니다. 나는 문자와 내용 모두에서 한계에 도달했습니다-이 길을 가고 싶다면 (죄송합니다!), neo4j 사이트가 다음 정류장 일 수 있습니다.
user3123116

1

미래의 독자들을 위해

다음은 igraph 패키지의 함수 세트이며 마지막은 MCL의 함수입니다.

print("LABEL PROPAGATION")
w<-cluster_label_prop(g)

print("Leading Eigen")
w<-cluster_leading_eigen(g)

print("SpinGlass")
w<-cluster_spinglass(g, stop.temp = 0.05)

print("walktrap")
w<-cluster_walktrap(g, steps=4)

print("MCL")
adj<-get.adjacency(g)
w<-mcl(adj,addLoops=TRUE)

http://igraph.org/r/doc/ 및 여기 https://cran.r-project.org/web/packages/MCL/MCL.pdf 에서 설명서를 찾을 수 있습니다.

워크 트랩이 특히 유용하다고 생각합니다


이것은 질문과 관련이있을 수 있지만 답이 아닌 것 같습니다.
Michael R. Chernick

2
나는 두 가지 질문에 대답했다 : 네트워크에서 노드를 올바르게 클러스터링하는 'R'패키지가 있습니까? 이 작업을 수행하는 예제 코드를 알려주시겠습니까? 그러나 예, 그것은 모든 질문에 대답하지 않습니다.
Omar Jaafor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.