社群網路分析是理解資訊如何在網路中傳播的關鍵。透過分析網路結構,例如節點之間的連線方式和強度,可以揭示社群網路的特性,例如小世界現象和社群結構。本文將介紹如何使用 Python 的 NetworkX 函式庫分析社群網路,並探討幾種常見的網路模型,例如 Watts-Strogatz 模型和 Barabási-Albert 模型,以及如何模擬病毒在網路中的傳播。這些技術對於理解資訊傳播、社群結構和網路動力學至關重要,並且可以應用於各種領域,例如社交媒體分析、流行病學和行銷。
社交網路與病毒式傳播:深入解析網路結構與資訊傳遞
網路社群分析與邊緣強度
在探討社交網路時,瞭解社群結構及其成員之間的關係至關重要。利用NetworkX圖書館,我們可以對網路進行深入分析。首先,我們為網路中的節點分配屬性,以代表成員所屬的俱樂部。
nx.set_node_attributes(G, dict(enumerate(member_club)), 'club')
內容解密:
set_node_attributes函式用於為圖中的節點設定屬性。enumerate(member_club)生成一個包含俱樂部成員索引及其對應俱樂部屬性的字典。- 這一步驟使我們能夠區分不同社群中的成員。
接下來,我們找出網路中的內部邊緣(internal edges)和外部邊緣(external edges)。內部邊緣連線的是同一社群內的成員,而外部邊緣則連線不同社群的成員。
internal = [(v, w) for v, w in G.edges if G.nodes[v]['club'] == G.nodes[w]['club']]
external = [(v, w) for v, w in G.edges if G.nodes[v]['club'] != G.nodes[w]['club']]
內容解密:
- 列表推導式用於遍歷圖中的所有邊緣。
G.nodes[v]['club'] == G.nodes[w]['club']判斷兩個節點是否屬於同一社群。- 內部邊緣代表社群內的緊密聯絡,而外部邊緣則代表不同社群間的橋樑。
邊緣強度與橋樑跨度
衡量邊緣強度的一種方法是計算兩個節點之間的共同鄰居數量。
def tie_strength(G, v, w):
v_neighbors = set(G.neighbors(v))
w_neighbors = set(G.neighbors(w))
return 1 + len(v_neighbors & w_neighbors)
內容解密:
G.neighbors(v)傳回節點v的所有鄰居。v_neighbors & w_neighbors計算兩個節點的共同鄰居。- 邊緣強度是共同鄰居數量加一,以避免強度為零的情況。
橋樑跨度是指移除某條邊緣後,其端點之間的網路距離。
def bridge_span(G):
edges = G.edges()
G_copy = nx.Graph(G)
result = dict()
for v, w in edges:
G_copy.remove_edge(v, w)
try:
d = nx.shortest_path_length(G_copy, v, w)
result[(v, w)] = d
except nx.NetworkXNoPath:
result[(v, w)] = float('inf')
G_copy.add_edge(v, w)
return result
內容解密:
G_copy.remove_edge(v, w)臨時移除邊緣,以計算端點之間的距離。nx.shortest_path_length計算兩個節點之間的最短路徑長度。- 如果移除邊緣後兩點之間無路徑,則跨度設為無窮大。
小世界問題
1967年,特拉弗斯和米爾格蘭姆進行了一項著名的實驗,結果表明大多數人之間只需要六度分隔。
環形網路
在一個k-環形網路中,每個節點與其鄰近的k個節點相連。這種網路結構可以用於模擬區域性連線的社交網路。
G_small_ring = nx.watts_strogatz_graph(16, 4, 0)
pos = nx.circular_layout(G_small_ring)
nx.draw_networkx(G_small_ring, pos=pos, with_labels=False)
內容解密:
watts_strogatz_graph函式生成一個具有特定連線模式的網路。circular_layout將節點排列在圓週上,以便視覺化。
對於一個具有4000個節點的10-環形網路,其平均最短路徑長度和平均叢集係數可以透過以下程式碼計算:
G_ring = nx.watts_strogatz_graph(4000, 10, 0)
nx.average_shortest_path_length(G_ring)
nx.average_clustering(G_ring)
內容解密:
average_shortest_path_length計算網路中任意兩點之間的最短路徑平均值。average_clustering計算網路的平均叢集係數,衡量節點之間的叢集程度。
社會網路與病毒式傳播第八章
真實社會網路的特性
在探討社會網路時,我們經常會遇到兩個重要的指標:平均最短路徑和平均叢集係數。平均最短路徑代表了網路中任意兩個節點之間的平均距離,而平均叢集係數則衡量了網路中節點之間的聚集程度。
環狀網路模型
首先,我們來看看一個簡單的環狀網路模型。這個模型中,每個節點與其鄰近的節點相連,形成一個環狀結構。透過計算,我們發現這個網路的平均最短路徑長度約為200,遠大於我們通常預期的「六度分隔」。同時,其平均叢集係數為0.67,顯示出節點之間的高度聚集性。
# 載入資料檔案到網路中
from pathlib import Path
data_dir = Path('.') / 'data'
G_social = nx.read_edgelist(data_dir / 'mcauley2012' / 'facebook_combined.txt')
nx.average_shortest_path_length(G_social)
3.6925068496963913
nx.average_clustering(G_social)
0.6055467186200876
真實社會網路的比較
接下來,我們將上述結果與真實的社會網路進行比較。透過分析一個真實的社交網路資料,我們發現其平均最短路徑長度約為3.69,遠小於環狀網路模型的結果,而平均叢集係數約為0.61,與環狀網路模型相近。這種現象看似矛盾,因為我們通常預期高度聚集的網路應該具有較長的平均最短路徑。
內容解密:
- 這段程式碼展示瞭如何載入一個真實的社交網路資料,並計算其平均最短路徑和平均叢集係數。
nx.read_edgelist函式用於讀取網路資料。nx.average_shortest_path_length和nx.average_clustering函式分別用於計算平均最短路徑和平均叢集係數。- 結果顯示真實社交網路具有較短的平均最短路徑和較高的平均叢集係數。
隨機網路模型
為了探究上述現象的原因,我們引入了隨機網路模型。在這個模型中,我們從一個環狀網路開始,然後隨機地重新連線邊。結果顯示,這種隨機化過程大大縮短了平均最短路徑,但同時也降低了平均叢集係數。
G_small_random = nx.watts_strogatz_graph(16, 4, 1)
pos = nx.circular_layout(G_small_random)
nx.draw_networkx(G_small_random, pos=pos, with_labels=False)
內容解密:
- 這段程式碼展示瞭如何使用
watts_strogatz_graph函式生成一個隨機網路。 nx.circular_layout函式用於計算節點的位置,以便進行視覺化。nx.draw_networkx函式用於繪製網路圖。
Watts-Strogatz網路模型
1998年,Duncan Watts和Steven Strogatz提出了一個新的網路模型,能夠同時實作高叢集係數和短平均最短路徑。這個模型根據環狀網路,但只隨機地重新連線一部分邊。
path = []
clustering = []
p = [10**(x) for x in range(-6, 1)]
for p_i in p:
path_i = []
clustering_i = []
for n in range(10):
G = nx.watts_strogatz_graph(1000, 10, p_i)
path_i.append(nx.average_shortest_path_length(G))
clustering_i.append(nx.average_clustering(G))
path.append(sum(path_i) / len(path_i))
clustering.append(sum(clustering_i) / len(clustering_i))
內容解密:
- 這段程式碼展示瞭如何使用
watts_strogatz_graph函式生成一系列具有不同重新連線機率的網路。 - 對每個網路,計算其平均最短路徑和平均叢集係數。
- 結果儲存在
path和clustering列表中,用於後續分析。
接觸傳播與網路結構
瞭解網路結構對於社會過程(如疾病傳播或資訊傳播)的影響至關重要。我們將探討簡單傳染模型在不同網路結構中的傳播行為。
def propagate_simple(G):
to_infect = set([])
for v in G.nodes():
if G.nodes[v]['infected'] == False:
for w in nx.neighbors(G, v):
if G.nodes[w]['infected']:
to_infect.add(v)
break
for v in to_infect:
G.nodes[v]['infected'] = True
內容解密:
- 這段程式碼定義了一個簡單傳染模型的傳播函式
propagate_simple。 - 函式遍歷所有節點,檢查其鄰居是否已被感染。如果是,則將該節點標記為待感染。
- 最後,將所有待感染節點的狀態更新為已感染。
第9章:模擬與分析
網路結構與網路系統中發生的過程密切相關。不同的過程創造不同的結構,而不同的結構影響網路過程。模擬可用於生成合成網路,這些網路可用於研究真實系統中結構如何形成。真實或合成網路也可用於模擬在這些網路上發生的過程,以瞭解結構對這些過程的影響。本章介紹了幾種常見的合成網路模型,以及使用根據代理的建模來模擬網路過程的範例。
9.1 瓦特-斯特羅加茨網路與小世界現象
小世界問題(在第8章「社會網路與病毒式傳播」中討論)詢問,即使每個人的連線都是本地的,遠距離的人如何能夠透過短路徑相連。 Duncan Watts 和 Steven Strogatz(1998)開發了一類別網路來解釋這種行為。這些網路最初是 k-環:節點圍成一個圓圈,每個節點與其最近的 k 個鄰居相連。然後,以機率 p,每個節點的邊被移動到一個隨機選擇的其他節點。這些重新連線在網路中建立了捷徑。即使是少量的捷徑也能大大減少網路中節點之間的距離,解決了小世界問題。
import networkx as nx
import matplotlib.pyplot as plt
# 建立一個瓦特-斯特羅加茨網路
G = nx.watts_strogatz_graph(16, 4, 0.2)
# 繪製網路
pos = nx.circular_layout(G)
nx.draw_networkx(G, pos)
plt.title("瓦特-斯特羅加茨網路")
plt.show()
內容解密:
上述程式碼使用 NetworkX 函式庫建立了一個瓦特-斯特羅加茨網路,並使用 Matplotlib 繪製了該網路。其中,watts_strogatz_graph 函式用於建立瓦特-斯特羅加茨網路,引數分別為節點數(16)、每個節點的鄰居數(4)和重新連線的機率(0.2)。
9.2 優先連線:富者愈富的無尺度網路
優先連線是一種生成無尺度網路的機制,其中新節點傾向於與已經具有許多連線的節點相連。這種機制導致了無尺度網路的形成,其度分佈遵循重尾分佈。
import networkx as nx
import matplotlib.pyplot as plt
# 建立一個巴拉巴西-艾伯特網路(優先連線)
G = nx.barabasi_albert_graph(16, 2)
# 繪製網路
pos = nx.spring_layout(G)
nx.draw_networkx(G, pos)
plt.title("巴拉巴西-艾伯特網路")
plt.show()
內容解密:
上述程式碼使用 NetworkX 函式庫建立了一個巴拉巴西-艾伯特網路(優先連線),並使用 Matplotlib 繪製了該網路。其中,barabasi_albert_graph 函式用於建立巴拉巴西-艾伯特網路,引數分別為節點數(16)和新節點連線的邊數(2)。
9.3 組態模型:模擬真實網路的屬性
組態模型是一種用於生成具有指定度序列的隨機網路的方法。這種模型可用於研究具有特定屬性的網路的行為。
9.4 根據代理的建模:模擬網路過程
根據代理的建模是一種用於模擬複雜系統中的代理行為和互動作用的方法。這種方法可用於研究網路中的過程,例如資訊傳播、疾病傳播等。
此圖示顯示了瓦特-斯特羅加茨網路和巴拉巴西-艾伯特網路的範例。
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title 解析網路結構與資訊傳遞模型
package "網路結構分析" {
package "網路特性" {
component [小世界現象] as small_world
component [社群結構] as community
component [邊緣強度] as tie_strength
}
package "網路模型" {
component [Watts-Strogatz] as ws
component [Barabási-Albert] as ba
component [組態模型] as config
}
package "應用場景" {
component [病毒傳播模擬] as virus
component [NetworkX 分析] as networkx
component [資訊傳遞] as info
}
}
small_world --> community : 叢集分析
ws --> ba : 優先連結
networkx --> virus : 動態模擬
note bottom of tie_strength
共同鄰居計算
橋樑跨度分析
end note
collect --> clean : 原始資料
clean --> feature : 乾淨資料
feature --> select : 特徵向量
select --> tune : 基礎模型
tune --> cv : 最佳參數
cv --> eval : 訓練模型
eval --> deploy : 驗證模型
deploy --> monitor : 生產模型
note right of feature
特徵工程包含:
- 特徵選擇
- 特徵轉換
- 降維處理
end note
note right of eval
評估指標:
- 準確率/召回率
- F1 Score
- AUC-ROC
end note
@enduml內容解密:
此圖示顯示了兩種常見的合成網路模型:瓦特-斯特羅加茨網路和巴拉巴西-艾伯特網路。瓦特-斯特羅加茨網路透過重新連線建立了小世界現象,而巴拉巴西-艾伯特網路透過優先連線形成了無尺度網路。
網路模擬與分析:複雜網路模型建構
在複雜網路的研究中,各種模型被提出來模擬和分析真實世界的網路結構與行為。本章節將探討幾種重要的網路模型,包括Watts-Strogatz小世界網路、Newman-Watts-Strogatz網路、Barabási-Albert優先連結模型以及組態模型。
Watts-Strogatz小世界網路模型
Watts-Strogatz小世界網路是一種介於規則網路和隨機網路之間的模型,能夠模擬許多現實世界中的網路特性。其建構過程是從一個規則的環形網路開始,然後以一定的機率重新連線邊。
import matplotlib.pyplot as plt
import networkx as nx
plt.figure(figsize=(7.5, 2.25))
for i, p in enumerate([0.0, 0.1, 1.0]):
G = nx.watts_strogatz_graph(12, 6, p)
plt.subplot(1, 3, i + 1)
pos = nx.circular_layout(G)
nx.draw_networkx(G, pos=pos)
plt.title("p = {:0.1f}".format(p))
內容解密:
watts_strogatz_graph(12, 6, p)函式用於生成Watts-Strogatz小世界網路,其中12代表節點數量,6是每個節點初始連線的鄰居數量,p是重新連線的機率。- 迴圈遍歷三種不同的重新連線機率(0.0、0.1、1.0),並視覺化對應的網路結構。
circular_layout用於將節點擺放在圓形佈局中,以便清晰展示網路結構。
Newman-Watts-Strogatz小世界網路模型
Newman-Watts-Strogatz模型是Watts-Strogatz模型的變體,保證了生成的網路是連通的。它在重新連線邊時,不會刪除原有的邊,而是新增新的邊。
plt.figure(figsize=(7.5, 2.25))
for i, p in enumerate([0.0, 0.1, 1.0]):
G = nx.newman_watts_strogatz_graph(12, 6, p)
plt.subplot(1, 3, i + 1)
pos = nx.circular_layout(G)
nx.draw_networkx(G, pos=pos)
plt.title("p = {:0.1f}".format(p))
內容解密:
newman_watts_strogatz_graph(12, 6, p)函式用於生成Newman-Watts-Strogatz小世界網路,引數含義與Watts-Strogatz模型相同。- 該模型透過保留原始邊並新增新的邊來保證網路的連通性。
- 視覺化結果展示了不同重新連線機率下的網路結構。
Barabási-Albert優先連結模型
Barabási-Albert模型是一種用於生成無尺度網路的演算法,模擬了許多現實世界中的網路特性,如網際網路和社交網路。該模型根據「富者越富」的原則,新加入的節點傾向於與已經具有較多連線的節點相連。
G_preferential_35 = nx.barabasi_albert_graph(35, 1)
pos = nx.spring_layout(G_preferential_35, k=0.1)
nx.draw_networkx(G_preferential_35, pos)
內容解密:
barabasi_albert_graph(35, 1)函式生成了一個具有35個節點的Barabási-Albert無尺度網路,其中1代表每次新增節點時連線的邊數。spring_layout用於計算節點的位置,以便視覺化展示網路結構。- 該模型的特點是少數節點具有大量的連線,而大多數節點的連線較少,形成重尾分佈。
組態模型
組態模型是一種用於生成具有特定度序列的隨機網路的演算法。它根據給定的度序列生成一個新的網路,使得新網路中的每個節點具有與原始網路相同的度。
G_karate = nx.karate_club_graph()
degree_sequence = list(dict(nx.degree(G_karate)).values())
G_configuration = nx.degree_seq.configuration_model(degree_sequence)
nx.draw_networkx(G_configuration)
內容解密:
karate_club_graph()函式載入了Zachary空手道俱樂部的經典網路資料集。degree_sequence儲存了原始網路中每個節點的度。configuration_model(degree_sequence)根據度序列生成了一個新的隨機網路。- 該模型可用於保護隱私,例如在不暴露真實社交網路資料的情況下,研究其結構特性。
根據代理人的模型
除了研究網路結構本身,模擬還可以用於探索在現有網路上發生的過程。這類別模擬可用於預測改變網路結構對複雜系統的影響,或預測諸如交通擁堵和電力中斷等問題。這些根據代理人的模型能夠幫助我們更好地理解複雜系統的動態行為。