Cách tiếp cận và ví dụ về phân cụm đồ thị trong Tiếng Riếp


10

Tôi đang tìm cách nhóm / hợp nhất các nút trong biểu đồ bằng cách sử dụng phân cụm biểu đồ trong 'r'.

Đây là một biến thể đồ chơi tuyệt vời của vấn đề của tôi.

  • Có hai "cụm"
  • Có một "cây cầu" nối các cụm

Đây là một mạng ứng cử viên:
nhập mô tả hình ảnh ở đây

Khi tôi nhìn vào khoảng cách kết nối, "hopcount", nếu bạn muốn, thì tôi có thể nhận được ma trận sau:

 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))

Suy nghĩ ở đây:

  • Do may mắn hoặc do sự đơn giản của đồ chơi, ma trận có các bản vá rõ ràng, điều này sẽ không xảy ra trong ma trận (rất lớn). Nếu tôi chọn ngẫu nhiên mối quan hệ giữa điểm và hàng thì nó sẽ không quá rõ ràng.
  • Tôi có thể có một lỗi sai - vì vậy nếu tôi có một lỗi đánh máy, hãy cho tôi biết.
  • Hop-Count ở đây là số bước nhảy ngắn nhất để kết nối điểm trên hàng i với điểm trên cột j. Một tự nhảy vẫn là một hop, vì vậy đường chéo là tất cả.

Vì vậy, trong ma trận này khoảng cách lớn hơn (hoa bia) có số lượng cao hơn. Nếu tôi muốn một ma trận hiển thị "kết nối" thay vì khoảng cách, thì tôi có thể thực hiện nghịch đảo dấu chấm, trong đó mỗi ô của ma trận được thay thế bằng nghịch đảo nhân của nó.

Câu hỏi:

Để giúp tôi tìm ra con đường của riêng mình:

  • Các điều khoản để giảm số lượng nút trên biểu đồ bằng cách kết hợp chúng là gì? Có phải cụm, hợp nhất, munging - những từ mà tôi nên sử dụng là gì?
  • Các kỹ thuật đã được chứng minh là gì? Có một cuốn sách giáo khoa về chủ đề này? Bạn có thể chỉ vào giấy tờ hoặc trang web?
  • Bây giờ tôi đã cố gắng nhìn vào đây trước - đó là một điểm "kiểm tra đầu tiên" tuyệt vời. Tôi đã không tìm thấy những gì tôi đang tìm kiếm. Nếu tôi bỏ lỡ nó (không có khả năng) bạn có thể chỉ cho tôi một hoặc hai câu hỏi được trả lời về chủ đề ở đây tại CV không?

Để đưa tôi đến nơi tôi sẽ đến:

  • Có gói 'R' nào sẽ phân cụm đúng các nút trên mạng không?
  • Bạn có thể chỉ cho tôi ví dụ mã để làm điều này?
  • Có gói 'R' nào sẽ trình bày đồ họa của mạng giảm kết quả không?
  • Bạn có thể chỉ cho tôi ví dụ mã để làm điều này?

Cảm ơn trước.


2
Xin lưu ý rằng việc yêu cầu các gói (R) hoặc mã không có chủ đề ở đây. Bạn có thể muốn làm cho phần "tìm" nổi bật hơn và phần "nhận" ít hơn.
gung - Phục hồi Monica

3
Thỉnh thoảng tôi sẽ cố gắng trả lời đầy đủ khi có cơ hội @gung. Nhưng để có câu trả lời nhanh ở đây là phát hiện cộng đồng được áp dụng cho biểu đồ ví dụ của EngrStudent bằng igraphgói R.
Andy W

1
IMHO chỉ có một cụm trong biểu đồ này. Tuy nhiên, có ba cụm chồng chéo . Tôi không biết lý do tại sao kế hoạch của bạn là phá hủy cụm trung gian - trừ khi bạn có thể chính thức hóa việc này, bạn sẽ khó tìm được thuật toán.
Có QUIT - Anony-Mousse

2
Để biết giá trị của nó, mcl ( micans.org/mcl ) tìm thấy hai cụm (tôi không thực sự đồng ý với đánh giá của Anony-Mousse và tôi không thấy cách tiếp cận mô hình hóa cụm sao cho cụm đồ thị đặc biệt hiệu quả). Đây là với tham số duy nhất (kiểm soát độ chi tiết) được đặt thành mặc định. Thuật toán này (mcl - tôi đã xuất bản nó) được sử dụng khá rộng rãi trong tin sinh học, và mã nguồn (có khả năng mở rộng cao) có sẵn. Giao diện với R được thực hiện dễ dàng bằng giao diện văn bản.
micans

2
Yêu cầu mã & gói về cơ bản luôn luôn lạc đề ở đây. Yêu cầu trợ giúp với mã hiện có (ví dụ: bạn có một ví dụ có thể lặp lại ) là chủ đề trên Stack Overflow . Nếu bạn không biết điều này, đã đến lúc tìm hiểu nó. Ý tưởng rằng người dùng trả lời R Qs trên SO không có chuyên môn thống kê đối với tôi là lạ, nhưng nhiều người dường như cho rằng; Ở mức nào thì nó không đúng. Rằng Q của bạn đã được trả lời bởi một bài viết SO nên nói điều gì đó ở đây. OTOH, nói rằng 'loại phân tích này là gì, ai đó có thể chỉ cho tôi tài nguyên' chắc chắn là chủ đề ở đây.
gung - Phục hồi Monica

Câu trả lời:


9

Ví dụ cụ thể của bạn đề xuất tìm các cộng đồng trong mạng có nhiều kết nối hơn giữa các nút trong cộng đồng và tương đối ít cạnh giữa các nút trong các cộng đồng khác nhau. Điều này khác với việc tìm kiếm các cộng đồng bị cô lập , trong đó có các sơ đồ con hoàn toàn bị ngắt kết nối.

Dưới đây là một ví dụ về phát hiện cộng đồng trong R bằng cách sử dụng igraphgói và thuật toán được mô tả trong Clauset et al. (2004) . Để sử dụng thuật toán này, tôi biến "số đếm hop" của bạn thành ma trận kề nhị phân không có vòng lặp. Thuật toán cần một ma trận vô hướng, phù hợp với sơ đồ viết tay của bạn và dữ liệu bạn cung cấp (các cạnh là đối xứng).

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)

nhập mô tả hình ảnh ở đây

Tôi không thể nhận xét về sự phù hợp của việc thu gọn các nút như vậy để phân tích thêm, nhưng phát hiện cộng đồng như vậy chắc chắn hữu ích cho việc khám phá mạng. Có rất nhiều thuật toán phát hiện cộng đồng khác (cũng như các thư viện khác để phân tích mạng trong R). Đây chỉ là một ví dụ xảy ra để tạo đầu ra mong muốn của bạn cho vấn đề đồ chơi này.


1
Cũng đưa ra các nhận xét trước đó về việc sử dụng cơ sở dữ liệu biểu đồ, bạn không cần phải có biểu đồ dưới dạng ma trận kề. Một bảng cho các nút và một hàng cho mỗi cạnh là một định dạng điển hình / hiệu quả hơn và bạn có thể biến nó thành một igraphmạng.
Andy W

1

Nếu bạn chưa kết hôn với một kho lưu trữ cho nút và dữ liệu kết nối của mình, bạn có thể xem gói Rneo4j. Nhưng điều này ngụ ý việc sử dụng neo4j (cơ sở dữ liệu đồ thị, không phải RDBMS) để lưu trữ dữ liệu của bạn. Tôi không phải là chuyên gia ở đây, nhưng tôi nghĩ cách tiếp cận này có thể đặc biệt hiệu quả nếu a) như được đề xuất bởi Anony-Mousse, bạn không thể chính thức hóa điều này, hoặc b) số lượng nút và kết nối đặc biệt lớn, hoặc c) bạn gió có thêm câu hỏi liên quan đến mạng của bạn.


Tôi không biết một thứ như vậy tồn tại. Khéo léo! Đây có phải là một ví dụ điển hình của vật liệu? nicolewhite.github.io/RNeo4j/examples
EngrStudent 27/2/2015

Làm thế nào một người sẽ đi từ dữ liệu trong neo4j để phân cụm đồ thị? Mcl hoặc igraph sẽ làm việc với nó?
EngrStudent 2/03/2015

2
Khi bạn đã kéo dữ liệu của mình từ neo4j vào R, bạn có thể sử dụng bất kỳ gói R nào khác (ví dụ: AndyW gợi ý igraph) đối với dữ liệu. Ngoài ra - gói Rneo4j bao gồm các lệnh để truy xuất dữ liệu và cũng cho phép bạn chạy ngôn ngữ truy vấn Cypher (tương tự như SQL, nhưng được xây dựng tùy chỉnh cho db đồ thị neo4j). Trong Cypher, bạn có thể thực hiện các truy vấn tinh vi và chạy một số thuật toán được xác định trước (Đường dẫn ngắn nhất, tất cả đường dẫn, tất cả đường dẫn đơn giản, Dijkstra, v.v.). Tôi ở giới hạn của mình ở đây cả về nhân vật và nội dung - Nếu bạn muốn đi theo con đường này (xin lỗi!), Trang web neo4j có thể là điểm dừng chân tiếp theo của bạn.
dùng3123116 ngày

1

Đối với độc giả tương lai,

Đây là một bộ các chức năng từ các gói igraph và cái cuối cùng là từ 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)

Bạn có thể tìm tài liệu ở đây http://ecraft.org/r/doc/ và tại đây https://cran.r-project.org/web/packages/MCL/MCL.pdf

Tôi thấy walktrap đặc biệt hữu ích


Mặc dù điều này có thể liên quan đến câu hỏi nhưng nó dường như không phải là một câu trả lời.
Michael R. Chernick

2
tôi đã trả lời hai câu hỏi: Có gói 'R' nào sẽ phân cụm đúng các nút trên mạng không? Bạn có thể chỉ cho tôi ví dụ mã để làm điều này? Nhưng có, nó không trả lời toàn bộ câu hỏi.
Omar Jaafor 22/03/18
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.