วิธีการและตัวอย่างของการจัดกลุ่มกราฟใน“ 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))

ความคิดที่นี่:

  • โชคหรือเนื่องจากความเรียบง่ายของของเล่นเมทริกซ์มีแพทช์ที่เห็นได้ชัดนี่ไม่ใช่กรณีในเมทริกซ์ (ใหญ่มาก) ถ้าฉันสุ่มความสัมพันธ์ระหว่างจุดกับแถวมันจะไม่สะอาด
  • ฉันอาจจะผิดหนึ่ง - ดังนั้นถ้าฉันพิมพ์ผิดแจ้งให้ฉันทราบ
  • Hop-count ที่นี่คือจำนวน hops ที่สั้นที่สุดเพื่อเชื่อมต่อจุดบนแถว i กับจุดบนคอลัมน์ j การกระโดดด้วยตัวเองยังคงเป็นการกระโดดดังนั้นเส้นทแยงมุมจึงเป็นเส้นโค้งทั้งหมด

ดังนั้นในเมทริกซ์นี้ระยะทางที่มากขึ้น (ฮ็อพ) มีจำนวนมาก ถ้าฉันต้องการเมทริกซ์ที่แสดง "การเชื่อมต่อ" แทนระยะทางฉันสามารถทำ dot-inverse ซึ่งแต่ละเซลล์ของเมทริกซ์จะถูกแทนที่ด้วยอินเวอร์สแบบคูณ

คำถาม:

เพื่อช่วยฉันหาทางของตัวเอง:

  • ข้อกำหนดในการลดจำนวนโหนดในกราฟโดยรวมเป็นอย่างไร มันคือการรวมกลุ่ม, การรวมกัน, munging - คำที่ฉันควรใช้คืออะไร?
  • เทคนิคการพิสูจน์คืออะไร? มีตำราในหัวข้อหรือไม่ คุณสามารถชี้ไปที่เอกสารหรือเว็บไซต์ได้หรือไม่?
  • ตอนนี้ฉันพยายามที่จะดูที่นี่ก่อน - มันเป็นจุด "ตรวจสอบครั้งแรก" ที่ยอดเยี่ยม ฉันไม่พบสิ่งที่ต้องการ หากฉันไม่ได้รับมัน (ไม่น่าเป็นไปได้) คุณสามารถชี้ให้ฉันตอบคำถามหนึ่งหรือสองคำถามในหัวข้อที่ CV ที่นี่ได้ไหม?

รับฉันไปที่ฉันจะไป:

  • มีแพ็คเกจ 'R' ที่จัดกลุ่มโหนดบนเครือข่ายให้เหมาะสมหรือไม่
  • คุณช่วยชี้ให้ฉันดูโค้ดตัวอย่างเพื่อทำสิ่งนี้ได้ไหม
  • มีแพ็คเกจ 'R' ที่จะแสดงเครือข่ายที่ลดลงแบบกราฟิกหรือไม่?
  • คุณช่วยชี้ให้ฉันดูโค้ดตัวอย่างเพื่อทำสิ่งนี้ได้ไหม

ขอบคุณล่วงหน้า.


2
โปรดทราบว่าการขอแพคเกจ (R) หรือรหัสเป็นหัวข้อที่นี่ คุณอาจต้องการทำให้ส่วน "ค้นหา" โดดเด่นยิ่งขึ้น & ส่วน "รับ" น้อยลง
gung - Reinstate Monica

3
ฉันจะพยายามหาคำตอบแบบเต็มบางครั้งเมื่อฉันได้รับโอกาส @gung แต่สำหรับคำตอบอย่างรวดเร็วนี่คือการตรวจจับชุมชนที่ใช้กับกราฟตัวอย่างของ EngrStudent โดยใช้igraphแพ็คเกจR
Andy W

1
IMHO มีเพียงหนึ่งคลัสเตอร์ในกราฟนี้ มี แต่สามทับซ้อนกันเป็นชมรม ฉันไม่รู้ว่าทำไมแผนของคุณคือทำลายกลุ่มกลาง - ถ้าคุณไม่สามารถทำให้เป็นระเบียบแบบนี้คุณจะพบกับอัลกอริทึมยาก
จบแล้ว - Anony-Mousse

2
สำหรับสิ่งที่คุ้มค่า mcl ( micans.org/mcl ) พบสองกลุ่ม (ฉันไม่เห็นด้วยกับการประเมินของ Anony-Mousse และฉันไม่พบวิธีการสร้างแบบจำลองกลุ่มเพื่อจัดกลุ่มกราฟโดยเฉพาะอย่างยิ่งมีผล) นี่คือการตั้งค่าพารามิเตอร์เดียว (การควบคุมที่ละเอียด) เป็นค่าเริ่มต้น อัลกอริทึมนี้ (mcl - ฉันเผยแพร่แล้ว) ใช้กันอย่างแพร่หลายในด้านชีวสารสนเทศศาสตร์และมีซอร์สโค้ด (ปรับขยายได้สูง) พร้อมใช้งาน การเชื่อมต่อกับ R ทำได้อย่างง่ายดายโดยใช้อินเตอร์เฟสข้อความ
micans

2
การขอรหัสและแพ็คเกจมักไม่ได้อยู่ที่นี่เสมอ ขอความช่วยเหลือ w / รหัสที่มีอยู่ (เช่นคุณมีตัวอย่างที่สามารถทำซ้ำได้ ) อยู่ในหัวข้อเกี่ยวกับกองมากเกิน ถ้าคุณไม่รู้เรื่องนี้ก็ถึงเวลาเรียนรู้ ความคิดที่ว่าผู้ใช้ที่ตอบคำถาม R Qs นั้นไม่มีความเชี่ยวชาญทางสถิติเป็นเรื่องแปลกสำหรับฉัน แต่หลายคนดูเหมือนจะคิดเช่นนั้น ไม่ว่าจะในอัตราใดก็ตาม ที่ Q ของคุณได้รับคำตอบจากโพสต์ดังนั้นควรพูดอะไรบางอย่างที่นี่ OTOH โดยพูดว่า 'การวิเคราะห์แบบนี้คือใครบางคนชี้ให้ฉันเห็นทรัพยากร' เป็นหัวข้อที่นี่แน่นอน
gung - Reinstate Monica

คำตอบ:


9

ตัวอย่างเฉพาะของคุณแนะนำการค้นหาชุมชนภายในเครือข่ายที่มีการเชื่อมต่อระหว่างโหนดในชุมชนและขอบค่อนข้างน้อยระหว่างโหนดในชุมชนต่าง ๆ สิ่งนี้แตกต่างจากการค้นหาชุมชนแยกซึ่งมีกราฟย่อยที่ตัดการเชื่อมต่ออย่างสมบูรณ์

นี่คือตัวอย่างของการตรวจจับชุมชนใน R โดยใช้igraphแพคเกจและอัลกอริทึมที่อธิบายไว้ในClauset และคณะ (2004) ในการใช้อัลกอริทึมนี้ฉันจะแปลง "hop count" ของคุณให้เป็นเมทริกซ์ adjacency แบบไบนารีโดยไม่มีการวนซ้ำในตัวเอง อัลกอริทึมนั้นต้องการเมทริกซ์ที่ไม่ได้บอกทิศทางซึ่งสอดคล้องกับไดอะแกรมที่เขียนด้วยมือของคุณและข้อมูลที่คุณให้ (ขอบนั้นสมมาตร)

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
ยังได้รับความคิดเห็นก่อนหน้าเกี่ยวกับการใช้ฐานข้อมูลกราฟคุณไม่จำเป็นต้องมีกราฟแสดงเป็นเมทริกซ์ adjacency ตารางสำหรับโหนดและแถวสำหรับแต่ละขอบเป็นรูปแบบทั่วไป / มีประสิทธิภาพมากขึ้นและคุณสามารถเปลี่ยนให้เป็น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 แนะนำให้เขียนด้วยลายมือ) กับข้อมูล อีกทางเลือกหนึ่ง - แพ็คเกจ 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

ฉันพบว่า Walktrap มีประโยชน์อย่างยิ่ง


แม้ว่าสิ่งนี้อาจเกี่ยวข้องกับคำถาม แต่ดูเหมือนจะไม่ใช่คำตอบ
Michael R. Chernick

2
ฉันตอบคำถามสองข้อ: มีแพ็คเกจ 'R' ที่จะทำการรวมโหนดในเครือข่ายอย่างถูกต้องหรือไม่ คุณช่วยชี้ให้ฉันดูโค้ดตัวอย่างเพื่อทำสิ่งนี้ได้ไหม แต่ใช่มันไม่ตอบคำถามทั้งชุด
Omar Jaafor
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.