如何將儲存在磁碟上的鄰接矩陣輸入到 R 程式中,是進行社交網路分析的起點。在前面的章節中已經介紹了基本的資料結構以及程式碼結構,本章將會面對一個實質性問題,學習如何匯入一個圖以及計算圖的一些屬性。
圖的檔案表示
在計算機中,最常見的兩種表示圖的基本結構是鄰接矩陣和鄰接表。以最簡單的無權無向圖為例,鄰接矩陣中第 \(i\) 行第 \(j\) 列的元素 \(a_{ij}\) 如果等於 1,則表示頂點 \(i\) 和頂點 \(j\) 之間有邊,即鄰接矩陣將所有節點之間的關係都表示出來。鄰接表則是對頂點 \(i\) 建立一個單連結串列,這個單連結串列由頂點 \(i\) 的所有鄰居節點構成,即鄰接表只是把存在關係的節點表示出來。
網路上許多公開的資料集更常使用三元組去表示一個圖。下面是一個三元組的示例,以第一行的三元組 (1, 2, 1) 為例,它表示有一條從頂點 1 指向頂點 2 的邊,並且該邊的權重為 1。對於無權圖而言,通常會省略三元組中的第三個元素。
1 2 1
1 3 -1
2 3 -1
1 4 -1
3 4 1
? 提示
公開資料集大多數可以從下面的網站上找到:
1. Stanford Large Network Dataset Collection:http://snap.stanford.edu/data
2. The KONECT Project:http://konect.cc/networks
匯入一個圖
下面以 Dolphins 網路為例,將其匯入到 R 程式中。Dolphins 是一個無權無向的真實網路,描述了生活在紐西蘭的一個峽灣附近的寬吻海豚社群,其中節點表示海豚,邊表示海豚間的社會關係。將資料集下載完成後,開啟名為 out
的檔案。
% sym unweighted
9 4
10 6
10 7
11 1
......
在讀取檔案之前還需要對其進行一下修改,可以看到該檔案的第一行“% sym unweighted
”是由空格分隔的三個元素,R 語言還沒有太過智慧,在讀取到第二行時會因為只有兩個元素而報錯,因此需要將第一行刪除。下面使用 read.table()
將檔案讀入到 R 程式中:
graph.edges <- read.table(file = "out.dolphins", header = FALSE)
? 提示
也可以將 out 檔案中的製表符(\t)替換成逗號(,),將檔案更改為使用逗號分隔的 CSV 檔案,並使用 read.csv()
函式讀取。
你也許會好奇讀入的 graph.edges
到底是什麼東西,使用 class()
函式來看看變數的型別:
> class(graph.edges)
[1] "data.frame"
data.frame
似乎前面的章節並沒有介紹,受限於研究的方向,這有可能是你唯一一次接觸資料框型別,不用管它,下面將讀入的資料轉換為圖:
> library(igraph)
> graph <- graph_from_data_frame(graph.edges, directed = FALSE)
下面畫圖看看匯入的 Dolphins 網路:
> class(graph)
[1] "igraph"
> plot(graph)
輸出一下 Dolphins 網路的規模:
> cat(sprintf("Nodes: %s\nEdges: %s\n", length(V(graph)), length(E(graph))))
Nodes: 62
Edges: 159
這裡使用了兩個全新的函式 V()
和 E()
,其中 V()
是獲取圖的點集,E()
是獲取圖的邊集,今後的大部分分析是建立在這兩個集合之上,這兩個函式會伴隨你的 R 語言旅程直到結束。
匯入的網路可以儲存為 R 檔案,下次可以直接載入使用,使用同樣的方法也可以持久化實驗資料。
> save(graph, file = "dolphins.RData") # 儲存 graph 變數
> load(file = "dolphins.RData") # 匯入 RData 檔案中儲存的變數
生成人工網路
使用人工網路驗證演算法的有效性也是實驗中必不可少的一環,下面介紹幾種常見的人工網路結構。
- 全連線圖
graph <- make_full_graph(10)
- 樹狀圖
graph <- make_tree(21, children = 3, mode = "undirected")
- k-正則圖
graph <- sample_k_regular(20, 3)
- Erdos-Renyi Random
graph <- sample_gnp(20, 0.1)
- 小世界網路
graph <- sample_smallworld(dim = 1, size = 20, nei = 2, p = 0.1)
? 提示
其他人工結構請檢視 igraph 文件:https://igraph.org/r/doc
圖的基本分析
上文從匯入外部網路和生成人工網路兩個角度獲得了 igraph
圖物件,下面將使用 igraph
包中的函式對 Dolphins 網路進行簡單的分析。
- 判斷圖的連通性
> is.connected(graph) [1] TRUE
- 計算圖的度
> degree(graph) # 計算圖中所有節點的度,其中第一行為節點的名稱,第二行為節點的度 9 10 11 ... 6 7 5 ... > degree(graph, v = "9") # 計算圖中部分節點的度 9 6
- 計算圖的密度
> edge_density(graph) [1] 0.0840825
- 對圖的路徑分析
> diameter(graph, directed = FALSE, weights = NA) # 直徑 [1] 8 > radius(graph) # 半徑 [1] 5 > distances(graph, v = V(graph)$name[1], to = V(graph)$name[10], algorithm = "unweighted", weights = NA) # 計算節點間的最短距離 20 9 3 > shortest_paths(graph, from = "1", to = "6", weights = NA) # 計算節點1到節點6的最短路徑 $vpath $vpath[[1]] + 6/62 vertices, named, from e1ce364: [1] 1 41 37 40 58 6
- 計算圖的聚類係數
> transitivity(graph, type = "average") [1] 0.3029323
✏️ 練習
1. 試著在資料集網站中下載其他網路匯入到 R 程式中;
2. 試著計算匯入網路的平均度;
3. 查詢 igraph 文件,試著計算匯入網路的同配係數(Assortativity)。