復雜網絡系列:第 5 部分 — 社區檢測和子圖

關鍵詞:Community Detection Algorithms

一、說明

在本教程中,我們將探討網絡分析的兩個基本方面:社區檢測和使用子圖。了解這些概念將使您能夠發現復雜網絡中隱藏的結構和關系。

二、何為社區,何為社區檢測?

2.1 關于社區檢測和相關研究

你們很多人都熟悉網絡,對吧?你可能正在使用 Facebook、Instagram、Twitter 等社交媒體網站。它們就是社交網絡。你可能正在與證券交易所打交道。你可能正在買入新股,也可能賣出現有股票等等。它們就是網絡。不僅在技術領域,而且在我們的日常社交生活中,我們都與許多網絡打交道。社區是許多網絡的屬性,特定網絡可能包含多個社區,社區內的節點緊密相連。多個社區中的節點可以重疊。想想你的 Facebook 或 Instagram 帳戶,想想你每天與誰互動。你可能與朋友、同事、家人以及生活中其他一些重要的人密切互動。他們在你的社交網絡中構成了一個非常密集的社區。

M. Girvan 和 MEJ Newman 是社群發現領域的兩位著名研究者。在他們的一項研究中,他們利用社交網絡和生物網絡研究了社群的結構屬性。他們認為,網絡節點在社群內部以緊密的群體形式緊密連接,而在社群之間則以松散的連接形式存在。

2.2 為什么要進行社區檢測?

在分析不同的網絡時,發現其中的社群可能至關重要。社群檢測技術有助于社交媒體算法發現具有共同興趣的群體,并讓他們保持緊密聯系。社群檢測技術可用于機器學習,檢測具有相似屬性的群體,并根據各種原因提取群體。例如,這項技術可用于發現社交網絡或股票市場中的操縱性群體。

2.3 社區檢測與聚類

有人可能會認為社群檢測類似于聚類。聚類是一種機器學習技術,它根據相似的數據點的屬性將其歸入同一聚類。盡管聚類可以應用于網絡,但它是無監督機器學習中一個更廣泛的領域,涉及多種屬性類型。另一方面,社群檢測專門針對網絡分析,它依賴于一種稱為“邊”的屬性類型。此外,聚類算法傾向于將單個外圍節點與其應屬于的社群分離。然而,聚類和社群檢測技術都可以應用于許多網絡分析問題,并且根據領域的不同,它們可能存在不同的優缺點。

三、關于社區檢測技術

社區發現方法大致可分為兩類:凝聚法和分裂法。凝聚法是將邊逐一添加到僅包含節點的圖中,邊的添加順序是從強邊到弱邊。分裂法與凝聚法相反,是將邊從完整的圖中逐一移除。

給定網絡中的社區數量可能不限,且規模大小不一。這些特性使得社區檢測過程非常困難。然而,在社區檢測領域已提出了許多不同的技術。以下介紹四種流行的社區檢測算法。所有這些列出的算法都可以在Python 的 cdlib 庫中找到。

3.1. 魯汶社區檢測

Louvain 社區發現算法最初于 2008 年提出,是一種適用于大型網絡的快速社區展開方法。該方法基于模塊度,試圖最大化社區中實際邊數與預期邊數之間的差異。然而,優化網絡中的模塊度是 NP 難題,因此必須使用啟發式方法。Louvain 算法分為兩個迭代重復的階段:

1 節點的局部移動
2 網絡聚合
該算法從一個由 N 個節點組成的加權網絡開始。在第一階段,該算法為網絡中的每個節點分配一個不同的社區。然后,對于每個節點,算法會考慮其鄰居,并評估其模塊化增益通過從當前社區中移除特定節點并將其放入鄰居社區中。如果增益為正且最大化,則該節點將被放入鄰居社區。如果沒有正增益,則節點將保留在同一個社區中。此過程重復應用于所有節點,直到不再有進一步的改進。當獲得模塊度的局部最大值時,Louvain 算法的第一階段停止。在第二階段中,該算法將構建一個新網絡,將在第一階段找到的社區視為節點。第二階段完成后,該算法將對生成的網絡重新應用第一階段。重復這些步驟,直到網絡不再發生變化且獲得最大模塊度。

Louvain 社區發現算法能夠在過程中發現社區的社區。該算法因其易于實現且速度快而廣受歡迎。然而,該算法的一個主要限制在于其對網絡在主內存中的存儲的使用。

下面給出了使用 python cdlib 庫的 Louvain 社區檢測算法的使用。

1)從 cdlib 導入算法
2)導入 networkx 作為 nx
3)G = nx.karate_club_graph()
4)coms = algorithms.louvain(G, weight=‘weight’, resolution=1., randomize=False)

3.2. 意外社區檢測

由于模塊度的局限性,引入了一種基于經典概率的度量方法,稱為“意外度”(Surprise),用于評估網絡社區劃分的質量。該算法與魯汶社區檢測算法幾乎相似,只是它使用意外度而非模塊度。節點從一個社區移動到另一個社區,從而貪婪地提高意外度。這種方法考慮的是鏈接位于社區內的概率。在社區規模較小的情況下,使用意外度效果良好 ;而在社區規模較小的情況下,使用模塊度效果良好。

下面給出了使用 python cdlib 庫的 Surprise 社區檢測算法的使用方法。

1)從 cdlib 導入算法
2)導入 networkx 作為 nx
3)G = nx.karate_club_graph()
4)coms = algorithms.surprise_communities(G)

3.3. 萊頓社區檢測

在后來的研究中(2019 年),VA Traag 等人表明,Louvain 社區檢測傾向于發現內部不連通的社區(連接性較差的社區)。在 Louvain 算法中,將一個充當社區中兩個組成部分之間橋梁的節點移至新社區可能會導致舊社區的連接斷開。如果舊社區進一步分裂,則不會出現這種情況。但根據 Traag 等人的研究,情況并非如此。由于舊社區中的其他節點與社區之間的連接緊密,舊社區可以保持為一個單一社區。此外,他們還表示,Louvain 傾向于發現連接性非常差的社區。因此,他們提出了速度更快的 Leiden 算法,該算法可以保證社區的連接性良好。
在這里插入圖片描述

除了 Louvain 算法中使用的階段之外,Leiden 算法還使用了另一個階段,用于嘗試優化已發現的分區。Leiden 算法的三個階段如下:

1)節點的局部移動
2)分區細化
3)基于精細劃分的網絡聚合
在細化階段,算法嘗試從第一階段提出的分區中識別出細化的分區。第一階段提出的社區可能會在第二階段進一步分裂成多個分區。細化階段不遵循貪婪方法,可能會將節點與隨機選擇的社區合并,從而提高質量函數。這種隨機性允許更廣泛地發現分區空間。同樣在第一階段,萊頓采用了與魯汶不同的方法。萊頓不是在第一次訪問所有節點后訪問網絡中的所有節點,而是只訪問那些鄰域發生變化的節點。

下面給出了使用 python cdlib 庫的萊頓社區檢測算法的使用。

1)從 cdlib 導入算法
2)導入 networkx 作為 nx
3)G = nx.karate_club_graph()
4)coms = algorithms.leiden(G)

3.4. Walktrap 社區檢測

Walktrap 是另一種基于隨機游動的社區檢測方法,其中通過網絡中的隨機游動來測量頂點之間的距離。Walktrap 是一種高效的算法,在最壞的情況下,時間復雜度為 O(mn2),空間復雜度為 O(n2)。但在大多數實際場景中,walktrap 的時間復雜度為 O((n2) log n),空間復雜度為 O(n2)。該算法的基本原理是,圖 / 網絡上的隨機游動往往會陷入與社區相對應的緊密連接部分。Walktrap 使用隨機游動的結果以自下而上的方式合??并單獨的社區。可以使用任何可用的質量標準來評估分區的質量。它可以是像 Louvain 社區檢測中的模塊化,也可以是任何其他度量。

下面給出了使用 python cdlib 庫的 Walktrap 社區檢測算法的使用方法。

1)從 cdlib 導入算法
2)導入 networkx 作為 nx
3)G = nx.karate_club_graph()
4)coms = algorithms.walktrap(G)

3.5 小結

社群檢測非常適用于理解和評估大型復雜網絡的結構。這種方法利用圖或網絡中邊的屬性,因此比聚類方法更適合網絡分析。聚類算法傾向于將單個外圍節點與其應歸屬的社群分離。目前已提出并實現了多種不同的網絡社群檢測算法。每種算法都有各自的優缺點,具體取決于網絡的性質以及應用問題領域。

四、實驗進行識別社區

社區檢測算法旨在將網絡劃分為多個社區。有幾種算法可用,但我們將重點介紹 Girvan-Newman 算法和 Louvain 方法。

4.1 社區檢測與聚類

有人可能會爭辯說,社區檢測類似于聚類。聚類是一種機器學習技術,其中相似的數據點根據其屬性分組到同一集群中。盡管聚類可以應用于網絡,但它是無監督機器學習中一個更廣泛的領域,涉及多種屬性類型。另一方面,社區檢測是專門為網絡分析量身定制的,該網絡分析依賴于稱為 edges 的單個屬性類型。此外,聚類算法傾向于將單個外圍節點與它應該屬于的社區分開。但是,聚類和社區檢測技術都可以應用于許多網絡分析問題,并且可能會根據域的不同而產生不同的優缺點。

4.2 使用 NetworkX 進行社區檢測

NetworkX 提供了應用各種社區檢測算法的工具。讓我們從 Girvan-Newman 算法開始。

社區檢測技術

  1. Girvan-Newman 算法
    Girvan-Newman 算法通過逐步刪除具有最高中介中心性的邊來識別社區。以下是在 NetworkX 中實現 Girvan-Newman 算法的方法:
import networkx as nx
from networkx.algorithms.community import girvan_newman
import matplotlib.pyplot as pltG = nx.karate_club_graph()# Apply Girvan-Newman algorithm
communities = girvan_newman(G)# Get the first set of communities (you can iterate further for more levels)
node_groups = list(next(communities))# Assign colors to nodes based on their community
node_colors = []
for node in G.nodes():if node in node_groups[0]:node_colors.append('red')else:node_colors.append('blue')# Draw the graph with nodes colored by community
nx.draw(G, with_labels=True, node_color=node_colors)
plt.show()

Output:
在這里插入圖片描述

4.3 . 魯汶法

魯汶方法是一種通過優化模塊化來檢測網絡中社區的有效算法,模塊化是一種評估網絡內社區強度的度量。它的工作原理是在社區之間迭代移動節點,以最大限度地提高模塊化,從而突出顯示緊密連接的組。該方法快速、可擴展,并廣泛用于各個領域,以揭示復雜網絡中隱藏的結構。

魯汶法的計算代碼:

import networkx as nx
from community import community_louvain
import matplotlib.pyplot as plt# Assuming you have your graph G defined# Apply Louvain algorithm
partition = community_louvain.best_partition(G)# Get the community assignments for each node
node_colors = [partition[node] for node in G.nodes()]# Draw the graph with nodes colored by community
nx.draw(G, with_labels=True, node_color=node_colors)
plt.show()

輸出:
在這里插入圖片描述

4.4 圖論中的子圖

子圖是由其頂點(節點)的子集和連接這些頂點的邊形成的圖形的一部分。分析子圖有助于識別較大圖中的關系、社區或特定特征。在 NetworkX 中,我們可以根據各種標準(例如特定節點、邊或屬性)輕松提取子圖。

提取子圖
可以根據特定節點或特定邊提取子圖。

import networkx as nx  
import matplotlib.pyplot as plt  # Load Zachary's Karate Club graph  
G_karate = nx.karate_club_graph()  plt.figure(figsize=(12, 6))  
plt.subplot(1, 2, 1) # Visualize the original graph  
nx.draw(G_karate, with_labels=True, node_color='lightblue', node_size=500, font_weight='bold')  plt.title("Original Zachary's Karate Club Graph")

輸出:
在這里插入圖片描述

按節點提取:
您可以通過指定要包含的節點列表來創建子圖。當您想要研究較大圖形中一組特定節點之間的連接和關系時,這尤其有用。

例: 如何根據特定節點從圖中提取子圖:

# Specify a list of nodes for the subgraph  
subgraph_nodes = [0, 1, 2, 3, 4, 5]  """Extract the subgraph from Zachary's Karate 
Club graph based on the specified nodes"""
subgraph = G_karate.subgraph(subgraph_nodes)  # Visualize the subgraph  
nx.draw(subgraph, with_labels=True, node_color='lightgreen', node_size=500, font_weight='bold')  plt.title("Subgraph of Zachary's Karate Club based on nodes")
plt.show()

輸出:
在這里插入圖片描述

我們可以通過以下命令打印子圖的節點和邊:

# Print nodes and edges of the subgraph  
print("Nodes in subgraph:", subgraph.nodes())  
print("Edges in subgraph:", subgraph.edges())Nodes in subgraph: [0, 1, 2, 3, 4, 5]
Edges in subgraph: [(0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (1, 2), (1, 3), (2, 3)]

按邊提取:
或者,您可以使用一組特定的邊提取子圖。此方法側重于節點之間的關系,當邊表示重要的交互或連接時,此方法可能很有用。

示例:這是一個示例代碼,演示了如何根據特定邊緣在 NetworkX 中提取子圖:

# Specify a list of edges for the subgraph  
subgraph_edges = [(0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (1, 2), (1, 3), (2, 3)]  """Extract the subgraph from Zachary's Karate   
Club graph based on the specified edges"""  
subgraph_edges_extracted = G_karate.edge_subgraph(subgraph_edges)  # Visualize the subgraph  
plt.subplot(1, 2, 2)   
nx.draw(subgraph_edges_extracted,   with_labels=True,   node_color='orange',   node_size=500,   font_weight='bold')  plt.title("Subgraph of Zachary's Karate Club based on edges")  
plt.tight_layout()   
plt.show()

輸出:
在這里插入圖片描述

五、結論

在本教程中,我們探索了使用 NetworkX 的社區檢測和子圖。我們討論了如何使用 Girvan-Newman 算法和 Louvain 方法識別社區,以及如何提取和可視化具有節點或邊的子圖。我們將在復雜網絡系列:第 6 部分中深入探討 PageRank 和 HITS 算法等高級主題,該主題衡量了網絡中節點的重要性,并研究了與網絡健壯性和彈性相關的概念。這些技術共同為分析和理解復雜網絡提供了強大的工具。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/904176.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904176.shtml
英文地址,請注明出處:http://en.pswp.cn/news/904176.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【辦公類-99-04】20250504閔豆統計表excle轉PDF,合并PDF、添加中文字體頁眉+邊框下劃線

需求說明 督導檢查,各條線都要收集資料。 今天去加班,遇到家教主任,她讓我用保教主任的彩色打印機打印這套活躍度表格。(2023學年上學期下學期-2024學年上學期,就是202309-202504) 每個excle都是內容在A4一…

升級 CUDA Toolkit 12.9 與 cuDNN 9.9.0 后驗證指南:功能與虛擬環境檢測

#工作記錄 在 NVIDIA 發布 CUDA Toolkit 12.9 與 cuDNN 9.9.0 后,開發者紛紛選擇升級以獲取新特性和性能提升。 CUDA Toolkit 12.9 與 cuDNN 9.9.0 發布,帶來全新特性與優化-CSDN博客 然而,升級完成并不意味著大功告成,確認升級后…

LLM論文筆記 28: Universal length generalization with Turing Programs

Arxiv日期:2024.10.4機構:Harvard University 關鍵詞 圖靈機 CoT 長度泛化 核心結論 Turing Programs 的提出 提出 Turing Programs,一種基于圖靈機計算步驟的通用 CoT 策略。通過將算法任務分解為逐步的“磁帶更新”(類似圖靈…

【全隊項目】智能學術海報生成系統PosterGenius--圖片布局生成模型LayoutPrompt(1)

🌈 個人主頁:十二月的貓-CSDN博客 🔥 系列專欄: 🏀大模型實戰訓練營_十二月的貓的博客-CSDN博客 💪🏻 十二月的寒冬阻擋不了春天的腳步,十二點的黑夜遮蔽不住黎明的曙光 目錄 1. 前…

位圖的實現和拓展

一:位圖的介紹 ①:需要位圖的場景 給40億個不重復的無符號整數,沒排過序。給一個無符號整數,如何快速判斷一個數是否在這40億個數中? 要判斷一個數是否在某一堆數中,我們可能會想到如下方法: A…

排序功法入門指南【江湖算法筆記】

話說江湖風云變幻,各路英雄好漢行走江湖,總得有個名號排行。若問“東邪西毒南帝北丐”誰強誰弱,總得排個座次不是?這排序之道,恰似武功秘籍,練好了能號令群雄,練岔了怕是要被笑掉大牙&#xff0…

【中間件】brpc_基礎_用戶態線程中斷

bthread之用戶態線程中斷 源碼 1 簡介 interrupt_pthread 核心功能是 通過信號機制中斷阻塞的 pthread 線程,以實現線程的協作式中斷。 2 核心功能與設計 2.1 信號選擇與注冊 信號選擇:使用 SIGURG 作為中斷信號。 原因:SIGURG 通常用于…

Linux 的網絡卡

#本機操作系統CentOS 10 #核心版本 rootbogon:/etc# uname -r 6.12.0-65.el10.x86_64 網卡能不能被捉到可以使用【dmesg|grep xx】來判斷,有沒有驅動則可以使用lsmod看看模塊有沒有加載核心!最后,以ifconfig xxx測試看看 觀察核心所捉到的網卡…

前端雙工通信的幾種方案詳細描述

前端實現雙工通信(全雙工或半雙工)的常見方案及詳細實現如下: 一、WebSocket(全雙工) 原理:基于 TCP 的持久化協議,客戶端與服務端建立雙向通信通道,支持實時雙向數據傳輸。 // 客…

KUKA機器人快速啟動設置

KUKA機器人在首次開機啟動時,有時在示教器上需要進行投入運行等相關的設置。如以下相關的信息需要處理: 1、機器人系統開機后,選擇T1運行模式;2、顯示提示信息:“RDC 存儲器和控制系統不一致什么被更換了”時&#xf…

游戲代碼C

以下將結合不同編程語言的特點及游戲開發中的實際應用,展示多種語言的游戲代碼示例(以簡單游戲為例,展示代碼結構和邏輯差異)。由于代碼篇幅較長,我將分語言進行說明并引用相關來源: 1. C# Unity&#xff…

LangChain Agent核心解析:Zero-Shot-ReAct策略實現與實戰指南

引言 在LangChain的Agent框架中,zero-shot-react-description 是一種預定義的Agent類型,它結合了Zero-Shot(零樣本學習) 和 ReAct(推理行動) 策略,主要用于根據工具的描述動態選擇和執行工具&a…

PyQt 或 PySide6 進行 GUI 開發文檔與教程

一、官網文檔 Qt 官方文檔:Porting to Qt 6 | Qt 6.9Qt 維基:???????Qt WikiQt for Python (PySide6) :???????Qt for Python - Qt WikiPySide6 快速上手指南:???????Getting Started - Qt for Python PyS…

2024年第十五屆藍橋杯省賽B組Python【 簡潔易懂題解】

2024年第十五屆藍橋杯省賽B組Python題解 一、整體情況說明 2024年第十五屆藍橋杯省賽B組Python組考試共包含8道題目,分為結果填空題和程序設計題兩類。 考試時間:4小時編程環境:Python 3.x,禁止使用第三方庫,僅可使…

Go語言--語法基礎4--基本數據類型--類型轉換

Go 是一種強類型的語言,所以如果在賦值的時候兩邊類型不一致會報錯。一個類型的值可以被轉換成另一種類型的值。由于 Go 語言不存在隱式類型轉換,因此所有的類型轉換都必須顯式的聲明。 強制類型轉換語法 使用 type (a) 這種形式來進行強制類型轉換&am…

nginx 代理時怎么更改 Remote Address 請求頭

今天工作中遇到用 localhost 訪問網站能訪問后臺 api,但是用本機IP地址后就拒絕訪問,我懷疑是后臺獲取 Remote Address 然后設置白名單了只能 localhost 訪問。 想用 nginx 更改 Remote Address server {listen 8058;server_name localhost;loca…

LeetCode刷題鏈表

文章目錄 鏈表總結 常用技巧兩數相加題解代碼 兩兩交換鏈表中的節點題解代碼 重排鏈表題解代碼 合并k個升序鏈表題解代碼 K個一組翻轉鏈表題解代碼 鏈表總結 常用技巧 畫圖 直觀 形象 便于理解引入虛擬頭節點,便于處理邊界情況,方便我們對鏈表進行…

ESP32S3 多固件燒錄方法、合并多個固件為單一固件方法

ESP32S3 多固件燒錄方法、合并多個固件為單一固件方法 文章目錄 ESP32S3 多固件燒錄方法、合并多個固件為單一固件方法前言1、前期準備工作2、多固件燒錄方法3、單固件燒錄方法總結 前言 使用正點原子的ESP32S3 BOX開發板獨立燒錄編譯生成的xxx.bin固件無法正常運行起來&#…

Webug4.0靶場通關筆記10- 第14關鏈接注入

目錄 第14關 鏈接注入 1.打開靶場 2.源碼分析 3.滲透實戰 (1)方法1:跳轉外部網頁 (2)方法2:獲取cookie 4.漏洞防御 本文通過《webug靶場第14關 鏈接注入》來進行滲透實戰。 第14關 鏈接注入 鏈接注…

SpringBoot的汽車商城后臺管理系統源碼開發實現

概述 汽車商城后臺管理系統專為汽車4S店和經銷商設計,提供全面的汽車管理系統解決方案。 主要內容 1. 核心功能模塊 系統提供以下主要功能: ??銷售管理??:記錄銷售信息,跟蹤交易進度??客戶管理??:維護客戶…