圖的基本概念
圖論(graph theory)把「實體」與「關係」抽象成兩種東西:節點(node / vertex)與邊(edge / link)。NetworkX 就是把這套語言變成 Python 物件。
節點與邊
- 節點:人、城市、網頁、基因……任何你想追蹤的實體。
- 邊:兩個節點之間的關係,例如朋友、航線、超連結、蛋白質交互作用。
一張圖就是「一組節點」加上「一組已標明的節點對」。
有向或無向
- 無向圖:邊沒有方向。A 是 B 的朋友,通常也代表 B 是 A 的朋友。
- 有向圖(directed graph):邊有方向。A 追蹤 B,不代表 B 追蹤 A。網頁連結、引用關係、單向道路都屬這類。
選錯類型,後續的鄰居、出入度、最短路徑都會算錯。
權重與多重邊
- 權重(weight):邊上的數字,可表示距離、成本、流量、互動次數。許多演算法預設讀取屬性名稱
weight。 - 平行邊(multiedge):同一對節點之間可以有多條邊,例如兩城市之間有多條航線。這時要用
MultiGraph/MultiDiGraph。 - 自環(self-loop):邊連回自己,例如某人轉發自己的貼文。
度(degree)
一個節點的度是連到它的邊數。有向圖再拆成:
- 出度(out-degree):指出去的邊數。
- 入度(in-degree):指進來的邊數。
度是最便宜、也最常用的「誰比較重要」指標。
路徑與連通
- 路徑(path):一串不重複的節點,相鄰者有邊相連。
- 連通(connected):無向圖裡任意兩點都能走到。否則圖會裂成多個連通元件(connected component)。
- 弱/強連通:有向圖常用「忽略方向後能否走到」(弱)與「順著箭頭能否走到」(強)。
為什麼用 NetworkX
節點可以是字串、數字、甚至自訂物件;邊上可以掛任意 Python 物件。這種彈性讓它很適合教學與中小型分析,也是它成為 Python 圖分析預設入口的原因。