連通性與社群
圖常常不是一整塊。先問「裂成幾塊」,再問「塊裡面有沒有更緊的小圈圈」。
連通元件
import networkx as nx
G = nx.Graph([(1, 2), (2, 3), (4, 5)])
list(nx.connected_components(G))
nx.number_connected_components(G)
largest = max(nx.connected_components(G), key=len)
H = G.subgraph(largest).copy()
subgraph 預設是視圖;要獨立修改請 .copy()。
有向圖:
D = nx.DiGraph([(1, 2), (2, 3), (3, 1), (3, 4)])
list(nx.weakly_connected_components(D)) # 當無向圖看
list(nx.strongly_connected_components(D)) # 必須順著箭頭走得回來
橋與切點
- 橋(bridge):拿掉這條邊,連通元件會變多。
- 切點(articulation point):拿掉這個點,圖會裂開。
基礎設施或組織網路裡,這些就是單點故障。
社群偵測
社群(community)是「內部邊多、跨組邊少」的分組。經典入門:
from networkx.algorithms import community
G = nx.karate_club_graph()
communities = community.greedy_modularity_communities(G)
回傳的是 frozenset 組成的 list,每個 set 是一群節點。還有 Louvain(nx.community.louvain_communities)、標籤傳播等。沒有唯一正確分法;模組度(modularity)高只代表「這種切法在這個指標下較好」。
先畫再切
小圖先 畫出來 看結構,再跑社群演算法,比較不容易被分數牽著走。