返回文章列表

網路分析投影技術與中心性指標應用

本文探討關聯網路分析中的投影技術,以及如何使用 NetworkX 計算中心性指標。文章涵蓋無權重和加權投影,包括 Jaccard 指數的應用,並以植物-授粉者網路和 suffragette 運動網路為例,示範如何使用 Python 進行網路分析,計算介數中心性和特徵向量中心性等指標,進而識別網路中的關鍵節點和

網路分析 資料科學

關聯網路分析在處理多對多關係時至關重要,而投影技術能將其簡化為單一模式網路,方便分析。本文介紹瞭如何使用 Python 的 NetworkX 函式庫實作無權重和加權投影,包含 Jaccard 指數的應用,並探討了中心性指標如度中心性、介數中心性和特徵向量中心性在識別關鍵節點中的作用。文章以植物-授粉者網路為例,展示了投影技術的實際應用,並使用 suffragette 運動網路資料,示範如何計算和分析介數中心性和特徵向量中心性,揭示網路中不同成員的重要性及角色差異。

投影在關聯網路分析中的應用

在複雜網路分析中,關聯網路(Affiliation Networks)提供了一個強大的工具,用於表示多對多的關係。然而,在某些情況下,將關聯網路轉換為單一模式網路(Single-mode Networks)會更為方便。這種轉換過程稱為投影(Projection),而產生的單一模式網路則被稱為共關聯網路(Co-affiliation Networks)。本文將探討投影技術及其在植物-授粉者網路中的應用。

投影技術的基本原理

投影技術的核心思想是將關聯網路中的節點透過共同的鄰居連線起來。在植物-授粉者網路的例子中,我們可以將網路投影到植物節點或授粉者節點上,從而得到植物-植物共關聯網路或授粉者-授粉者共關聯網路。

無權重投影的實作與視覺化

以下程式碼展示瞭如何使用NetworkX函式庫中的projected_graph()函式將植物-授粉者網路投影到植物節點上,並繪製共關聯網路:

# 將網路投影到植物節點上
G = bipartite.projected_graph(B, plants)

# 建立圖形
plt.figure(figsize=(24,24))

# 計算佈局
pos = nx.spring_layout(G, k=0.5)

# 繪製邊、節點和標籤
nx.draw_networkx_edges(G, pos, width=3, alpha=0.2)
nx.draw_networkx_nodes(G, pos, node_color="#bfbf7f", node_shape="h", node_size=10000)
nx.draw_networkx_labels(G, pos)

內容解密:

  1. bipartite.projected_graph(B, plants):將原始的二分網路B投影到plants節點上,生成共關聯網路G
  2. nx.spring_layout(G, k=0.5):計算網路G的佈局,k=0.5控制節點之間的距離。
  3. nx.draw_networkx_edges()nx.draw_networkx_nodes()nx.draw_networkx_labels():分別用於繪製網路的邊、節點和標籤。

加權投影的實作與視覺化

無權重投影會丟失部分結構資訊,因此可以使用加權投影來捕捉更多的資訊。以下程式碼展示瞭如何使用weighted_projected_graph()函式進行加權投影:

# 進行加權投影
G = bipartite.weighted_projected_graph(B, plants)

# 檢視邊的權重
list(G.edges(data=True))[0]

內容解密:

  1. bipartite.weighted_projected_graph(B, plants):將原始網路B進行加權投影,生成加權共關聯網路G
  2. list(G.edges(data=True))[0]:檢視第一條邊的權重,權重表示兩個節點之間的連線強度。

使用Jaccard指數進行加權投影

另一種加權投影方法是使用Jaccard指數,它衡量兩個節點之間的相似度。以下程式碼展示瞭如何使用overlap_weighted_projected_graph()函式進行根據Jaccard指數的加權投影:

# 使用Jaccard指數進行加權投影
G = bipartite.overlap_weighted_projected_graph(B, pollinators)

# 取得邊的權重
weight = [G.edges[e]['weight'] for e in G.edges]

# 建立圖形並繪製網路
plt.figure(figsize=(30,30))
pos = nx.spring_layout(G, weight='weight', k=0.5)
nx.draw_networkx_edges(G, pos, edge_color=weight, edge_cmap=plt.cm.Blues, width=6, alpha=0.5)
nx.draw_networkx_nodes(G, pos, node_color="#9f9fff", node_size=6000)
nx.draw_networkx_labels(G, pos)

內容解密:

  1. bipartite.overlap_weighted_projected_graph(B, pollinators):使用Jaccard指數對網路進行加權投影。
  2. edge_color=weightedge_cmap=plt.cm.Blues:根據邊的權重對邊進行著色,以視覺化連線的強度。

小規模結構 - 節點與中心性

網路科學不僅可用於瞭解系統的組成部分如何連線,還可用於瞭解這些部分的鄰居及其鄰居的鄰居之間的關係。換句話說,網路科學可以用來理解網路系統的結構是如何連線的。接下來的三章將描述如何使用網路科學來理解不同尺度下的網路結構。本章重點關注小規模或微觀結構。微觀結構描述了特定節點在更大網路中的位置和角色。這種分析可用於識別具有影響力的個體、流量瓶頸以及收集資訊或資源的便利位置。這些屬性(及其他屬性)可以使用中心性度量來量化,中心性度量量化了各個節點的各種結構屬性。本章介紹了幾種重要的中心性度量,並演示瞭如何使用 NetworkX 來計算和解釋它們。

本章主題包括以下內容:

  • 中心性:使用中心性度量量化節點的結構屬性
  • 中介中心性:使用中介中心性識別充當橋樑的節點
  • 特徵向量中心性:使用特徵向量中心性識別高度連線的節點
  • 接近中心性:使用接近中心性量化節點與網路其他部分之間的距離
  • 區域性聚類別:量化節點鄰域的互連程度

中心性 – 發掘關鍵節點

我對網路科學的興趣,部分是由我在駭客空間和創客空間的經歷所啟發。這些空間是由成員經營的組織,為 DIY/技術/藝術專案提供空間和工具。2009 年,我與其他幾個人在底特律地區創辦了一個名為 i3 Detroit 的空間。在我參與 i3 Detroit 期間,我對 i3 Detroit 和其他空間中發生的創意和創新感到震驚,不僅是在專案創作方面,還在於正在發展的獨特型別的志願者經營、非階層式組織。其中一個創新關鍵是想法如何在空間內部和之間傳播。想法透過參與全國性活動的人員和進行駭客空間旅遊的成員在空間之間傳播。想法透過那些似乎認識每個人並樂於分享他們知識和經驗的常客在空間內部傳播。一些志願管理員與其他空間的人保持聯絡,並定期在郵件列表或面對面討論想法,如果某個想法看起來不錯,就可以讓它很快從一個空間傳播到其他空間。駭客空間模型的快速發展和傳播依賴於能夠透過不同方式傳播資訊和想法的個人,這些方式取決於他們所擁有的關係型別——換句話說,取決於他們在社會網路結構中的位置。

內容解密:

本段落主要描述了作者對於網路科學的興趣來源,以及他在駭客空間和創客空間中的經歷。作者提到,這些由成員經營的組織為 DIY 專案提供了空間和工具,並且在這些空間中,創意和創新層出不窮。作者還提到了想法如何在這些空間內部和之間傳播,包括透過全國性活動、駭客空間旅遊、常客分享知識和經驗,以及志願管理員之間的討論。

import networkx as nx
import matplotlib.pyplot as plt

# 建立一個簡單的圖
G = nx.Graph()
G.add_edges_from([(1, 2), (1, 3), (2, 3), (2, 4), (3, 4), (4, 5)])

# 計算中心性度量
degree_centrality = nx.degree_centrality(G)
betweenness_centrality = nx.betweenness_centrality(G)
closeness_centrality = nx.closeness_centrality(G)

# 列印中心性度量結果
print("Degree Centrality:", degree_centrality)
print("Betweenness Centrality:", betweenness_centrality)
print("Closeness Centrality:", closeness_centrality)

# 繪製圖
nx.draw(G, with_labels=True)
plt.show()

內容解密:

這段程式碼演示瞭如何使用 NetworkX 計算一個簡單圖的各種中心性度量。首先,建立了一個包含 5 個節點和 6 條邊的無向圖。然後,分別計算了度中心性、中介中心性和接近中心性。最後,列印出了這些中心性度量的結果,並繪製了圖。

  1. degree_centrality = nx.degree_centrality(G):計算圖中每個節點的度中心性,即與該節點直接相連的邊數除以該節點可能擁有的最大邊數。
  2. betweenness_centrality = nx.betweenness_centrality(G):計算圖中每個節點的中介中心性,即透過該節點的最短路徑數量除以所有最短路徑的數量。
  3. closeness_centrality = nx.closeness_centrality(G):計算圖中每個節點的接近中心性,即該節點到其他所有節點的最短距離之和的倒數。

這些中心性度量可以用於分析節點在網路中的重要性和角色。

圖表翻譯: 此圖示展示了一個簡單的網路結構,包含五個節點(節點1至節點5)和它們之間的連線關係。節點1與節點2和節點3相連,節點2與節點3和節點4相連,節點3與節點4相連,節點4與節點5相連。這種結構可以用於分析資訊或資源在網路中的流動方式。

北美第一代駭客空間是在2007年的混沌通訊營(Chaos Communication Camp)後開始出現的,當時與會者受到歐洲駭客空間的啟發,回到美國後開始創辦Noisebridge(舊金山)、NYC Resistor(布魯克林)和HacDC(華盛頓特區)。這些空間成為其他空間的典範,在接下來的幾年裡,駭客空間如雨後春筍般出現在美國大多數主要城市。它們也是結識對網路科學和自由軟體感興趣的其他人的好地方!

節點與中心性:探索網路中的重要節點

在網路科學中,無論節點代表人、地方、電腦還是原子,它們在網路結構中的位置都與其在整體系統中的角色密切相關。不同的結構使不同的角色成為可能。因此,透過量化節點的結構屬性,可以瞭解該節點所扮演的角色。用於描述節點網路屬性的數值指標被稱為中心性指標。中心性通常被視為重要性的衡量標準,但節點的重要性有很多種表現形式。例如,最簡單的中心性指標之一是度中心性(degree centrality)。節點的度中心性就是它的鄰居數量(在有向網路中,有入度和出度之分)。在社交網路中,度中心性是衡量一個人受歡迎程度的指標,也許是猜測誰會舉辦最好的派對的好方法。

橋樑、經紀人與瓶頸:介數中心性

在流行的兒童遊戲「電話」中,一個玩家開始向另一個玩家低聲傳遞訊息,然後這個玩家再向另一個玩家傳遞,以此類別推。最後一個玩家大聲念出訊息。通常,最後的訊息與最初的訊息完全不同。每次訊息從一個人傳遞到另一個人時,它都有可能被改變,可能是因為聽錯了,或者是故意改變了。在更複雜的社交網路中,例如組織和社會運動,連線網路不同部分的人具有過濾、放大和改變訊息的最大能力。這些人被稱為經紀人(brokers),而跨越網路遙遠部分的邊被稱為橋樑(bridges)。這些節點和邊的重要性並不僅限於社交網路。在流網路中——例如鐵路、水管和電信系統——連線網路遙遠部分的節點可以充當瓶頸,限制流量的大小。識別這些瓶頸使得增加它們的容量並保護它們免受故障和攻擊成為可能。橋樑和經紀人很重要,因為它們站在網路的不同部分之間。因此,用於識別橋樑和經紀人的中心性型別被稱為介數中心性(betweenness centrality)。

介數中心性的計算

要理解介數中心性,首先需要了解最短路徑(shortest path)的概念。路徑是一系列節點,沿著邊從一個鄰居移動到另一個鄰居(在有向網路中,路徑遵循出邊)。路徑也可以被賦予長度,這有助於確定任意兩個節點是否彼此接近。在無權網路中,路徑長度通常是路徑中的邊數,有時被稱為“跳數”。在加權網路中,有很多方法可以根據場景計算路徑長度。如果邊權重代表距離或旅行時間,那麼透過簡單地將路徑中所有邊的權重相加來計算路徑長度是有意義的。然後可以使用路徑長度來定義兩個節點之間的距離:連線它們的最短路徑的長度。

import networkx as nx

# 建立一個示例網路
G = nx.Graph()
G.add_edges_from([(1, 2), (1, 3), (2, 4), (3, 4), (4, 5)])

# 計算介數中心性
betweenness = nx.betweenness_centrality(G)

#### 內容解密:
此程式碼片段首先匯入了 NetworkX 函式庫並建立了一個簡單的無向圖 `G`。然後透過 `add_edges_from` 方法增加了邊來構建網路最後使用 `betweenness_centrality` 函式計算了網路中每個節點的介數中心性並將結果儲存在 `betweenness` 字典中介數中心性反映了節點在網路中的橋樑角色

圖表示例:介數中心性的計算

以下是一個簡單的網路圖示,展示了節點 A 和 B 之間的不同路徑:

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title 網路分析投影技術與中心性指標應用

package "圖論網路分析" {
    package "節點層" {
        component [節點 A] as nodeA
        component [節點 B] as nodeB
        component [節點 C] as nodeC
        component [節點 D] as nodeD
    }

    package "中心性指標" {
        component [度中心性
Degree Centrality] as degree
        component [特徵向量中心性
Eigenvector Centrality] as eigen
        component [介數中心性
Betweenness Centrality] as between
        component [接近中心性
Closeness Centrality] as close
    }
}

nodeA -- nodeB
nodeA -- nodeC
nodeB -- nodeD
nodeC -- nodeD

nodeA --> degree : 計算連接數
nodeA --> eigen : 計算影響力
nodeB --> between : 計算橋接度
nodeC --> close : 計算距離

note right of degree
  直接連接數量
  衡量局部影響力
end note

note right of eigen
  考慮鄰居重要性
  衡量全局影響力
end note

@enduml

圖表翻譯: 此圖示展示了節點 A 和 B 之間的兩條路徑:直接路徑 A->B 和間接路徑 A->C->B。介數中心性計算將考慮這些路徑來評估節點的重要性。

小規模網路分析:節點與中心性指標

在社會網路分析中,節點的中心性(Centrality)是衡量其在網路中重要性的關鍵指標。本章節將探討兩個重要的中心性指標:介數中心性(Betweenness Centrality)特徵向量中心性(Eigenvector Centrality),並透過 Python 和 NetworkX 套件進行實作分析。

載入資料並構建隸屬網路

首先,我們需要載入資料並構建一個隸屬網路(Affiliation Network),然後將其投影到一個僅包含人員節點的共同隸屬網路(Co-affiliation Network)。

import networkx as nx
from pathlib import Path

# 建立空的隸屬網路和人員集合
B = nx.Graph()
people = set()

# 載入資料檔案到網路中
data_dir = Path('.') / 'data'
with open(data_dir / 'edwards2009' / '50_ALL_2M.csv') as f:
    # 解析表頭
    events = next(f).strip().split(",")[1:]
    
    # 解析每一行資料
    for row in f:
        parts = row.strip().split(",")
        person = parts[0]
        people.add(person)
        for j, value in enumerate(parts[1:]):
            if value != "0":
                B.add_edge(person, events[j], weight=int(value))

# 將隸屬網路投影到人員-人員共同隸屬網路
G = nx.bipartite.projected_graph(B, people)

內容解密:

  1. 使用 networkx 套件建立一個空的無向圖 B 來表示隸屬網路。
  2. 從 CSV 檔案中讀取資料,並解析表頭以取得事件列表。
  3. 逐行讀取資料,將人員新增到 people 集合中,並根據資料值在人員和事件之間建立邊。
  4. 使用 bipartite.projected_graph 將隸屬網路投影到人員-人員共同隸屬網路 G

介數中心性分析

介數中心性衡量一個節點在網路中作為「橋樑」的重要性。以下是計算 suffragette 運動網路中介數中心性的程式碼:

betweenness = nx.betweenness_centrality(G, normalized=False)
top_10_betweenness = sorted(betweenness.items(), key=lambda x: x[1], reverse=True)[0:10]
print(top_10_betweenness)

輸出結果顯示了介數中心性最高的 10 個人員,例如 Maud Joachim 和 Ada Wright。

內容解密:

  1. 使用 nx.betweenness_centrality 函式計算網路 G 中每個節點的介數中心性。
  2. 將結果按照介數中心性值進行降序排序,並選取前 10 名。
  3. 列印出介數中心性最高的 10 個人員及其對應的介數中心性值。

特徵向量中心性分析

特徵向量中心性衡量一個節點與其他重要節點的連執行緒度。以下是計算 suffragette 運動網路中特徵向量中心性的程式碼:

eigenvector = nx.eigenvector_centrality(G)
top_10_eigenvector = sorted(eigenvector.items(), key=lambda x: x[1], reverse=True)[0:10]
print(top_10_eigenvector)

輸出結果顯示了特徵向量中心性最高的 10 個人員,例如 Maud Joachim 和 Caroline A Downing。

內容解密:

  1. 使用 nx.eigenvector_centrality 函式計算網路 G 中每個節點的特徵向量中心性。
  2. 將結果按照特徵向量中心性值進行降序排序,並選取前 10 名。
  3. 列印出特徵向量中心性最高的 10 個人員及其對應的特徵向量中心性值。

結果分析

透過比較介數中心性和特徵向量中心性的結果,我們可以發現一些人員在兩個指標上都有較高的排名,例如 Maud Joachim。然而,也有一些人員在某個指標上表現突出,但在另一個指標上排名較低。這表明這些人員在網路中扮演著不同的角色。

綜合上述分析,我們可以更深入地瞭解 suffragette 運動網路的結構和特點,並對其中重要的人員進行識別和分析。