作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
费德里科·阿尔巴尼斯的头像

费德里科•阿尔巴内塞

艾博年是一名开发人员和数据科学家,曾在脸谱网工作, 他在哪里做了机器学习模型预测. 他是Python专家和大学讲师. 他的博士研究方向是图形机器学习.

以前在

脸谱网
Share

我们被数据淹没了. 不断扩展的数据库和电子表格充斥着隐藏的商业见解. 当数据如此之多时,我们如何分析数据并得出结论? 图(网络,而不是条形图)提供了一种优雅的方法.

我们通常使用表来表示信息. 但是图使用一种特殊的数据结构:不是表行,而是一个 node 表示一个元素. An edge 连接两个节点以指示它们的关系.

这种图形数据结构使我们能够从独特的角度观察数据, 这就是为什么图形数据科学在从分子生物学到社会科学的各个领域都有应用:

在左边, 由许多不同大小和颜色的点组成的蛋白质相互作用图, 它们之间有不同颜色的线. 大多数点(节点)形成一个大的中心集群, 但有些点只能成对连接, 三胞胎, 或者边缘的四胞胎, 与主集群断开连接. 在右边, a Twitter interaction graph where nodes are of subpixel size and fall broadly into three sets: A dense central cluster with a few fuzzy blobs of various colors and sizes connected by fuzzy streams of various colors; a light cloud consisting of small smudges and sprinklings of mostly gray; and a buffer of white before an outer gray fuzzy ring surrounding the first two sets.
左图来源:TITZ, Björn等. “梅毒螺旋体的二元蛋白相互作用组…”,PLoS One, 3, no. 5 (2008).

右图来源:ALBANESE, Federico等人. “在Twitter上使用文本挖掘和图形机器学习预测变化的个人。.(2020年8月24日):arXiv: 2008.10749 [cs.SI]

那么开发人员如何利用图数据科学呢? 让我们转到 最常用的数据科学编程语言: Python.

Python中的“图论”图入门

Python开发人员 有几个图形数据库可供他们使用,如NetworkX、igraph、SNAP和graph-tool. 抛开利弊不谈, 它们具有非常相似的Python图形可视化和结构操作接口.

我们将使用流行的 NetworkX 图书馆. 它的安装和使用都很简单,并且支持我们将要使用的社区检测算法.

创建一个新的NetworkX图形很简单:

导入networkx为nx
G = nx.图()

But G 它还不是一个图,没有节点和边.

如何向图中添加节点

的返回值,我们可以将一个节点添加到网络中 图() with .add_node () (or .add_nodes_from () 对于列表中的多个节点). 我们还可以通过传递字典作为参数向节点添加任意特征或属性, 就像我们展示的 node 4 and node 5:

G.add_node(节点1”)
G.Add_nodes_from (["node 2", "node 3"])
G.add_nodes_from(((“节点4”,{123}“abc”:),(“节点5”,{“abc”:0})))
打印(G.nodes)
打印(G.节点["node 4"]["abc"]) #像字典一样访问

这将输出:

(节点1,节点2,节点3,4节点,节点5 ')
123

但是如果节点之间没有边,它们就会被隔离,数据集就不会比一个简单的表好.

如何在图中添加边

与节点的技术类似,我们可以使用 .add_edge () 使用两个节点的名称作为参数(或 .add_edges_from () 对于列表中的多条边),并可选地包含属性字典:

G.Add_edge("节点1","节点2")
G.Add_edge("节点1","节点6")
G.Add_edges_from ([("node 1", "node 3"), 
                  ("节点3","节点4")])
G.add_edges_from([(节点1”、“5”节点,{“重量”:3}), 
                  ("节点2","节点4",{"weight": 5})])

NetworkX库支持这样的图,其中每个边可以有一个权重. 例如, 在社交网络图中,节点是用户,边是交互, 权重可以表示给定的一对用户之间发生了多少交互——这是一个高度相关的度量.

使用时,NetworkX列出所有边 G.edges,但不包括它们的属性. 如果我们想要边属性,我们可以使用 G (node_name) 把所有连接到节点上的东西 G (node_name] [connected_node_name] 获取某条边的属性:

打印(G.nodes)
打印(G.edges)
打印(G(节点1 "))
打印(G["node 1"]["node 5"])

这将输出:

(节点1,节点2,节点3,4节点,节点5 ','节点6 ']
[(节点1的, “节点2”), (节点1, “节点6”), (节点1, “节点3”), (节点1, “节点5”), (“节点2”, “节点4”), (“节点3”, 节点4)]
{“节点2”:{},“节点6”:{},节点3:{},“节点5”:{“重量”:3}}
{“重量”:3}

但是这样读第一张图是不切实际的. 值得庆幸的是,有一个更好的代表.

如何从图(和加权图)生成图像

可视化图形是必不可少的:它让我们快速清晰地看到节点和网络结构之间的关系.

一个简短的电话 nx.画(G) 只需要:

六个红点之间用黑线连接. 四个形成一个四边形,其中一个角与其余两个相连.

让更重的边相应地变粗 nx.draw() call:

如果G[u][v] == {} else G[u][v]['weight'] for u,v in G.边())
nx.画(G,宽度=重量)

我们为无重边缘提供了默认厚度,如下图所示:

类似于之前的图像,但稍微移动了点的位置和两条线突出(一条是三倍厚,另一条是五倍厚).

我们的方法和图算法将变得更加复杂, 对于我们的下一个NetworkX/Python示例, 我们将使用一个更知名的数据集.

使用电影数据的图形数据科学 《星球大战4

为了更容易解释和理解我们的结果,我们将使用 这个数据集. 节点代表重要的字符, 边缘(这里没有加权)表示在场景中共同出现.

注:数据集来自Gabasova, E. (2016). 星球大战 社交网络. DOI: http://doi.org/10.5281/zenodo.1411479.

首先,我们将用 nx.draw(G_starWars, with_labels = True):

一个更繁忙的图表,有19个蓝点(每个都标有大写字母的字符名称),其中许多点之间有均匀的粗线.

通常出现在一起的角色,比如R2-D2和C-3PO,看起来紧密相连. 相比之下,我们可以看到,达斯·维德没有与欧文共享场景.

Python NetworkX可视化布局

为什么每个节点都位于前一个图中的位置?

这是默认的结果 spring_layout 算法. 它模拟了弹簧的力量,吸引连接的节点,排斥不连接的节点. 这有助于突出连接良好的节点,这些节点最终位于中心.

NetworkX还有其他使用不同标准来定位节点的布局,比如 circular_layout:

Pos = nx.circular_layout (G_starWars)
nx.draw(G_starWars, pos=pos, with_labels = True)

结果:

在节点和边的存在上是完全相同的图但是蓝点形成了一个圆圈. (注:并非椭圆中每一对相邻的点都共享一条边.)

这种布局是中性的,因为节点的位置不依赖于它的重要性——所有节点都是平等地表示的. (圆形布局也可以帮助可视化分离 连接组件-在任意两个节点之间有路径的子图-但这里, 整个图是一个大的连通分量.)

我们看到的两种布局都有一定程度的视觉混乱,因为边缘可以自由地交叉其他边缘. 但是Kamada-Kawai,另一个力导向算法,比如 spring_layout,节点的位置以使系统的能量最小.

这减少了交叉边线,但代价是:它比其他布局慢,因此不推荐用于有许多节点的图.

这个有一个专门的绘图功能:

nx.draw_kamada_kawai(G_starWars, with_labels = True)

这就产生了这个形状:

同样的图表. 它看起来更像第一个,但蓝点分布得更均匀,重叠的边缘更少.

无需任何特殊干预, 算法把主角(比如卢克, Leia, C-3PO)在中心, 以及边境上不太显眼的(如卡米和多多纳将军).

用特定布局可视化图形可以给我们带来一些有趣的定性结果. Still, 定量结果是任何数据科学分析的重要组成部分, 所以我们需要定义一些指标.

节点分析:学位和PageRank

现在我们可以清楚地可视化我们的网络,我们可能会对节点的特征感兴趣. 有多个度量来描述节点和, 在我们的例子中, 关于角色.

节点的一个基本度量是its 学位: 它有多少条边. a的度数 星球大战 角色节点衡量他们与多少其他角色共享一个场景.

The 度() 函数可以计算一个字符或整个网络的程度:

print (G_starWars.学位(“路加福音”))
print (G_starWars.学位)

两个命令的输出:

15
[('R2-D2', 9), (“秋巴卡”, 6), (' c - 3 po ', 10), (“路加福音”, 15), (“黑武士”, 4), (' CAMIE ', 2), ('比格斯', 8), (“莱娅”, 12), (“贝鲁”, 5), (“欧文。”, 4), (“欧比旺”, 7), (' MOTTI ', 3), (' TARKIN ', 3), (“汉”, 6), (' DODONNA ', 3), (“金领袖”, 5), (“楔形”, 5), (“红色领袖”, 7), (“红十”, 2)]

根据程度从高到低对节点进行排序可以用一行代码完成:

打印(排序(G_starWars.度,键=lambda x: x[1],反向=True))

输出:

((“路加福音”, 15), (“莱娅”, 12), (' c - 3 po ', 10), ('R2-D2', 9), ('比格斯', 8), (“欧比旺”, 7), (“红色领袖”, 7), (“秋巴卡”, 6), (“汉”, 6), (“贝鲁”, 5), (“金领袖”, 5), (“楔形”, 5), (“黑武士”, 4), (“欧文。”, 4), (' MOTTI ', 3), (' TARKIN ', 3), (' DODONNA ', 3), (' CAMIE ', 2), (“红十”, 2)]

作为一个总数,度并没有考虑到个别边缘的细节. 给定的边是连接到孤立的节点还是连接到与整个网络相连的节点? 谷歌的PageRank算法将这些信息聚合起来,以衡量一个节点在网络中的“重要性”.

PageRank指标可以解释为一个代理从一个节点随机移动到另一个节点. 连接更好的节点有更多的路径通过它们, 所以代理会更频繁地拜访他们.

这样的节点将具有更高的PageRank,我们可以使用NetworkX库计算:

pagerank = nx.pagerank(G_starWars) #字典
print (pagerank(“路加福音”))
print(sorted(pagerank, key=lambda x: x[1], reverse=True))

这打印了卢克的等级和我们的角色按等级排序:

0.12100659993223405
['欧文', 'LUKE', “MOTTI”, “DODONNA”, “金领袖”, 比格斯的, “秋巴卡”, 'LEIA', 'BERU', “楔形”, “红色领袖”, “红十”, “欧比旺”, “黑武士”, “CAMIE”, “TARKIN”, 'HAN', 'R2-D2', ' c - 3 po ']

欧文是拥有最高PageRank的角色,超过了拥有最高学位的卢克. 分析:虽然欧文不是和其他角色分享最多场景的角色, 他是一个与许多重要角色共享场景的角色,比如卢克本人, R2-D2, 和c - 3 po.

相比之下, C-3PO, 第三高等级的字符, 哪个网页排名最低. 尽管C-3PO有很多联系,但其中很多都是不重要的人物.

结论:使用多个指标可以更深入地了解图节点的不同特征.

团体检测算法

当在网络上执行Python图分析时,分离可能很重要 社区:彼此高度连接,但与社区外节点连接最少的节点组.

这里有很多算法. 大多数都是在无人监督的情况下发现的 机器学习算法 因为它们给节点分配了一个标签,而不需要它们之前被标记过.

其中最有名的是 品牌传播. 在它中,每个节点以一个唯一的标签开始,在一个社区中. 节点的标签根据相邻节点的大多数标签进行迭代更新.

标签在网络中扩散,直到所有节点与大多数邻居共享一个标签. 紧密相连的节点组最终具有相同的标签.

使用NetworkX库,运行这个算法只需要三行Python代码:

从networkx.算法.社区.导入label_propagation_社区

社区 = label_propagation_社区(G_starWars)
印刷([社区为社区中的社区])

输出:

[{'R2-D2', “CAMIE”, “红十”, “红色领袖”, “欧比旺”, “DODONNA”, 'LEIA', “楔形”, 'HAN', 'OWEN', “秋巴卡”, “金领袖”, 'LUKE', 比格斯的, “c - 3 po”, 贝鲁的}, {“黑武士”, “TARKIN”, “MOTTI”}]

在这个集合列表中,每个集合代表一个社区. 熟悉这部电影的读者会注意到,该算法成功地将“好人”与“坏人”完美区分开来,“在不使用任何真正的(社区)标签或元数据的情况下,有意义地区分字符.

在Python中使用图数据科学的智能洞察

我们已经看到,开始使用图形数据科学工具比听起来要简单得多. 一旦我们使用Python中的NetworkX库将数据表示为图形, 几行简短的代码就能说明问题. 我们可以可视化我们的数据集,测量和比较节点特征,以及 集群节点 明智地通过社区检测算法.

拥有使用Python从网络中提取结论和见解的技能,使开发人员能够集成常用的工具和方法 数据科学服务 管道. 从搜索引擎到航班调度再到电气工程, 这些方法很容易适用于各种上下文.

团体检测算法
赵阳,ren Algesheimer和Claudio Tessone. “人工网络社区检测算法的比较分析.《欧博体育app下载》第6期. 30750 (2016).

图深度学习
托马斯Kipf. “图卷积网络.2016年9月30日.

图数据科学的应用
Albanese, Federico, Leandro Lombardi, Esteban Feuerstein和Pablo Balenzuela. “在Twitter上使用文本挖掘和图形机器学习预测变化的个人。.(2020年8月24日) arXiv: 2008.10749 [cs.SI].

科恩Elior. PyData特拉维夫聚会:Node2vec.“YouTube. 2018年11月22日. 视频中,21:09. http://www.youtube.com/watch?v=828rZgV9t1g.

了解基本知识

  • Python可以用于数据可视化吗?

    是的,可以. Python有多个用于数据可视化的库,比如NetworkX库.

  • 如何在Python中绘制数据图?

    Python图形数据可视化库,如NetworkX, igraph, SNAP, 图形工具都有这个功能. NetworkX库对于可视化网络的节点和边缘非常有用.

  • Graph是Python中的数据类型吗?

    Python NetworkX库提供了不同的数据图类型. 可能的类型, 取决于图的特征, 是图, 有向图, 油印, 和Multi有向图.

  • 图论在数据科学中使用吗?

    Yes. NetworkX库使Python数据科学家能够轻松地利用不同的基于图论的算法,如PageRank和标签传播.

  • NetworkX在Python中的用途是什么?

    NetworkX是Python中用于图形表示的库. 开发人员可以使用它来创建, 操作, 可视化图表, 以及非可视化图形数据科学分析.

  • 什么时候应该使用NetworkX?

    The easy-to-use NetworkX 图书馆 should be used for graph analysis; for example, 当需要社区检测算法或其他特定功能时. 但它的功能在其他方面与其他图形库(如igraph)相当, SNAP, 和制图工具.

  • NetworkX快吗??

    对于许多应用程序, NetworkX已经足够快了, 但其他Python库对于大规模图形数据集可能更快, 取决于算法. 从NetworkX开始的优势在于它的易用性和广泛的开发人员社区.

  • 什么是社区检测算法?

    社区检测算法根据网络节点的连通性对其进行聚类. 标签传播是一种广泛使用的方法,在Python NetworkX库中有实现.

就这一主题咨询作者或专家.
预约电话
费德里科·阿尔巴尼斯的头像
费德里科•阿尔巴内塞

位于 布宜诺斯艾利斯,阿根廷

成员自 2019年1月9日

作者简介

艾博年是一名开发人员和数据科学家,曾在脸谱网工作, 他在哪里做了机器学习模型预测. 他是Python专家和大学讲师. 他的博士研究方向是图形机器学习.

Toptal作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.

以前在

脸谱网

世界级的文章,每周发一次.

订阅意味着同意我们的 隐私政策

世界级的文章,每周发一次.

订阅意味着同意我们的 隐私政策

Toptal开发者

加入总冠军® 社区.