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

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