【图嵌入】DeepWalk原理与代码实战
DeepWalk
基礎理論
了解過 NLP 的同學對 word2vec 應該不陌生,word2vec 通過句子中詞與詞之間的共現關系來學習詞的向量表示,如果你忘記了,可以看看我之前的博客:
DeepWalk 出自論文:DeepWalk: Online Learning of Social Representations,它的思想與 word2vec 類似,從一個初始節點沿著圖中的邊隨機游走一定的步數,將經過的節點序列視為句子。那么,從不同的起點開始的不同游走路線就構成了不同的句子。當獲取到足夠數量的句子(節點訪問序列)后,可以使用 skip-gram 模型對每個節點學習其向量表示。這個過程如下圖所示:
以下是對 DeepWalk 的一些思考與個人理解:
DeepWalk 利用類似深度優先遍歷的方式將復雜的圖結構轉換為序列,進而實現節點的Embedding。這個遍歷的過程相當于對圖中的節點進行采樣,捕獲局部上下文信息。上圖中B與D都是A與E共有的鄰居,那么在經過節點B、D的隨機游走序列中,節點A或者節點E出現的頻率也比較高,說明節點A和E具有相似的上下文語境,那么A和E的Embedding表示也應該相似。
下面再來看個更直觀的例子,如下圖中的節點1、4是節點2、3共有的鄰居:
那么在經過節點1、4的隨機游走序列中,節點2或者節點3出現的頻率也比較高,例如:
- 0,4,3
- 0,4,2
- 1,2
- 1,3
- 1,4,3
- 1,4,2
- …
那么根據 skip-gram 模型的思想,節點2,3的局部上下文語境比較相似,于是最終學習到的節點2、3的Embedding表示也就比較相似。這也意味著,當兩個節點共有的鄰居節點越多,那么這兩個節點就越相似。
代碼實現
結合上面的理論基礎,要使用 DeepWalk 得到節點的向量表示,需要分為三個步驟:
1,構造圖
主要是使用 networkx 這個庫來從文件中讀取邊的信息來構造圖,文件的每一行分別是:
node1 node2 <edge_weight> node1 node3 <edge_weight> ......其中,邊的權重 edge_weight 不是必須有的。具體讀取數據并構造圖的代碼如下:
import networkx as nx # create_using=nx.DiGraph() 表示構造的是有向圖 G = nx.read_edgelist('data/wiki/Wiki_edgelist.txt', create_using=nx.DiGraph())2,隨機游走
下面是生成隨機游走序列的代碼:
import random# 從 start_node 開始隨機游走 def deepwalk_walk(walk_length, start_node):walk = [start_node]while len(walk) < walk_length:cur = walk[-1]cur_nbrs = list(G.neighbors(cur))if len(cur_nbrs) > 0:walk.append(random.choice(cur_nbrs))else:breakreturn walk# 產生隨機游走序列 def _simulate_walks(nodes, num_walks, walk_length):walks = []for _ in range(num_walks):random.shuffle(nodes)for v in nodes:walks.append(deepwalk_walk(walk_length=walk_length, start_node=v))return walks# 得到所有節點 nodes = list(G.nodes()) # 得到序列 walks = _simulate_walks(nodes, num_walks=80, walk_length=10)3,嵌入
為了方便起見,這里就使用 gensim 中的 Word2Vec 來實現節點的 Embedding 了:
from gensim.models import Word2Vec # 默認嵌入到100維 w2v_model = Word2Vec(walks,sg=1,hs=1) # 打印其中一個節點的嵌入向量 print(w2v_model['1397'])輸出為:
array([-3.57212842e-01, -4.52286422e-01, 1.20047189e-01, 9.33077093e-03,-4.87361886e-02, 6.53029561e-01, 3.87212396e-01, -4.35320556e-01,4.67856340e-02, -4.55924332e-01, -5.82973696e-02, 1.50977358e-01,......,-1.48566559e-01, 4.78760689e-01, 9.73562971e-02, -5.75734824e-02,-2.45316476e-01, -2.85568893e-01, 2.79851675e-01, 3.75600569e-02],dtype=float32)優點分析
使用隨機游走有兩個好處:
- 并行化,隨機游走是局部的,對于一個大的網絡來說,可以同時在不同的頂點開始進行一定長度的隨機游走,多個隨機游走同時進行,可以減少采樣的時間。
- 適應性,可以適應網絡局部的變化。網絡的演化通常是局部的點和邊的變化,這樣的變化只會對部分隨機游走路徑產生影響,因此在網絡的演化過程中不需要每一次都重新計算整個網絡的隨機游走。
參考文章:
Graph Embedding:從DeepWalk到SDNE - 知乎
【Graph Embedding】DeepWalk:算法原理,實現和應用
總結
以上是生活随笔為你收集整理的【图嵌入】DeepWalk原理与代码实战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux安装卸载软件的命令_shell
- 下一篇: sql索引的建立与使用_sqlserve