Graph Embedding(一)—— DeepWalk的原理及實現

1. 概念介紹

:是一種非常常用的結構,包含邊和節點;

Graph Embedding:圖中的每個節點會對應一個詞向量,某兩個節點挨的越近(或者聯繫越緊密、或者共同的邊越多),詞向量在詞向量空間裏也就越近(想想單詞的詞向量的定義,和這差不多,就是把文字中的單詞遷移到圖的節點了)

2. deepwalk

想想單詞的詞向量訓練的時候,是不是根據文本序列,生成中心詞和上下文詞列表分別作爲輸入輸出訓練skipgram模型的;那麼對於圖來說,怎麼生成節點序列呢?有節點序列就可以生成中心節點和上下文節點列表,就可以訓練skipgram模型了!並且這個節點序列一定要像文本序列一樣的分佈,即聯繫得緊密,就越能共現,deepwalk生成的節點序列就有這個特點!

那麼deepwalk到底是什麼呢?怎麼生成節點序列呢?它真的是經典又簡單。

顧名思義:隨機遊走,我從任意一個節點出發,隨機選擇和該節點有邊的一個節點作爲下一個節點,不斷重複這個過程,就生成了一個節點序列啦!用我們的意念想一想!是不是採樣的節點序列多了以後,聯繫得越緊密的節點,就越能共現。嚴謹的同分布證明在paper裏有,感興趣的可以看!

3. deepwalk流程

4.deepwalk核心代碼

    def deep_worker(self):
        for _ in range(self.nums):
            for node in self.G.nodes():
                self.node_series.append(self.random_walker(node))

    def random_walker(self, first_node):
        series = [first_node]
        for _ in range(1, self.walk_length):
            nodes_list = list(self.G.adj[first_node])
            first_node = random.choice(nodes_list)
            series.append(first_node)
        return series

5. 實驗

在wiki數據集上做實驗,wiki數據集包含 2,405 個網頁和17,981條網頁之間的鏈接關係,以及每個網頁的所屬類別。

實驗中word2vec模型使用gensim的skipgram,畢竟我自己寫的skipgram比較慢,我還沒找着慢的原因...

可以看到相同顏色的點基本都聚在一起,說明他們比較相似嘛! 

 

(明天有時間會把)數據和代碼放在本人的github裏,寫的比較搓,待改進...

參考網址:https://zhuanlan.zhihu.com/p/56380812

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章