กลับไปหน้าบทความ

อ่าน 8 นาที

อัลกอริทึมไลเดน

อัลกอริทึม/CS1 maint: หลายชื่อ: รายชื่อผู้แต่ง/ทฤษฎีเครือข่าย

อัลกอริทึม Leidenเป็นอัลกอริทึมการตรวจจับชุมชนที่พัฒนาโดย Traag et al ที่มหาวิทยาลัย Leidenได้รับการพัฒนาโดยเป็นการดัดแปลง วิธีการ Louvainเช่นเดียวกับวิธีการ Louvain อัลกอริทึม...

อัลกอริทึมไลเดน

อัลกอริทึม Leidenเป็นอัลกอริทึมการตรวจจับชุมชนที่พัฒนาโดย Traag et al [ 1 ]ที่มหาวิทยาลัย Leidenได้รับการพัฒนาโดยเป็นการดัดแปลง วิธีการ Louvainเช่นเดียวกับวิธีการ Louvain อัลกอริทึม Leiden พยายามเพิ่มประสิทธิภาพโมดูลาริตีในการแยกชุมชนจากเครือข่าย อย่างไรก็ตาม อัลกอริทึมนี้ได้แก้ไขปัญหาสำคัญที่มีอยู่ในวิธีการ Louvain ซึ่งได้แก่ ชุมชนที่เชื่อมต่อกันไม่ดี และข้อจำกัดด้านความละเอียดของโมดูลาริตี

การปรับปรุงวิธีการของลูแวน

โดยทั่วไป อัลกอริทึม Leiden ใช้ขั้นตอนหลักสองขั้นตอนเช่นเดียวกับอัลกอริทึม Louvain ได้แก่ ขั้นตอนการย้ายโหนดท้องถิ่น (แม้ว่าวิธีการพิจารณาโหนดใน Leiden จะมีประสิทธิภาพมากกว่า[ 1 ] ) และขั้นตอนการรวมกราฟ อย่างไรก็ตาม เพื่อแก้ไขปัญหาเกี่ยวกับชุมชนที่เชื่อมต่อกันไม่ดีและการรวมชุมชนขนาดเล็กเข้ากับชุมชนขนาดใหญ่ (ขีดจำกัดความละเอียดของโมดูลาร์) อัลกอริทึม Leiden จึงใช้ขั้นตอนการปรับปรุงขั้นกลางซึ่งชุมชนอาจถูกแบ่งออกเพื่อรับประกันว่าทุกชุมชนมีการเชื่อมต่อกันอย่างดี

ตัวอย่างเช่น ลองพิจารณากราฟต่อไปนี้:

ในกราฟนี้มีชุมชนอยู่สามแห่ง (แต่ละสีแทนชุมชนหนึ่งๆ) นอกจากนี้ โหนด "สะพาน" ตรงกลาง (แสดงด้วยวงกลมเพิ่มเติม) เป็นสมาชิกของชุมชนที่แสดงด้วยโหนดสีน้ำเงิน ทีนี้ลองพิจารณาผลลัพธ์ของขั้นตอนการย้ายโหนด ซึ่งจะรวมชุมชนที่แสดงด้วยโหนดสีแดงและสีเขียวเข้าเป็นชุมชนเดียว (เนื่องจากทั้งสองชุมชนมีการเชื่อมต่อกันอย่างมาก):

ที่น่าสังเกตคือ โหนด "สะพาน" ตรงกลางกลายเป็นสมาชิกของชุมชนสีแดงขนาดใหญ่ขึ้นหลังจากมีการย้ายโหนด (เนื่องจากลักษณะโลภของอัลกอริทึมการย้ายโหนดในพื้นที่) ในวิธีการของ Louvain การรวมดังกล่าวจะตามมาด้วยขั้นตอนการรวมกราฟทันที อย่างไรก็ตาม สิ่งนี้ทำให้เกิดการตัดขาดระหว่างสองส่วนที่แตกต่างกันของชุมชนที่แสดงโดยโหนดสีน้ำเงิน ในอัลกอริทึมของ Leiden กราฟจะได้รับการปรับปรุงให้ดียิ่งขึ้นแทน:

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

ส่วนประกอบของกราฟ

ก่อนที่จะนิยามอัลกอริทึมไลเดนเราควรทำความเข้าใจส่วนประกอบบางอย่างของกราฟเสีย ก่อน

จุดยอดและขอบ

กราฟประกอบด้วยจุดยอด (โหนด)และเส้นเชื่อมแต่ละเส้นเชื่อมเชื่อมต่อกับจุดยอดสองจุด และแต่ละจุดยอดอาจเชื่อมต่อกับเส้นเชื่อมตั้งแต่ศูนย์เส้นขึ้นไป โดยทั่วไปแล้ว เส้นเชื่อมจะแทนด้วยเส้นตรง ในขณะที่โหนดจะแทนด้วยวงกลมหรือจุด ในสัญลักษณ์เซต ให้ แทนด้วยวี{\displaystyle V}ให้ เป็นเซตของจุดยอด และอี{\displaystyle E}ให้เป็นเซตของขอบ:

วี:={วี1,วี2,,วีn}อี:={อีฉันเจ,อีฉันเค,,อีเค}{\displaystyle {\begin{aligned}V&:=\{v_{1},v_{2},\dots ,v_{n}\}\\E&:=\{e_{ij},e_{ik},\dots ,e_{kl}\}\end{aligned}}}

ที่ไหนอีฉันเจ{\displaystyle e_{ij}}คือเส้นขอบที่มีทิศทางจากจุดยอดวีฉัน{\displaystyle v_{i}}ไปยังจุดยอดวีเจ{\displaystyle v_{j}}เราสามารถเขียนสิ่งนี้ในรูปคู่ลำดับได้เช่นกัน:

อีฉันเจ:=(วีฉัน,วีเจ){\displaystyle {\begin{aligned}e_{ij}&:=(v_{i},v_{j})\end{aligned}}}

ชุมชน

ชุมชนคือกลุ่มของโหนดที่มีลักษณะเฉพาะ:

ซีฉันวีซีฉันซีเจ=  ฉันเจ{\displaystyle {\begin{aligned}C_{i}&\subseteq V\\C_{i}&\bigcap C_{j}=\emptyset ~\forall ~i\neq j\end{aligned}}}

และผลรวมของทุกชุมชนจะต้องเป็นเซตของจุดยอดทั้งหมด:

วี=ฉัน=1ซีฉัน{\displaystyle {\begin{aligned}V&=\bigcup _{i=1}C_{i}\end{aligned}}}

พาร์ติชั่น

พาร์ทิชันคือเซตของชุมชนทั้งหมด:

พี={ซี1,ซี2,,ซีn}{\displaystyle {\begin{aligned}{\mathcal {P}}&=\{C_{1},C_{2},\dots ,C_{n}\}\end{aligned}}}

คุณภาพพาร์ติชั่น

วิธีการแบ่งกลุ่มชุมชนเป็นส่วนสำคัญของอัลกอริทึมไลเดน การตัดสินใจแบ่งกลุ่มอาจขึ้นอยู่กับวิธีการวัดคุณภาพของกลุ่มเหล่านั้น นอกจากนี้ ตัวชี้วัดหลายตัวยังมีพารามิเตอร์ของตัวเองที่สามารถเปลี่ยนแปลงผลลัพธ์ของกลุ่มได้

ความเป็นโมดูล

ความเป็นโมดูลาร์เป็นตัวชี้วัดคุณภาพที่ใช้กันอย่างแพร่หลายในการประเมินว่าชุดของชุมชนแบ่งกราฟได้ดีเพียงใด สมการสำหรับตัวชี้วัดนี้กำหนดไว้สำหรับเมทริกซ์ประชิด A ดังนี้: [ 2 ]

คิว=12ฉันเจ(เอฉันเจเคฉันเคเจ2)δ(ฉัน,เจ){\displaystyle Q={\frac {1}{2m}}\sum _{ij}(A_{ij}-{\frac {k_{i}k_{j}}{2m}})\delta (c_{i},c_{j})}

ที่ไหน:

  • เอฉันเจ{\displaystyle A_{ij}}แสดงถึงค่าน้ำหนักของขอบระหว่างโหนดฉัน{\displaystyle i}และเจ{\displaystyle j}ดู เมท ริกซ์ความประชิด
  • เคฉัน{\displaystyle k_{i}}และเคเจ{\displaystyle k_{j}}คือผลรวมของน้ำหนักของขอบที่เชื่อมต่อกับโหนดฉัน{\displaystyle i}และเจ{\displaystyle j}ตามลำดับ;
  • {\displaystyle m}คือผลรวมของน้ำหนักขอบทั้งหมดในกราฟ
  • ฉัน{\displaystyle c_{i}}และเจ{\displaystyle c_{j}}คือชุมชนที่โหนดเหล่านั้นอยู่ฉัน{\displaystyle i}และเจ{\displaystyle j}เป็นของ และ
  • δ{\displaystyle \delta }คือฟังก์ชันเดลต้าโครเนกเกอร์ :

δ(ฉัน,เจ)={1ถ้า ฉัน และ เจ เป็นชุมชนเดียวกัน0มิฉะนั้น{\displaystyle {\begin{aligned}\delta (c_{i},c_{j})&={\begin{cases}1&{\text{ถ้า }}c_{i}{\text{ และ }}c_{j}{\text{ เป็นชุมชนเดียวกัน}}\\0&{\text{มิเช่นนั้น}}\end{cases}}\end{aligned}}}

Reichardt Bornholdt Potts Model (RB)

หนึ่งในเมตริกที่ใช้กันอย่างแพร่หลายที่สุดสำหรับอัลกอริทึม Leiden คือโมเดล Reichardt Bornholdt Potts (RB) [ 3 ] โมเดลนี้ถูกใช้เป็นค่าเริ่มต้นในไลบรารีอั ลกอริทึม Leiden กระแสหลักส่วนใหญ่ภายใต้ชื่อRBConfigurationVertexPartition [ 4 ] [ 5 ]โมเดลนี้แนะนำพารามิเตอร์ความละเอียดγ{\displaystyle \gamma }และมีความคล้ายคลึงกับสมการสำหรับโมดูลาร์อย่างมาก โมเดลนี้กำหนดโดยฟังก์ชันคุณภาพต่อไปนี้สำหรับเมทริกซ์ประชิด A ดังนี้: [ 4 ]

คิว=ฉันเจ(เอฉันเจγเคฉันเคเจ2)δ(ฉัน,เจ){\displaystyle Q=\sum _{ij}(A_{ij}-\gamma {\frac {k_{i}k_{j}}{2m}})\delta (c_{i},c_{j})}

ที่ไหน:

  • γ{\displaystyle \gamma }แสดงถึงพารามิเตอร์ความละเอียดเชิงเส้น

แบบจำลองพ็อตส์คงที่ (CPM)

ตัวชี้วัดอีกตัวที่คล้ายกับ RB คือ Constant Potts Model (CPM) ตัวชี้วัดนี้ก็อาศัยพารามิเตอร์ความละเอียดเช่นกันγ{\displaystyle \gamma }[ 6 ]ฟังก์ชันคุณภาพถูกกำหนดดังนี้:

ชม=ฉันเจ(เอฉันเจฉันเจγ)δ(ฉัน,เจ){\displaystyle H=-\sum _{ij}(A_{ij}w_{ij}-\gamma )\delta (c_{i},c_{j})}

ทำความเข้าใจพารามิเตอร์ความละเอียด/ขีดจำกัดความละเอียดของแบบจำลอง Potts

ภาพนี้แสดงการตีความกราฟในสองมุมมองที่แตกต่างกัน มุมมองแรกแสดงสองชุมชน (1 สีน้ำเงิน 1 สีแดง) ที่พยายามเพิ่มค่าโมดูลาร์ให้สูงสุด มุมมองที่สองแสดงสามชุมชน (1 สีน้ำเงิน 1 สีแดง 1 สีเขียว) ที่แสดงโครงสร้างย่อยภายในกราฟได้อย่างแม่นยำยิ่งขึ้น

โดยทั่วไปแล้วโมเดล Potts เช่น RB หรือ CPM จะมีพารามิเตอร์ความละเอียดในการคำนวณ[ 3 ] [ 6 ]โมเดล Potts ถูกนำมาใช้เพื่อแก้ปัญหาข้อจำกัดด้านความละเอียดที่มีอยู่ในการตรวจจับชุมชนโดยอาศัยการเพิ่มค่าโมดูลาริตีสูงสุด ปัญหาข้อจำกัดด้านความละเอียดคือ สำหรับกราฟบางกราฟ การเพิ่มค่าโมดูลาริตีสูงสุดอาจทำให้โครงสร้างย่อยของกราฟรวมกันและกลายเป็นชุมชนเดียว ส่งผลให้โครงสร้างขนาดเล็กสูญหายไป[ 7 ]พารามิเตอร์ความละเอียดเหล่านี้ช่วยให้สามารถปรับเปลี่ยนวิธีการโมดูลาริตีที่อยู่ติดกันให้เหมาะสมกับความต้องการของผู้ใช้ที่ใช้อัลกอริธึม Leiden เพื่อพิจารณาโครงสร้างย่อยขนาดเล็กที่ระดับความละเอียดที่กำหนด

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

อัลกอริทึม

กราฟแสดงขั้นตอนของอัลกอริทึมไลเดน

อัลกอริทึม Leiden เริ่มต้นด้วยกราฟของโหนดที่ไม่เป็นระเบียบ(a)และจัดเรียงโดยการแบ่งส่วนเพื่อเพิ่มค่าโมดูลาริตี ให้สูงสุด (ความแตกต่างของคุณภาพระหว่างส่วนที่สร้างขึ้นกับส่วนแบบสุ่มสมมุติของชุมชน) วิธีการที่ใช้คล้ายกับอัลกอริทึม Louvain ยกเว้นว่าหลังจากย้ายแต่ละโหนดแล้ว มันยังพิจารณาถึงเพื่อนบ้านของโหนดนั้นที่ยังไม่ได้อยู่ในชุมชนที่มันถูกวางไว้ด้วย กระบวนการนี้ส่งผลให้เกิดการแบ่งส่วนแรกของเรา(b)ซึ่งเรียกอีกอย่างว่าพี{\displaystyle {\mathcal {P}}}จากนั้นอัลกอริทึมจะปรับปรุงพาร์ติชันนี้โดยการวางแต่ละโหนดลงในชุมชนของตนเองก่อน แล้วจึงย้ายโหนดเหล่านั้นจากชุมชนหนึ่งไปยังอีกชุมชนหนึ่งเพื่อเพิ่มค่าโมดูลาริตี้ให้สูงสุด อัลกอริทึมจะทำซ้ำเช่นนี้ไปเรื่อยๆ จนกว่าแต่ละโหนดจะได้รับการเยี่ยมชมและย้าย และแต่ละชุมชนได้รับการปรับปรุงแล้ว ซึ่งจะสร้างพาร์ติชัน(c)ซึ่งเป็นพาร์ติชันเริ่มต้นของพีกลั่น{\displaystyle {\mathcal {P}}_{\text{ปรับปรุงแล้ว}}}จากนั้นจึงสร้างเครือข่ายรวม(d)โดยเปลี่ยนแต่ละชุมชนให้เป็นโหนดพีกลั่น{\displaystyle {\mathcal {P}}_{\text{ปรับปรุงแล้ว}}}ใช้เป็นพื้นฐานสำหรับเครือข่ายรวมในขณะที่พี{\displaystyle {\mathcal {P}}}ใช้ในการสร้างพาร์ติชันเริ่มต้น เนื่องจากเราใช้พาร์ติชันดั้งเดิมพี{\displaystyle {\mathcal {P}}}ในขั้นตอนนี้ เราต้องเก็บรักษาข้อมูลนี้ไว้เพื่อให้สามารถนำไปใช้ในการทำซ้ำครั้งต่อไปได้ ขั้นตอนเหล่านี้รวมกันเป็นการทำซ้ำครั้งแรกของอัลกอริธึม

ในการทำซ้ำครั้งต่อๆ ไป โหนดของเครือข่ายโดยรวม (ซึ่งแต่ละโหนดแทนชุมชน) จะถูกนำไปวางไว้ในชุมชนของตนเองอีกครั้ง จากนั้นจึงจัดเรียงตามค่าโมดูลาร์เพื่อสร้างเครือข่ายใหม่พีกลั่น{\displaystyle {\mathcal {P}}_{\text{ปรับปรุงแล้ว}}}ก่อให้เกิด(e)ในกราฟด้านบน ในกรณีที่แสดงโดยกราฟ โหนดต่างๆ ได้ถูกจัดเรียงอย่างเหมาะสมแล้ว ดังนั้นจึงไม่มีการเปลี่ยนแปลงใดๆ เกิดขึ้น ส่งผลให้เกิดการแบ่งกลุ่ม(f)จากนั้นโหนดของการแบ่งกลุ่ม(f)จะถูกรวมเข้าด้วยกันอีกครั้งโดยใช้วิธีเดียวกันกับก่อนหน้านี้ โดยใช้การแบ่งกลุ่มเดิมพี{\displaystyle {\mathcal {P}}}ยังคงถูกเก็บรักษาไว้ ส่วนนี้ของอัลกอริธึมจะทำงานซ้ำไปเรื่อยๆ จนกว่าแต่ละโหนดรวมจะอยู่ในเครือข่ายของตนเอง ซึ่งหมายความว่าจะไม่สามารถปรับปรุงเพิ่มเติมได้อีกต่อไป

อัลกอริทึม Leiden ประกอบด้วยสามขั้นตอนหลัก ได้แก่ การย้ายโหนดในพื้นที่ การปรับปรุงพาร์ติชัน และการรวมเครือข่ายตามพาร์ติชันที่ปรับปรุงแล้ว ฟังก์ชันทั้งหมดในขั้นตอนต่อไปนี้จะถูกเรียกใช้โดยใช้ฟังก์ชันหลัก Leiden ของเรา ซึ่งแสดงไว้ด้านล่าง วิธี Fast Louvain ได้รับการยืมโดยผู้เขียน Leiden จาก "A Simple Acceleration Method for the Louvain Algorithm" [ 8 ]

ฟังก์ชันการตรวจจับชุมชน Leiden (กราฟ G, พาร์ติชัน P) ทำ P = fast_louvain_move_nodes(G, P) /* เรียกใช้ฟังก์ชันเพื่อย้ายโหนดไปยังกลุ่มชุมชน (รายละเอียดเพิ่มเติมอยู่ในฟังก์ชันด้านล่าง) */ เสร็จสิ้น = (|P| == |V(G)|) /* หากจำนวนพาร์ติชันใน P เท่ากับจำนวนโหนดใน G ให้ตั้งค่าแฟล็ก done เป็น True เพื่อสิ้นสุดลูป do-while เนื่องจากนั่นหมายความว่าแต่ละโหนดได้ถูกรวมเข้าเป็นกลุ่มของตนเองแล้ว */ หากไม่ดำเนินการ P_refined = get_p_refined(G, P) /* นี่คือส่วนสำคัญที่ทำให้ไลเดนแตกต่างจากลูแวน เนื่องจากความละเอียดของการแบ่งส่วนนี้บังคับให้เฉพาะโหนดที่มีการเชื่อมต่อที่ดีภายในชุมชนเท่านั้นที่จะถูกพิจารณาว่าถูกย้ายออกจากชุมชน (รายละเอียดเพิ่มเติมในฟังก์ชัน refine_partition_subset ด้านล่าง) */ G = aggregate_graph(G, P_refined) /* รวบรวมกลุ่มชุมชนเข้าเป็นโหนดเดียวสำหรับการวนซ้ำครั้งต่อไป (รายละเอียดอยู่ในฟังก์ชันด้านล่าง) */ P = {{v | v ⊆ C, v ∈ V (G)} | C ∈ P} /* บรรทัดนี้จะนำโหนดจากกลุ่มต่างๆ ใน ​​P มาแยกย่อย โดยแต่ละโหนดจะถูกมองว่าเป็นกลุ่มที่มีสมาชิกเพียงตัวเดียว (กลุ่มที่ประกอบด้วยโหนดเดียว) */ จบถ้า ในขณะที่ยังไม่ได้ดำเนินการ return flattened(P) /* คืนค่าพาร์ติชันสุดท้ายที่โหนดทั้งหมดของ G ถูกจัดอยู่ในชุมชนเดียว */ สิ้นสุดฟังก์ชัน

ขั้นตอนที่ 1 ของอัลกอริทึมไลเดน (การเคลื่อนย้ายโหนดในระดับท้องถิ่น)

ขั้นตอนที่ 1: การย้ายโหนดในพื้นที่

ขั้นแรก เราจะย้ายโหนดจากพี{\displaystyle {\mathcal {P}}}แบ่งกลุ่มไปยังชุมชนใกล้เคียงเพื่อเพิ่มความเป็นโมดูลาร์ ให้สูงสุด (ความแตกต่างของคุณภาพระหว่างกลุ่มที่สร้างขึ้นกับกลุ่มชุมชนที่สุ่มขึ้นมาตามสมมติฐาน) ในภาพด้านบน กลุ่มโหนดเริ่มต้นที่ยังไม่ได้เรียงลำดับแสดงด้วยกราฟทางด้านซ้าย โดยสีเฉพาะของแต่ละโหนดแสดงว่าโหนดนั้นยังไม่ได้เป็นส่วนหนึ่งของชุมชนใด ๆ กราฟทางด้านขวาแสดงผลลัพธ์ของขั้นตอนนี้ ซึ่งก็คือกราฟที่เรียงลำดับแล้วพี{\displaystyle {\mathcal {P}}}โปรดสังเกตว่าโหนดทั้งหมดได้ถูกย้ายไปยังหนึ่งในสามชุมชน ซึ่งแสดงโดยสีของโหนด (สีแดง สีน้ำเงิน และสีเขียว)

ฟังก์ชัน fast_louvain_move_nodes(Graph G, Partition P) Q = queue(V(G)) /* นำโหนดทั้งหมดของ G ไปใส่ในคิวเพื่อให้แน่ใจว่าทุกโหนดได้รับการเยี่ยมชมแล้ว */ ในขณะที่ Q ยังไม่ว่างเปล่า v = Q.pop_front() /* เลือกโหนดแรกจากคิวเพื่อเยี่ยมชม */ C_prime = arg maxC∈P∪∅ ∆HP(v → C) /* กำหนดให้ C_prime เป็นชุมชนใน P หรือเซตว่าง (ไม่มีชุมชน) ที่ให้ค่าเพิ่มขึ้นสูงสุดในฟังก์ชันคุณภาพ H เมื่อย้ายโหนด v เข้าไปในชุมชนนั้น */ ถ้า ∆HP(v → C_prime) > 0 /* พิจารณาเฉพาะโหนดที่เคลื่อนย้ายซึ่งจะส่งผลให้ฟังก์ชันคุณภาพเปลี่ยนแปลงไปในทางบวกเท่านั้น */ v → C_prime /* ย้ายโหนด v ไปยังชุมชน C_prime */ N = {u | (u, v) ∈ E(G), u !∈ C_prime} /* สร้างเซต N ของโหนดที่เป็นเพื่อนบ้านโดยตรงของ v แต่ไม่ได้อยู่ในชุมชน C_prime */ Q.add(N - Q) /* เพิ่มโหนดทั้งหมดจาก N ไปยังคิว ยกเว้นโหนดที่อยู่ใน Q อยู่แล้ว */ จบถ้า return P /* ส่งคืนพาร์ติชันที่อัปเดตแล้ว */ สิ้นสุดฟังก์ชัน 
ขั้นตอนที่ 2 ของอัลกอริทึมไลเดน (การปรับปรุงการแบ่งส่วน)

ขั้นตอนที่ 2: การปรับปรุงพาร์ติชั่นให้ดียิ่งขึ้น

ถัดไป โหนดแต่ละโหนดในเครือข่ายจะถูกกำหนดให้กับชุมชนของตนเอง จากนั้นจึงย้ายโหนดเหล่านั้นจากชุมชนหนึ่งไปยังอีกชุมชนหนึ่งเพื่อเพิ่มความเป็นโมดูลาร์ให้สูงสุด กระบวนการนี้เกิดขึ้นซ้ำๆ จนกว่าทุกโหนดจะได้รับการเยี่ยมชมและย้าย ซึ่งคล้ายคลึงกับการสร้าง...พี{\displaystyle {\mathcal {P}}}ยกเว้นว่าแต่ละชุมชนจะได้รับการปรับปรุงหลังจากมีการย้ายโหนด ผลลัพธ์ที่ได้คือการแบ่งกลุ่มเริ่มต้นของเราสำหรับพีกลั่น{\displaystyle {\mathcal {P}}_{\text{ปรับปรุงแล้ว}}}ดังแสดงในภาพด้านขวา โปรดทราบว่าเรากำลังติดตามชุมชนต่างๆ จากด้วยเช่นกันพี{\displaystyle {\mathcal {P}}}ซึ่งแสดงโดยพื้นหลังสีต่างๆ ที่อยู่ด้านหลังโหนดเหล่านั้น

ฟังก์ชัน get_p_refined(กราฟ G, พาร์ติชัน P) P_refined = get_singleton_partition(G) /* กำหนดให้แต่ละโหนดใน G อยู่ในชุมชนเดี่ยว (ชุมชนที่ประกอบด้วยโหนดเพียงโหนดเดียว) */ สำหรับ C ∈ P P_refined = refine_partition_subset(G, P_refined, C) /* ปรับปรุงการแบ่งกลุ่มย่อยสำหรับแต่ละชุมชนใน P_refined */ สิ้นสุดสำหรับ return P_refined /* คืนค่าพาร์ติชันที่ได้รับการปรับปรุงใหม่ */ ฟังก์ชัน refine_partition_subset(Graph G, Partition P, Subset S) R = {v | v ∈ S, E(v, S − v) ≥ γ * degree(v) * (degree(S) − degree(v))} /* สำหรับโหนด v ซึ่งเป็นสมาชิกของเซตย่อย S ให้ตรวจสอบว่า E(v, Sv) (ขอบของ v ที่เชื่อมต่อกับสมาชิกอื่นๆ ของกลุ่ม S โดยไม่รวม v เอง) มีค่ามากกว่าปัจจัยการปรับขนาดที่กำหนดหรือไม่ degree(v) คือดีกรีของโหนด v และ degree(S) คือดีกรีรวมของโหนดในเซตย่อย S ข้อความนี้โดยพื้นฐานแล้วต้องการว่าหากลบ v ออกจากเซตย่อย กลุ่มจะยังคงอยู่เหมือนเดิม */ สำหรับ v ∈ R ถ้า v อยู่ใน singleton_community /* ถ้าโหนด v อยู่ใน singleton community หมายความว่าเป็นโหนดเดียว */ T = {C | C ∈ P, C ⊆ S, E(C, S − C) ≥ γ * degree(C) · (degree(S) − degree(C)} /* สร้างเซต T ของกลุ่มชุมชน โดยที่ E(C, S - C) (จำนวนขอบระหว่างชุมชน C และเซตย่อย S โดยไม่รวมขอบระหว่างชุมชน C กับตัวมันเอง) มีค่ามากกว่าเกณฑ์ เกณฑ์ในที่นี้คือ γ * degree(C) · (degree(S) − degree(C)) */ Pr(C_prime = C) ~ exp(1/θ ∆HP(v → C) ถ้า ∆HP(v → C) ≥ 0 0 ในกรณีอื่น ๆ สำหรับ C ∈ T /* หากการย้ายโหนด v ไปยัง C_prime เปลี่ยนแปลงฟังก์ชันคุณภาพไปในทิศทางบวก ให้กำหนดความน่าจะเป็นที่ชุมชนของ v เป็น exp(1/θ * ∆HP(v → C)) มิฉะนั้นให้กำหนดเป็น 0 สำหรับทุกชุมชนใน T */ v → C_prime /* ย้ายโหนด v ไปยังกลุ่ม C_prime แบบสุ่มด้วยความน่าจะเป็นที่เป็นบวก */ จบถ้า สิ้นสุดสำหรับ ส่งคืน P /* ส่งคืนพาร์ติชันที่ปรับปรุงแล้ว */ สิ้นสุดฟังก์ชัน 
ขั้นตอนที่ 3 ของอัลกอริทึมไลเดน (การรวมเครือข่าย)

ขั้นตอนที่ 3: การรวมเครือข่าย

จากนั้นเราจะแปลงชุมชนแต่ละแห่งเป็นพีกลั่น{\displaystyle {\mathcal {P}}_{\text{ปรับปรุงแล้ว}}}รวมเป็นโหนดเดียว สังเกตว่า ดังที่แสดงในภาพด้านบน ชุมชนของพี{\displaystyle {\mathcal {P}}}ใช้สำหรับจัดเรียงโหนดรวมเหล่านี้หลังจากสร้างเสร็จแล้ว

ฟังก์ชัน aggregate_graph(Graph G, Partition P) V = P /* กำหนดกลุ่มชุมชนของ P เป็นโหนดแต่ละโหนดของกราฟ */ E = {(C, D) | (u, v) ∈ E(G), u ∈ C ∈ P, v ∈ D ∈ P} /* ถ้า u เป็นสมาชิกของเซตย่อย C ของ P และ v เป็นสมาชิกของเซตย่อย D ของ P และ u กับ v มีเส้นเชื่อมร่วมกันใน E(G) เราจะเพิ่มเส้นเชื่อมระหว่าง C กับ D ในกราฟใหม่ */ return Graph(V, E) /* คืนค่าโหนดและขอบของกราฟใหม่ */ สิ้นสุดฟังก์ชัน ฟังก์ชัน get_singleton_partition(Graph G) return {{v} | v ∈ V (G)} /* นี่คือฟังก์ชันที่เรากำหนดแต่ละโหนดใน G ให้กับชุมชนเดี่ยว (ชุมชนที่อยู่โดดเดี่ยว) */ สิ้นสุดฟังก์ชัน 

เราทำซ้ำขั้นตอนเหล่านี้จนกระทั่งแต่ละชุมชนมีโหนดเพียงโหนดเดียว โดยแต่ละโหนดเหล่านี้จะแสดงถึงกลุ่มของโหนดจากเครือข่ายดั้งเดิมที่เชื่อมต่อกันอย่างแน่นหนา

ข้อจำกัด

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

Leiden มีประสิทธิภาพมากกว่า Louvain แต่ในกรณีของกราฟขนาดใหญ่อาจส่งผลให้เวลาในการประมวลผลนานขึ้น ความก้าวหน้าล่าสุดได้เพิ่มความเร็วโดยใช้ "การใช้งานแบบมัลติคอร์แบบขนานของอัลกอริทึม Leiden" [ 9 ]

อัลกอริทึมของไลเดนช่วยแก้ปัญหาข้อจำกัดด้านความละเอียดได้มาก อย่างไรก็ตาม ยังคงมีความเป็นไปได้ที่โครงสร้างย่อยขนาดเล็กอาจถูกมองข้ามไปในบางกรณี การเลือกค่าพารามิเตอร์แกมมามีความสำคัญอย่างยิ่งเพื่อให้แน่ใจว่าโครงสร้างเหล่านี้จะไม่ถูกมองข้าม เนื่องจากค่านี้อาจแตกต่างกันอย่างมากในแต่ละกราฟ

ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Leiden_algorithm&oldid=1326359549 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ อัลกอริทึมไลเดน

อัลกอริทึม Leidenเป็นอัลกอริทึมการตรวจจับชุมชนที่พัฒนาโดย Traag et al ที่มหาวิทยาลัย Leidenได้รับการพัฒนาโดยเป็นการดัดแปลง วิธีการ Louvainเช่นเดียวกับวิธีการ Louvain อัลกอริทึม...

การปรับปรุงวิธีการของลูแวน

โดยทั่วไป อัลกอริทึม Leiden ใช้ขั้นตอนหลักสองขั้นตอนเช่นเดียวกับอัลกอริทึม Louvain ได้แก่ ขั้นตอนการย้ายโหนดท้องถิ่น (แม้ว่าวิธีการพิจารณาโหนดใน Leiden จะมีประสิทธิภาพมากกว่า [ 1 ] ) และขั้นตอนการรวมกราฟ อย่างไรก็ตาม...

ส่วนประกอบของกราฟ

ก่อนที่จะนิยาม อัลกอริทึมไลเดน เราควรทำความเข้าใจส่วนประกอบบางอย่างของกราฟเสีย ก่อน

จุดยอดและขอบ

กราฟประกอบด้วย จุดยอด (โหนด) และ เส้นเชื่อม แต่ละเส้นเชื่อมเชื่อมต่อกับจุดยอดสองจุด และแต่ละจุดยอดอาจเชื่อมต่อกับเส้นเชื่อมตั้งแต่ศูนย์เส้นขึ้นไป โดยทั่วไปแล้ว เส้นเชื่อมจะแทนด้วยเส้นตรง ในขณะที่โหนดจะแทนด้วยวงกลมหรือจุด ในสัญลักษณ์เซต ให้ แทนด้วย วี...