目录

  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库

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

df = pd.read_csv("space_data.tsv", sep = "\t")
df.head()

Output:

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

构造图

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

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

len(G)

Output: 2088

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

随机游走

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

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”这个函数:

get_randomwalk('space exploration', 10)

输出

在这里,我已指定要遍历的长度为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)

输出: 10,440

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

from gensim.models import Word2Vec

import warnings
warnings.filterwarnings('ignore')

DeepWalk

接下来,我们将使用随机游走训练skip-gram模型:

# 训练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)

现在,图中的每个节点都由固定长度(100)的向量表示。让我们找出与“space tourism”最相似的页面:

model.similar_by_word('space tourism')

输出:

很有趣!所有这些页面都是与民用太空旅行相关的主题。可以为其他实体提取类似的节点。

现在,我想看看我们的节点嵌入如何捕获不同节点之间的相似性。我已经从图中挑选了一些节点,并将它们绘制在二维空间中:

terms = ['lunar escape systems','soviet moonshot', 'soyuz 7k-l1',
'moon landing','space food', 'food systems on space exploration missions',
'meal, ready-to-eat','space law', 'metalaw', 'moon treaty',
'legal aspects of computing','astronaut training', 'reduced-gravity aircraft',
'space adaptation syndrome', 'micro-g environment']

下面我定义了一个函数,该函数将在二维空间中绘制所选节点的向量:

def plot_nodes(word_list):
X = model[word_list] # 减少维度为2
pca = PCA(n_components=2)
result = pca.fit_transform(X) plt.figure(figsize=(12,9))
# 创建一个散点图的投影
plt.scatter(result[:, 0], result[:, 1])
for i, word in enumerate(word_list):
plt.annotate(word, xy=(result[i, 0], result[i, 1])) plt.show()

让我们绘制选定的节点:

plot_nodes(terms)

输出

看起来不错!如你所见,相似的Wikipedia实体被分组在一起。例如,“soviet moonshot”,“soyuz 7k-l1”,“moon landing”和“lunar escape systems”都尝试登陆月球。

这就是为什么DeepWalk嵌入如此有用的原因。我们可以使用这些嵌入来解决与图相关的多个问题,例如链接预测,节点分类,问题解答系统等等。

请执行下面的代码。它会产生随机游走序列和获取类似的节点使用DeepWalk一个输入节点。

# 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。

欢迎关注磐创博客资源汇总站:

http://docs.panchuang.net/

欢迎关注PyTorch官方中文教程站:

http://pytorch.panchuang.net/

使用DeepWalk从图中提取特征的更多相关文章

  1. SLAM算法中提取特征总结

    我们要知道三维空间中的点在图像中的位置,就需要提取特征与特征匹配了. 1.检测特征点 2.计算描述子 3.特征匹配 1.检测特征点 我们用到的检测特征点的方法是FAST算法,最大的特点就是快! 算法原 ...

  2. SEPC:使用3D卷积从FPN中提取尺度不变特征,涨点神器 | CVPR 2020

    论文提出PConv为对特征金字塔进行3D卷积,配合特定的iBN进行正则化,能够有效地融合尺度间的内在关系,另外,论文提出SEPC,使用可变形卷积来适应实际特征间对应的不规律性,保持尺度均衡.PConv ...

  3. pytorch中网络特征图(feture map)、卷积核权重、卷积核最匹配样本、类别激活图(Class Activation Map/CAM)、网络结构的可视化方法

    目录 0,可视化的重要性: 1,特征图(feture map) 2,卷积核权重 3,卷积核最匹配样本 4,类别激活图(Class Activation Map/CAM) 5,网络结构的可视化 0,可视 ...

  4. 如何从PDF文件中提取矢量图

    很多时候我们需要PDF文档中的插图,直接用pdf中的复制或者截屏软件只能提取位图格式的图片,放大缩小难免失真. 本文教大家一种一种从pdf中提取矢量图的方法. 工具软件: 1 adobe acroba ...

  5. 卷积神经网络提取特征并用于SVM

    模式识别课程的一次作业.其目标是对UCI的手写数字数据集进行识别,样本数量大约是1600个.图片大小为16x16.要求必须使用SVM作为二分类的分类器. 本文重点是如何使用卷积神经网络(CNN)来提取 ...

  6. 【转】风控中的特征评价指标(三)——KS值

    转自:https://zhuanlan.zhihu.com/p/79934510 风控业务背景 在风控中,我们常用KS指标来评估模型的区分度(discrimination).这也是风控模型同学最为追求 ...

  7. UML图中经常用到几种的关系图例

    学习这个东西挺奇怪的,时间一长就容易忘记,或者记不清楚.今天看到一些UML图的关系,发现有些出入了,索性就写下来,以后再忘记的时候过来看看. 在UML的类图中,常见的有以下几种关系: 继承(Gener ...

  8. 从Wireshark监听的数据中提取需要的数据

    最近,需要将wireshark监听的数据进行提取,分两步:首先,应该得出wireshark的数据包吧,在图形化界面中可以非常直观的将监听数据进行存储,但是这样需要手动操作非常麻烦,而且容易出错(随着处 ...

  9. 论文系统Step1:从日志记录中提取特定信息

    论文系统Step1:从日志记录中提取特定信息 前言 论文数据需要,需要实现从服务器日志中提取出用户的特定交互行为信息.日志内容如下: 自己需要获取"请求数据包一行的信息"及&quo ...

随机推荐

  1. 你的胃能Hold住未来的食物吗?

    ​ 如果你是一名美食客,那么一定会发现现在越来越多的食物已经发生了翻天覆地的变化,很多食物正在以我们未知的形式出现在生活中,其中最大的莫过于分子美食.你想过吗?当食物发生改变的时候,你的胃是否能够Ho ...

  2. AndroidStudio实现AIDL

    AIDL的使用步骤 aidl远程调用传递的参数和返回值支持Java的基本类型(int long booen char byte等)和String,List,Map等.当然也支持一个自定义对象的传递. ...

  3. 动态构造任意复杂的 Linq Where 表达式

    前言 Linq 是 C# 中一个非常好用的集合处理库,用好了能帮我们简化大量又臭又长的嵌套循环,使处理逻辑清晰可见.EF 查询主要也是依赖 Linq.但是 Linq 相对 sql 也存在一些缺点,最主 ...

  4. PyCharm使用技巧及常用快捷键

    Ctrl + Shift + F--------------------------------------------->>>>>>>高级查找 Ctrl + ...

  5. html/css系列 BFC

    本文详情:https://www.cnblogs.com/chen-... 第一种 BFC中的盒子对齐 <div class="container"> <div ...

  6. Spring MVC系列-(1) Spring概述

    1. Spring概述 本章主要介绍Spring中的体系结构和常见概念,比如bean.控制反转(Inverse of Control,IoC)等. 1.1 体系结构 Spring 框架提供约 20 个 ...

  7. django实战商城项目注册业务实现

    设计到的前端知识 项目的前端页面使用vue来实现局部刷新,通过数据的双向绑定实现与用户的交互,下面来看一下需求,在用户输入内容后,前端需要做一些简单的规则校验,我们希望在在用户输入后能够实时检测,如果 ...

  8. java算法--循环队列

    循环队列 我们再用队列得时候不知道发没发现这样一个问题. 这是一个只有三个位置得队列,在进行三次加入(addqueue)操作和三次取出(get)操作之后再进行加入操作时候的样子.明显可以看到,队列已经 ...

  9. C#.Net全栈工程师之路-学习路径

    C#.Net全栈工程师之路-学习路径 按架构分: C/S架构: B/S架构: Mobile移动开发: 按技术点分: C#编程基础以及OOP面向对象编程: 数据库基础以及高级应用(MYSQL+MSSQL ...

  10. NoVNC安装部署

    noVNC 是一个 HTML5 VNC 客户端,采用 HTML 5 WebSockets, Canvas 和 JavaScript 实现,noVNC 被普遍用在各大云计算.虚拟机控制面板中,比如 Op ...