前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >使用DeepWalk从图中提取特征

使用DeepWalk从图中提取特征

作者头像
OpenCV学堂
发布于 2019-12-09 08:57:52
发布于 2019-12-09 08:57:52
1.2K00
代码可运行
举报
运行总次数:0
代码可运行

以下文章来源于磐创AI,作者VK

来源:公众号 磐创AI 授权转

概述

  • 从表格或图像数据中提取特征的方法已经众所周知了,但是图(数据结构的图)数据呢?
  • 学习如何使用DeepWalk从图中提取特征
  • 我们还将用Python实现DeepWalk来查找相似的Wikipedia页面

介绍

我被谷歌搜索的工作方式迷住了。每次我搜索一个主题都会有很多小问题出现。以“人们也在搜索?”为例。当我搜索一个特定的人或一本书,从谷歌我总是得到与搜索内容类似的建议。

例如,当我搜索“Lewis Hamilton”时,我得到了其他著名f1车手的名单:

这些丰富而相关的内容是由高度复杂的图处理数据处理算法提供的。正是这种图和网的力量让我(以及许多其他数据科学家)着迷!自从我开始使用图以来,出现了许多新的技术。

在本文中,我将介绍任何机器学习项目中最重要的步骤之一—特征提取。不过,这里有一个小小的转折。我们将从图数据集中提取特征,并使用这些特征来查找相似的节点(实体)。

目录

  1. 数据的图示
  2. 不同类型的基于图的特征
  • 节点属性
  • 局部结构特征
  • 节点嵌入
  1. DeepWalk简介
  2. 在Python中实施DeepWalk以查找相似的Wikipedia页面

数据的图示

当你想到“网络”时,会想到什么?通常是诸如社交网络,互联网,已连接的IoT设备,铁路网络或电信网络之类的事物。在图论中,这些网络称为图

网络是互连节点的集合。节点表示实体,它们之间的连接是某种关系。

例如,我们可以用图的形式表示一组社交媒体帐户:

节点是用户的数字档案,连接表示他们之间的关系,例如谁跟随谁或谁与谁是朋友。

图的用例不仅限于社交媒体!我们还可以使用图和网络表示其他类型的数据(并且在本文中我们将介绍一个独特的行业用例)。

为什么我们将数据表示为图?

为什么不仅仅使用典型的数据可视化技术来可视化数据?为什么要更复杂并学习新概念?下面我们会给出答案。

图数据集和数据库可帮助我们应对在处理结构化数据时面临的若干挑战。这就是为什么当今的主要科技公司,例如Google,Uber,Amazon和Facebook使用某种形式的图的原因。

让我们以一个例子来理解为什么图是数据的重要表示形式。看下图:

这是一小部分Facebook用户(a, B, C, D, E, F, G)的数据集。图像的左半边包含这个数据的表格形式。每一行代表一个用户和他/她的一个朋友。

右半部分包含代表同一组用户的图。该图的边缘告诉我们,连接的节点是Facebook上的朋友。现在,让我们解决一个简单的查询:

“找到用户A的朋友和用户A朋友的朋友。”

查看表格数据和上面的图。哪种数据形式更适合回答此类查询?

使用图来解决该问题要容易得多,因为我们只需要遍历从节点A长度为2的路径(ABC和ADF),即可找到朋友和朋友的朋友。

因此,图可以轻松捕获节点之间的关系,这在常规数据结构中是一项艰巨的任务。现在,让我们看看使用图可以解决什么样的问题。

基于图的特征的不同类型

为了解决上述问题,我们无法将图直接提供给机器学习模型。我们必须首先从中创建特征,然后模型将使用这些特征。

此过程类似于我们在自然语言处理(NLP)或计算机视觉中所做的过程。我们首先从文本或图像中提取数字特征,然后将这些特征作为输入提供给机器学习模型:

从图中提取的特征可以大致分为三类:

  1. 节点属性:我们知道图中的节点代表实体,并且这些实体具有自己的特征属性。我们可以将这些属性用作每个节点的特征。例如,在航空公司航线网络中,节点将代表机场。这些节点将具有飞机容量,航站楼数量,着陆区等特征。 2.局部结构特点:节点的(相邻节点的数量),相邻节点的平均度,一个节点与其他节点形成的三角形数,等等。
  2. 节点嵌入:上面讨论的特征仅包含与节点有关的信息。它们不捕获有关节点上下文的信息。在上下文中,我指的是周围的节点。节点嵌入通过用固定长度向量表示每个节点,在一定程度上解决了这个问题。这些向量能够捕获有关周围节点的信息(上下文信息)

用于学习节点嵌入的两个重要的现代算法是DeepWalkNode2Vec。在本文中,我们将介绍并实现DeepWalk算法。

DeepWalk简介

要了解DeepWalk,重要的是要正确理解词嵌入及其在NLP中的使用方式。我建议在下面的文章中仔细阅读Word2Vec的解释: https://www.analyticsvidhya.com/blog/2019/07/how-to-build-recommendation-system-word2vec-python/?utm_source=blog&utm_medium=graph-feature-extraction-deepwalk

为了将事物置于上下文中,词嵌入是文本的向量表示形式,它们捕获上下文信息。让我们看看下面的句子:

  • 我乘巴士孟买
  • 我乘火车去孟买

粗体字(公共汽车和火车)的向量将非常相似,因为它们出现在相同的上下文中,即粗体文本之前和之后的词。该信息对于许多NLP任务非常有用,例如文本分类,命名实体识别,语言建模,机器翻译等等。

我们还可以在每个节点的图中捕获此类上下文信息。但是,为了学习NLP空间中的词嵌入,我们将句子提供给Skip-gram模型(浅层神经网络)。句子是按一定顺序排列的单词序列。

因此,要获得节点嵌入,我们首先需要安排图中的节点序列。我们如何从图中获得这些序列?有一项针对该任务的技术称为随机游走。

什么是随机游走?

随机游走是一种从图中提取序列的技术。我们可以使用这些序列来训练一个skip-gram模型来学习节点嵌入。

让我说明一下随机游走的工作原理。让我们考虑下面的无向图:

我们将在该图上应用随机游走并从中提取节点序列。我们将从节点1开始,并覆盖任意方向的两条边:

从节点1,我们可以转到任何连接的节点(节点3或节点4)。我们随机选择了节点4。现在再次从节点4开始,我们不得不随机选择前进的方向。我们将转到节点5。现在我们有3个节点的序列:[节点1 –节点4 –节点5]。

让我们生成另一个序列,但是这次是从另一个节点生成的:

让我们选择节点15作为原始节点。从节点5和6,我们将随机选择节点6。然后从节点11和2,我们选择节点2。新序列为[节点15 –节点6 –节点2]。

我们将对图中的每个节点重复此过程。这就是随机游走技术的工作原理。

在生成节点序列之后,我们必须将它们提供给一个skip-gram模型以获得节点嵌入。整个过程被称为Deepwalk。

在下一节中,我们将在Wikipedia文章网络上从头开始实施DeepWalk。

在Python中实施DeepWalk以查找相似的Wikipedia页面

这将是本文中最令人兴奋的部分,尤其是如果你喜欢代码。因此,请启动这些Jupyter notebook!

我们将使用Wikipedia文章图,并使用DeepWalk从中提取节点嵌入。然后,我们将使用这些嵌入来查找相似的Wikipedia页面。

我们不会触及这些文章中的任何文本。我们的目标是纯粹基于图的结构来计算页面之间的相似度。

但是,等等。我们如何以及在何处获得Wikipedia图数据集?Seealsology这个出色的工具将为我们提供帮助。这有助于我们从任何Wikipedia页面创建图。你甚至可以提供多个Wikipedia页面作为输入。这是该工具的屏幕截图:

如果一个页面链接到另一个页面,就会有一个图表示两个页面之间的联系。

看看在Seealsology中该图的形成方式。值得一看:

https://s3-ap-south-1.amazonaws.com/av-blog-media/wp-content/uploads/2019/11/graph_buildup.mp4?_=1

图中的节点非常接近,并不一定意味着它们在语义上相似。因此,需要在向量空间中表示这些节点,我们可以在其中识别相似的节点。

当然,我们可以使用其他方法来完成此任务。例如,我们可以解析这些节点(Wikipedia页面)中的所有文本,并在词嵌入的帮助下用向量表示每个页面。然后,我们可以计算这些向量之间的相似度以找到相似的页面。但是,这种基于NLP的方法存在一些缺点:

  • 如果有数百万个节点,那么我们需要大量的计算能力来解析文本并从所有这些节点或页面中学习词嵌入
  • 这种方法不会捕获这些页面之间连接的信息。例如,一对直接连接的页面可能比一对间接连接的页面具有更强的关系

这些缺点可以通过图和节点嵌入轻松解决。因此,一旦你的图准备就绪,就可以从Seealsology下载TSV文件。在此文件中,每一行都是一对节点。我们将使用此数据来重构图,并在其上应用DeepWalk算法以获得节点嵌入。

让我们开始吧!你可以为此使用Jupyter Notebook或Colab。

导入所需的Python库
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import networkx as nx
import pandas as pd
import numpy as np
import random
from tqdm import tqdm
from sklearn.decomposition import PCA

import matplotlib.pyplot as plt
%matplotlib inline
加载数据集

你可以从这里下载.tsv文件: https://s3-ap-south-1.amazonaws.com/av-blog-media/wp-content/uploads/2019/11/space_data.zip

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df = pd.read_csv("space_data.tsv", sep = "\t")
df.head()

Output:

目标都包含Wikipedia实体。对于所有行,目标实体在源实体的Wikipedia页面有其超链接。

构造图
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
G = nx.from_pandas_edgelist(df, "source", "target", edge_attr=True, create_using=nx.Graph())

让我们检查图中的节点数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
len(G)

Output: 2088

我们将处理2,088个Wikipedia页面。

随机游走

在这里,我定义了一个函数,将节点和被遍历的路径的长度作为输入。它将从指定的输入节点以随机的方式穿过连接节点。最后,它将返回遍历节点的顺序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def get_randomwalk(node, path_length):

    random_walk = [node]

    for i in range(path_length-1):
        temp = list(G.neighbors(node))
        temp = list(set(temp) - set(random_walk))    
        if len(temp) == 0:
            break

        random_node = random.choice(temp)
        random_walk.append(random_node)
        node = random_node

    return random_walk

让我们来试试节点“space exploration”这个函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
get_randomwalk('space exploration', 10)

输出

在这里,我已指定要遍历的长度为10。你可以更改此数字并进行操作。接下来,我们将捕获数据集中所有节点的随机游走序列:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 从图获取所有节点的列表
all_nodes = list(G.nodes())

random_walks = []
for n in tqdm(all_nodes):
    for i in range(5):
        random_walks.append(get_randomwalk(n,10))

# 序列个数
len(random_walks)

输出: 10,440

因此,将遍历长度设置为10,我们得到了10,440个节点的随机游动序列。我们可以将这些序列用作skip-gram模型的输入,并提取该模型学习到的权重。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# importing required libraries

import pandas as pd
import networkx as nx
import numpy as np
import random
from tqdm import tqdm
from sklearn.decomposition import PCA
import pprint
from gensim.models import Word2Vec
import warnings
warnings.filterwarnings('ignore')

# read the dataset
df = pd.read_csv("space_data.tsv", sep = "\t")
print(df.head())

G = nx.from_pandas_edgelist(df, "source", "target", edge_attr=True, create_using=nx.Graph())

G = nx.from_pandas_edgelist(df, "source", "target", edge_attr=True, create_using=nx.Graph())

print('The number of nodes in pur graph: ',len(G))

def get_randomwalk(node, path_length):
    
    random_walk = [node]
    
    for i in range(path_length-1):
        temp = list(G.neighbors(node))
        temp = list(set(temp) - set(random_walk))    
        if len(temp) == 0:
            break

        random_node = random.choice(temp)
        random_walk.append(random_node)
        node = random_node
        
    return random_walk

print('\n\nRandom sequence of nodes generated from Random Walk\n\n')
while True:
  first_node = input("Enter name of first node (for example 'space exploration') : ")
  if len(first_node) > 0:
    break
pprint.pprint(get_randomwalk(first_node, 10))



# 从图中获取所有节点的列表
all_nodes = list(G.nodes())

random_walks = []
for n in tqdm(all_nodes):
    for i in range(5):
        random_walks.append(get_randomwalk(n,10))
        
# 序列长度
len(random_walks)


# 训练skip-gram (word2vec)模型
model = Word2Vec(window = 4, sg = 1, hs = 0,
                 negative = 10, # 负采样
                 alpha=0.03, min_alpha=0.0007,
                 seed = 14)

model.build_vocab(random_walks, progress_per=2)

model.train(random_walks, total_examples = model.corpus_count, epochs=20, report_delay=1)
print('\n\n Get similar nodes\n\n')
while True:
  any_node = input("Enter name of any node (for example 'space toursim') : ")
  if len(any_node) > 0:
    break
pprint.pprint(model.similar_by_word(any_node))

结尾

我真的很喜欢在本文中探索DeepWalk中的图形数据,我迫不及待地想尝试其他图形算法。在接下来的几周里,继续关注这个系列吧!

我鼓励你实施此代码,试用它,并建立自己的图模型。这是学习任何概念的最佳方法。完整的代码在这里:https://github.com/prateekjoshi565/DeepWalk

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
节点聚类分析:DeepWalk + K-means
同node2vec一致,我们也需要先找到所有节点的 条随机游走路径,每条路径长度为 。
Cyril-KI
2022/09/19
2670
节点聚类分析:DeepWalk + K-means
推荐系统中的常用算法——DeepWalk算法
DeepWalk算法是在KDD2014中提出的算法,最初应用在图表示(Graph Embedding)方向,由于在推荐系统中,用户的行为数据固然的可以表示成图的形式,因此DeepWalk算法也常被用于推荐系统中的item embedding的计算。Graph Embedding使用低维稠密向量的形式表示途中的节点,使得在原始图中相似(不同的方法对相似的定义不同)的节点其在低维表达空间也接近。
felixzhao
2020/09/17
4.1K0
推荐系统中的常用算法——DeepWalk算法
【Embedding】DeepWalk:图嵌入的一枚银弹
今天学习的是纽约州立大学石溪分校在 NetWork Embedding 的工作《DeepWalk Online Learning of Social Representations》,这篇文章于 2014 年发表于 ACM 会议,目前已经有 2700 多引用,是第一个将 Word2Vec 应用到 NetWork Embedding 并取得了巨大成功的方法。
阿泽 Crz
2020/07/21
9080
【Embedding】DeepWalk:图嵌入的一枚银弹
[AI安全论文] 25.向量表征之DeepWalk:从Word2vec到DeepWalk,再到Asm2vec和Log2vec
这是向量表征系列文章,从Word2vec和Doc2vec到Deepwalk和Graph2vec,再到Asm2vec和Log2vec。
Eastmount
2023/02/28
8260
[AI安全论文] 25.向量表征之DeepWalk:从Word2vec到DeepWalk,再到Asm2vec和Log2vec
DeepWalk:图网络与NLP的巧妙融合
最近这段时间一直在做图网络相关,也差不多收尾了,有空整体复盘了下,大致以下几个主题,不过没整理完全哈哈(下次一定
NewBeeNLP
2020/10/21
9410
用万字长文聊一聊 Embedding 技术
作者:qfan,腾讯 WXG 应用研究员 随着深度学习在工业届不断火热,Embedding 技术便作为“基本操作”广泛应用于推荐、广告、搜索等互联网核心领域中。Embedding 作为深度学习的热门研究方向,经历了从序列样本、图样本、再到异构的多特征样本的发展过程。本文主要系统总结了现在主流的 Embedding 技术,简单介绍它们的基本原理,希望对大家快速整理相关知识有所帮助。 一、引言 在提到 Embedding 时,首先想到的是“向量化”,主要作用是将高维稀疏向量转化为稠密向量,从而方便下游模
腾讯技术工程官方号
2020/11/19
14.9K2
听说GNN大有可为,从这篇开始学以致用
说到GNN,各位炼丹师会想到哪些算法呢?不管想到哪些算法,我们真正用到过哪些呢?确实我们可能都看过GNN相关论文,但是还是缺乏实战经验的.特别是对于推荐系统而言,我们又该如何应用这些模型呢?下面我们就
炼丹笔记
2021/07/16
3740
听说GNN大有可为,从这篇开始学以致用
CS224W 7.1 Graph Representation Learning
自Deepwalk开始,图表示学习已经成为图挖掘领域最热门的方向之一. 现在火热的图神经网络可以说是图表示学习2.0
Houye
2020/04/07
5920
CS224W 7.1 Graph Representation Learning
简单实践GraphEmbedding图嵌入的几种方法
参考: 详解Graph Embedding经典方法:算法原理、代码实现与应用样例 Graph Embedding 图表示学习的原理及应用
悟乙己
2021/12/07
9140
简单实践GraphEmbedding图嵌入的几种方法
DeepWalk:图网络与NLP的巧妙融合
最近这段时间一直在做图网络相关,也差不多收尾了,有空整体复盘了下,大致以下几个主题,不过没整理完全哈哈
NewBeeNLP
2020/09/23
7320
DeepWalk:图网络与NLP的巧妙融合
图学习【参考资料2】-知识补充与node2vec代码注解
本项目参考: https://aistudio.baidu.com/aistudio/projectdetail/5012408?contributionType=1 *一、正题篇:DeepWalk、
汀丶人工智能
2022/11/21
3010
硬核!一文梳理经典图网络模型
图神经网络已经在NLP、CV、搜索推荐广告等领域广泛应用,今天我们就来整体梳理一些经典常用的图网络模型:DeepWalk、GCN、Graphsage、GAT!
NewBeeNLP
2022/02/25
1K0
硬核!一文梳理经典图网络模型
node2vec的代码实现及详细解析
在KDD2016 | node2vec:可拓展的网络特征学习中我们详细讨论了node2vec的机制,但并没有给出代码实现。本篇文章将从原文出发,逐步详细地讨论如何一步步实现node2vec。
Cyril-KI
2022/09/19
7180
node2vec的代码实现及详细解析
GraphEmbedding实战系列:Node2vec原理与代码实战
论文:《node2vec: Scalable Feature Learning for Networks》
Coggle数据科学
2022/08/31
2.3K0
GraphEmbedding实战系列:Node2vec原理与代码实战
KDD 2017 | metapath2vec:异质图的可扩展表示学习
题目:metapath2vec: Scalable Representation Learning for Heterogeneous Networks
Cyril-KI
2022/11/10
6380
KDD 2017 | metapath2vec:异质图的可扩展表示学习
使用Node2Vec进行知识图谱嵌入教程
在知识图谱嵌入中,实体和关系被表示为低维向量(或称为嵌入),这些嵌入保留了原始图结构中的语义信息。本文将详细介绍如何使用Node2Vec方法对知识图谱进行嵌入。
数字扫地僧
2024/09/16
3860
使用Node2Vec进行知识图谱嵌入教程
图表示学习起源: 从Word2vec到DeepWalk
本文发表在知乎专栏<435算法研究所>,介绍的是2014年的一篇文章《DeepWalk: Online Learning of Social Representations》,附个链接https://arxiv.org/pdf/1403.6652.pdf,这是NLP中的表示学习算法第一次被引入到图结构当中。如标题,本文先来介绍Word2vec的基本知识,再来介绍下如何利用Word2vec来表示图结构。
Houye
2020/04/07
9250
【论文笔记】node2vec:可扩展的网络特征学习
我们将网络中的特征学习表示为最大似然优化问题。 设G = (V, E)为给定网络。 我们的分析是通用的,适用于任何有向(无向)的带权(无权)网络。 设f: V -> R^d是从节点到特征表示的映射函数,我们的目标是为下游预测任务学习它。 这里d是指定我们的特征表示的维数的参数。 等价地,f是大小|V|×d的参数矩阵 。 对于每个源节点u ∈ V,我们将N[S](u) ⊂ V定义为,通过邻域采样策略S生成的节点u的网络邻域。
ApacheCN_飞龙
2022/05/07
4940
【论文笔记】node2vec:可扩展的网络特征学习
Paddle Graph Learning (PGL)图学习之图游走类deepwalk、node2vec模型[系列四]
更多详情参考:Paddle Graph Learning 图学习之图游走类模型系列四
汀丶人工智能
2022/11/22
3770
KDD 2014 | DeepWalk:社会表征的在线学习
https://dl.acm.org/doi/abs/10.1145/2623330.2623732
Cyril-KI
2022/09/19
4160
KDD 2014 | DeepWalk:社会表征的在线学习
推荐阅读
相关推荐
节点聚类分析:DeepWalk + K-means
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验