前言

继DeepWalk后,我们再来看一种基于随机游走策略的图嵌入方法——Node2Vec,有点像前者的升级版本,有了前者的基础,理解起来会快很多。

核心方法

Node2Vec与DeepWalk最大的不同(甚至是唯一的不同)就是在于节点序列的生成机制。DeepWalk在每一步探索下一个节点时,是在其邻居节点中进行随机选择,然后基于深度优先策略生成一个固定长度的节点序列。而Node2Vec在生成节点序列时,引入了更加灵活的机制,通过几个超参数来控制向不同方向生长的概率。其核心思路用以下三个图足以充分体现:

在github上可以看其源代码是这样的:

def node2vec_walk(self, walk_length, start_node):

'

Simulate a random walk starting from start node.

'

G = self.G

alias_nodes = self.alias_nodes

alias_edges = self.alias_edges

walk = [start_node]

while len(walk) < walk_length:

cur = walk[-1]

cur_nbrs = sorted(G.neighbors(cur))

if len(cur_nbrs) > 0:

if len(walk) == 1:

walk.append(cur_nbrs[alias_draw(alias_nodes[cur][0], alias_nodes[cur][1])])

else:

prev = walk[-2]

next = cur_nbrs[alias_draw(alias_edges[(prev, cur)][0],

alias_edges[(prev, cur)][1])]

walk.append(next)

else:

break

return walk

可见找到当前节点cur的邻居后,关键就是用alias\_draw方法去按某个概率选出来下一个前进的节点。事实上,这个方法并不陌生,在LINE方法的图嵌入(《LINE: Large-scale Information Network Embedding》)当中也使用了同样的技巧。这个方法很有趣,所以可以稍微展开一下。

alias抽样

在讨论方法前,可从代码上感受一下它是干啥的,在Node2vec的源码中可以看到它的实现逻辑很精炼:

def alias_setup(probs):

K = len(probs)

q = np.zeros(K)

J = np.zeros(K, dtype=np.int)

smaller = []

larger = []

for kk, prob in enumerate(probs):

q[kk] = K*prob

if q[kk] < 1.0:

smaller.append(kk)

else:

larger.append(kk)

while len(smaller) > 0 and len(larger) > 0:

small = smaller.pop()

large = larger.pop()

J[small] = large

q[large] = q[large] + q[small] - 1.0

if q[large] < 1.0:

smaller.append(large)

else:

larger.append(large)

return J, q

def alias_draw(J, q):

'

Draw sample from a non-uniform discrete distribution using alias sampling.

'

K = len(J)

kk = int(np.floor(np.random.rand()*K))

if np.random.rand() < q[kk]:

return kk

else:

return J[kk]

我们手工来一批抽样,感受一下它的产出是怎样的:

可见它实现了一个按指定概率抽样事件的效果,据说这个执行效率是O(1)的,所以应用范围还是较广的。下面来快速了解下内在的执行过程,参考资料中3、4可以用来了解原理。假设我们有事件0,1,2,3,我们想分别以概率0.2, 0.2, 0.3, 0.3来抽样对应的事件,手工示意一下过程中的细节如下图所示:

如果直接在python中执行上述的alias_setup, 可见输出的J数组与示意图中一致,代表了每个位置上被哪个事件来填充过。q数组每个值代表被该位置上数值被其它事件填充前(小于1的时候)分别是多少。

最后在alias_draw中其实生成了两次随机数字,kk = int(np.floor(np.random.rand()*K)) 生成了一个随机索引值,这一个均匀分布的抽样,抽到每个事件的概率是相等的,都是1/K;然后np.random.rand()又生成了一个(0,1)区间内的随机数,如果这个值小于q数组中对应索引位置上的原始值,则返回该索引位置对应的事件,否则直接返回那个被拿来填充了该位置的事件,而每个位置上被谁填充过,正是已经保存到J数组中了,所以直接读J[kk]即可。

向量化表达

插播结束,继续回来看Node2Vec。根据上述的原则生成了节点序列后,下一步就是进行向量化表达了,这里与DeepWalk就更加统一了,甚至源代码中就是直接引用了gensim.models中的Word2Vec方法。

这个方法执行的过程中使用的一个优化小技巧值得提一提:负采样(Negative Sampling),因为这个方法最近在不同的地方有看到,感觉是个比较有用的思想,所以也可以稍微提一下。

负采样

要解决的问题:每一个训练样本都会去调整SkipGram模型中的每一个参数(这个数量是非常非常多的),严重影响性能。

方法:每一个训练样本仅更新一小部分权重,即一个positive word对应的神经元权重 ,外加K个negative word对应的神经元权重。每个negative word补选中的概率正比于其词频,一个经验值公式为:

参考资料

node2vec python_图上的机器学习系列-聊聊Node2vec相关推荐

  1. 图上的机器学习系列-聊聊struc2vec

    前言 本篇继续我们的Graph Embedding之旅.以往我们生成的节点向量保留的一个特征是节点之间的距离,基于随机游走的这一类方法生成的节点距离往往是图上空间位置上的相近.现实世界中,网络中的节点 ...

  2. 在图数据上做机器学习,应该从哪个点切入?

    作者 | David Mack 编译 | ronghuaiyang 来源 | AI公园(ID:AI_Paradise) [导读]很多公司和机构都在使用图数据,想在图上做机器学习但不知从哪里开始做,希望 ...

  3. 机器学习系列-数据分析-平行坐标图

    机器学习系列-数据分析-平行坐标图 文章目录 机器学习系列-数据分析-平行坐标图 1. 平行坐标图简介 2. 平行坐标图的绘制 2.1 iris鸢尾花数据集 2.2 iris平行坐标图图像绘制 结语 ...

  4. Paddle Graph Learning (PGL)图学习之图游走类deepwalk、node2vec模型[系列四]

    Paddle Graph Learning (PGL)图学习之图游走类模型[系列四] 更多详情参考:Paddle Graph Learning 图学习之图游走类模型[系列四] https://aist ...

  5. Spark入门实战系列--8.Spark MLlib(上)--机器学习及SparkMLlib简介

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 1.机器学习概念 1.1 机器学习的定义 在维基百科上对机器学习提出以下几种定义: l&qu ...

  6. 《机器学习系列-强填EM算法在理论与工程之间的鸿沟(上)》

    小夕曾经问一位做机器学习理论的学姐:"学姐学姐,EM算法是什么呢?" 学姐回答:"EM算法啊,就是解决包含隐变量的参数估计问题." 小夕: 然后小夕去问一位做工 ...

  7. 图谱实战 | 斯坦福黄柯鑫:图机器学习在生物图上的应用

    转载公众号 | DataFunSummit 分享嘉宾:黄柯鑫 斯坦福大学 博士生 编辑整理:元玉蒲 西北大学 出品平台:DataFunTalk 导读:大家好,我叫黄柯鑫.我现在是斯坦福大学的计算机科学 ...

  8. 机器学习系列思维导图

    本文整理了周志华老师的<机器学习>一书的相关章节的脑图. 1.机器学习-集成学习-思维导图 2.机器学习-聚类-思维导图 3.机器学习-降维与度量学习-思维导图 4.机器学习-特征选择与稀 ...

  9. CS224W 图机器学习(二)--图上的传统机器学习方法

    图上的传统机器学习方法 一. Tradtion Feature-based Methods Node 一. Tradtion Feature-based Methods Node 传统机器学习方法,我 ...

  10. 【机器学习系列】如何将多条ROC曲线画在一张图里,并解决文本遮挡问题

    有的时候我们需要将ROC曲线输出在同一张图中,这样可以更加直观地对比模型:并且我们常常会遇到在图形中有文字相互遮挡的问题,我们可以用adjustText中的adjust_text来实现文本不相互遮挡并 ...

最新文章

  1. 其他发行版本安装深度音乐播放器
  2. FastStone Capture
  3. as3.0用了视频组件,导致视频打开后就全屏,加一下代码就行
  4. 《团队-团队编程项目作业名称-团队信息》
  5. 基带工程师是做什么的_【思唯网络学院】网络工程师认证可以用来做什么?
  6. 问题 | 解决Intel MKL FATAL ERROR: Cannot load mkl_intel_thread.dll 问题(pycharm+Tensorflow)
  7. 基于libmad的MP3解码播放器
  8. 在命令行模式下管理SELinux
  9. A.PHP读取txt文本文件并分页显示的方法
  10. 安卓手机鸿蒙系统怎么下载,华为鸿蒙系统来了:安卓系统会成为下一个“塞班”吗?...
  11. 认真,respect!
  12. 一文读懂二级分销返利模式,商城系统源码机制分享
  13. DOTween 使用方法
  14. win10计算机不显示usb,win10插入U盘不显示怎么办_解决win10u盘插电脑上不显示的办法...
  15. Spinnaker第七节—Orca代码详解
  16. 【Windows11+Ubuntu20.04】双系统安装及美化、优化记录
  17. c#实现浏览器端大文件分块上传
  18. O - 期末考试之排名次
  19. synaptic No protocol specified issue
  20. R语言:ggplot2画带误差棒的组合折线图教程。

热门文章

  1. w7系统关闭打印服务器,w7打印后台处理程序服务总是自动停止如何解决【照片】...
  2. iOS 蓝牙开发中数据收发的坑
  3. Tomcat8安装配置
  4. 软件评测师考试(总是记不住的知识点+错题小汇总+记忆方法小tips)
  5. 简明 Python 教程
  6. 简明python教程gitbook_简明Python教程 Byte of Python
  7. 安卓虚拟机_[手机软件] 这款应用牛逼了,安卓手机上的虚拟机 - 虚拟大师
  8. 关于android中的armeabi、armeabi-v7a、arm64-v8a及x86等用splits用指定打包
  9. 3DMM(人脸3D形变统计模型)
  10. ALTRUN 工具使用笔记