NetwokX 笔记:(一)什么是网络?

NetwokX 笔记:(一)什么是网络?


本文是Edward L. Platt所著《Network Science with Python and NetworkX Quick Start Guide_ Explore and visualize network data effectively》第一章的笔记。本笔记不能代替原著,未获得作者授权不参与任何商业活动,请大家尊重版权自觉购买原著,不要侵权。


1736年,一位瑞士数学家曾在哥尼斯堡考虑沿着普雷格尔河观光旅行的路线。1880年,一位意大利画家转行成为动物学家,试图去解决一场激烈的争论:鸟类是否通过减少昆虫数量来保护农作物。1932年,纽约哈德森一所女子管教所的负责人聘请了一位社会学家调查最近一波离家出走事件的原因。1955年,一位美国陆军将军和一位数学家开发了一种识别苏联铁路系统瓶颈的技术。1998年,纽约伊萨卡的两位数学家试图弄清楚为什么所有的电影明星似乎都和凯文·贝肯联系在一起。

这些谜题发生在不同的时间和不同的地点,乍一看似乎无关紧要。但它们有一个共同点:它们都围绕着人际关系——人与人之间,地与地之间,或物种之间——它们都是通过人际关系科学解决的,也就是我们所知的网络科学。近年来,随着Facebook、Twitter、微信和Mastodon等在线社交网络平台越来越受欢迎,人们对网络科学的兴趣大大增加。

这本书涵盖了网络科学的基本概念,以及如何使用基于python的NetworkX包将它们付诸实践。第一部分(从第一章《什么是网络?》到第四章《从属网络》)介绍了网络的概念,以及如何在NetworkX中建立、操作和可视化网络。第二部分(从第五章《小尺度——节点和中心性》到第七章《介度——社区》)演示了如何分析不同尺度的网络结构。第三部分(从第八章《社交网络和病毒式传播》到第十一章《可视化》)应用网络科学通过建模、仿真和可视化来理解复杂系统。在这个介绍性的章节中,你将学习一些网络科学的历史和常见类型的网络之间的区别。你还会看到一些例子,可以用不同的方式解释网络中的关系。最后,您将使用NetworkX构建并可视化您的第一个网络!

在本章中,我们将讨论以下主题:

  • 网络科学:学习网络研究的历史。
  • 什么是网络?:了解网络科学的基本概念。
  • NetworkX是什么?:熟悉NetworkX Python包。
  • 网络类型:了解常见的网络变体,并了解它们的应用。
  • 你在NetworkX中的第一个网络:尝试一个简单的例子。

网络科学


网络科学的起源可以追溯到许多不同的领域。在大多数情况下,这些领域的研究人员开发了网络科学的工具和方法,而不太了解如何将其应用于其他领域。在非常不同的领域独立工作的科学家能够开发出非常相似的工具和技术,以至于现在被认为是一个单一的领域,这似乎令人吃惊。

这是怎么发生的?答案在于一种洞察力:有时,研究事物之间的关系而不去在意这些事物是什么种类的,这是相当有用的。网络科学家不是为了自己而研究网络——他们研究网络是为了更好地理解人类、动物物种、原子等等。(数学家除外。我们喜欢思考一些奇怪的抽象概念,比如网络,只是为了好玩。)

当被研究的人/物种/原子的细节被抽象出来后,看似不同的问题突然变得非常相似。这就是网络科学的力量;它提供了一种谈论关系和联系的通用语言,允许对一种事物的发现转化为对许多其他类型事物的有用信息。

网络科学的历史


最早被认为是网络科学的工作来自数学的分支,称为图论。图论起源于莱昂哈德·欧拉在1736年对七座桥问题的求解。当时,普鲁士哥尼斯堡市(现在的俄罗斯加里宁格勒)有七座桥梁连接普雷格尔河两岸和两个岛屿。不知道是否有可能找到一条穿过这座城市的路,使每座桥都恰好穿过一次。欧拉证明了这是不可能的,他使用的新方法成为图论的基础,后来成为网络科学的基础。

社会学对网络的研究也有着悠久的历史。1934年,社会学家雅各布·L·莫雷诺(Jacob L. Moreno)和海伦·霍尔·詹宁斯(Helen Hall Jennings)提出了人际关系定量研究的工具,他们称之为社会计量学。这些工具包括社交图,这是一种社交网络的图形表示,与目前使用的网络图非常相似。

当莫雷诺被纽约女子培训学校(New York Training School for Girls)的主管范妮·弗伦奇·莫尔斯(Fannie French Morse)雇佣,去调查一波离家出走的浪潮时,正是社会图让他得以将驱使离家出走的社会力量的性质可视化并进行交流。现代网络科学中使用的许多工具——中心性、从属网络、社区检测等等——都来自社会学。在过去的几十年里,社会计量学已经分支到社会网络分析,这是网络科学中一个丰富而活跃的分支。

其他各个领域发现研究网络结构很有用,并作为跨学科复杂系统社区的一部分,彼此分享了他们的工具和发现。生态学家研究食物网——捕食者和猎物之间的关系。生物学家研究基因之间的相互作用网络。物理学家研究晶体中相邻原子之间的磁性相互作用。所有这些领域都在网络科学方面做着令人兴奋的工作。

当然,还有互联网。互联网本身实际上是一个网络——计算机和路由器通过铜线、光纤电缆等相互连接。但是,最重要的是,互联网上的内容也是联网的。网页之间的链接形成了网络,而在线社交网络允许人们通过加好友或关注对方进行互动。谷歌搜索引擎建立在PageRank算法(Page et al.,1999)的基础上,PageRank算法是一种基于网络科学的方法来识别流行网站。在线社交网络通常通过出售广告空间和利用网络科学向最有可能点击它们的人展示广告来赚钱。如果你在网上看到一张可爱的猫的照片,你可以使用网络科学来了解这张照片是如何出现在你的电脑屏幕上的,这张照片是如何把你和你的朋友联系起来的,以及这张照片告诉你关于你可能想要访问的其他网站的什么信息。

今日网络科学


由于其跨学科性质,网络科学吸引了来自各种背景的从业者。在写这本书的时候,只有少数大学提供致力于网络科学的项目,因此网络科学家往往是自学成才,或者作为社会学家、物理学家、生态学家等接受培训。我自己的网络科学之路也同样曲折。我曾经是一名有抱负的物理学家,后来我意识到自己比原子更关心人,于是离开了研究生院,投身于民间组织的技术工作。当我最终接触到网络科学时,我兴奋地发现它是一个理解群体行为的强大工具,并且我从物理中学到的技能直接转移到网络科学中。从那以后,我一直在使用网络科学来更好地理解团队如何更有效地组织和合作。无论你的背景如何,网络科学是一个人人都适合的领域,因为没有人绝对适合它。

近年来,网络科学经历了快速发展,部分原因是在线社交网络、数字跟踪数据和NetworkX等工具的普及。曾经分散在许多不同领域的大学,现在正在创建专门致力于网络科学的研究中心和博士课程。各家公司纷纷聘用数据科学家,包括网络科学家。现在是探索令人愉快的网络数据世界的最佳时机。

网络是什么?


如果你走进马萨诸塞州剑桥市肯德尔广场地铁站,穿过旋转门,经过保罗·马蒂斯(Paul Matisse)的艺术装置,你会看到所有地铁的一个共同特征:地图。

如果你曾经使用过地铁地图,你就会知道它们不太像其他地图,后者往往关注距离和地形等细节。地铁地图忽略了所有这些,只向你展示了从一个地方到另一个地方所需要知道的最基本信息:哪些车站彼此相连。

当你乘坐地铁时,不管铁轨有多长,确切的方向,甚至不管它是在地上、地下还是水下。你所要做的就是在一站上车,在另一站下车,可能还要在这两站之间换乘。这种地图是网络科学家使用的网络类型的一个很好的例子。

节点和边


在网络科学中,网络只是事物及其之间的联系的集合。这些东西被称为节点,而连接被称为边。节点实际上只是具有连接或关系的任何类型的事物的占位符,例如地铁站、人或原子。同样,边是连接或关系的占位符,例如地铁轨道、友谊或分子键。就像地铁地图一样,将一个系统表示为一个网络,去掉了大量的信息,使得只关注结构成为可能。

网络可视化


网络通常通过在每个节点上画一个点或圆,在每条边上画一条线来可视化。

您可以决定将节点画在哪里。答案在你想要的任何地方!(尽管在技术上是可能的,但最好避免接触热的表面、大型食肉动物的嘴巴,和/或重要的历史文献。)因为网络的重点在于结构和连通性,所以有许多方法可以绘制相同的网络。节点可以绘制在任何地方。边可以是直的或弯曲的,可以是长的或短的。边缘甚至可以交叉,但这绝不应该被解释为相互连接!

同样的网络可以用许多其他方式绘制。这些节点被用字母标记,以便于比较不同的网络图。无论查看哪个图,任何特定节点都将连接到同一组其他节点。虽然绘制同一网络的不同方法同样正确,但有些方法可能有助于突出网络的特定特征。第十一章,可视化,描述了可视化网络的常见方法及其各种应用。

什么是NetworkX?


还记得NetworkX吗?这是一本关于NetworkX的书。NetworkX是一个用于建模、分析和可视化网络的Python包。它提供了表示几种网络类型的类,以及网络科学中使用的许多算法的实现。NetworkX相对容易安装和使用,并且有很多内置的功能,所以它是学习网络科学和在小型或中型网络上执行分析的理想选择。在项目网站https://networkx.github.io/上有很好的文档。

在撰写本文时,NetworkX的版本是2.3。虽然很多东西在1之间是完全相同的。X版本和2.X,一些基本功能发生了变化,因此与旧版本相关的文档和书籍可能不再准确。本书假设版本在2.3或以上,所以这里的所有例子都应该适用于NetworkX的最新版本。

NetworkX是自由开放源码软件(FOSS)。这意味着源代码可以读取、修改和重新分发(在某些条件下)。代码本身可以在https://github.com/networkx/networkx上找到。除了原始作者和项目维护者之外,NetworkX还由一个社区的数十名贡献者撰写。如果您对软件的新特性或改进方法有什么想法,您可以自己编写并将其贡献给社区。

网络的类型


到目前为止,本章所介绍的网络只包含了最基本的内容。这些网络被称为简单网络,因为它们很简单。在NetworkX中,简单的网络由Graph类表示,详细描述在第二章《在NetworkX中使用网络》。

有向网络


有时,为网络添加更多的细节会有所帮助。到目前为止,我们看到的边没有任何方向的感觉;它们只是两个节点之间的简单连接,因此它们被称为无向网络

想象一个代表道路(边)和交叉点(节点)系统的网络。具有无向边的网络是一个很好的表示法,直到你遇到了单行道。无向边缘意味着你可以在任意一个方向行驶,而在现实中,逆行行驶可能与逆行行驶有着完全不同的体验。

当方向很重要时,网络被称为有向网络。在有向网络中,每条边有一个源节点和一个目标节点。通常,有向边代表某种类型的流,例如,从源到目标的流。但如果不是所有连接都是单向的呢?简单!双向连接是通过组合两个方向相反的有向边来实现的。在有向网络中,有向边用箭头指向目标。在NetworkX中,有向网络由DiGraph类表示,同样在第二章《在NetworkX中使用网络》中描述。

赋权网络


回到无向网络的情况,有时,并不是所有边都是相等的。例如,在一个代表城市供水系统的网络中,边可以代表一系列将水从一个地方输送到另一个地方的管道。其中一些可能比其他的容量更大。当边可以有不同的强度时,称为加权网络,强度用一个称为权值的数字来量化。有向网络和无向网络都可以加权。在可视化网络时,边权重通常通过改变边的厚度或不透明度来表示。边权值可以用来表示许多不同类型的属性。最常见的将在下一节中描述。

理解边


边代表构成网络的联系和关系。根据网络所代表的内容,边和它们的权值可以有不同的解释。一些常见的解释包括:

  • 友谊
  • 流动
  • 相似度
  • 距离

社交网络


在社交网络中,边通常代表友谊或其他人际关系。边权重代表友谊的强度,例如,一起度过的时间,交换的信息,或共同兴趣的数量。

流动网络


流动网络描述了某物(人、信息、流体等)从一个地方到另一个地方的移动。边权值可以表示容量——可以在两个节点之间传输的最大数量——或通过/穿越连接的实际数量。

相似性网络


在相似性网络中,联系不那么字面,更抽象。边权值对应于两个节点的相似程度,通常0表示完全不同,1表示完全相同。例如,不同的人之间的一种相似性可以通过计算他们最喜欢的10个在线猫视频,并使用出现在两个人身上的视频的比例来计算。在这种情况下,边权值与两个人是否有任何关系无关。很有可能,两个素未谋面的人之间有一个非常重要的联系。

空间网络


边也可以表示距离(或紧密程度),尤其是当节点表示空间中的位置时。当用边权值来表示距离时,整个行程的距离可以通过将沿着路径的所有边权值相加来计算。使用边权值来表示距离有时会令人困惑,因为数字越大意味着连接越弱,而且不存在的边实际上是具有无限权值的边。有时候,更直观的方法是使用距离的倒数,尽管这可能会使跨越许多边的路径的工作变得复杂。


前面的例子涵盖了网络的许多常见应用,但它们绝不是详尽的。当一组事物彼此之间可以有任何类型的关系或连接时,就有可能使用网络来捕捉这些连接的结构

你在NetworkX中的第一个网络


现在,让我们使用NetworkX创建并可视化一个小型网络!对于本书中的代码,您将需要Python 3.4或更高版本以及NetworkX 2.2或更高版本。我还强烈推荐Jupyter Lab作为一个交互式Python环境。本书中的代码可以作为Jupyter笔记本在https://github.com/PacktPublishing/Network-Science-withPython-and-NetworkX-Quick-Start-Guide 上找到。

下面的示例创建一个无向、无加权的网络,添加边和节点,然后生成一个可视化结果。其他类型的网络将在第二章《在NetworkX中使用网络》中讨论。首先,我们导入networkx包。在本书中,我将使用使用别名nx导入。

import networkx as nx

接下来,我们创建一个Graph对象,表示一个无向网络。

G = nx.Graph()

现在这个图已经存在了,我们可以使用add_node()方法一次添加一个节点,或者使用add_nodes_from()一次性添加所有节点。当向网络中添加节点时,每个节点必须有一个惟一的ID。ID可以是数字、字符串或元组。事实上,你可以使用任何Python对象作为ID,只要它定义了__hash__()方法。在本例中,我们将使用字母作为节点id。

G.add_node('A')
G.add_nodes_from(['B','C'])

类似地,边可以通过add_edge()一次添加一条,也可以通过add_edges_from()一次添加所有边。

G.add_edge('A','B')
G.add_edges_from([('B','C'),('C','A')])

到目前为止,已经添加了A、B和C节点,以及连接它们的边。下面的代码绘制了一个简单的网络可视化。

%matplotlib inline
import matplotlib.pyplot as plt
plt.figure(figsize=(4, 4))
nx.draw_networkx(G)
# plt.show()

image

在前面的代码中,figure()用于创建一个4 * 4英寸的图形,它将保持可视化。draw_networkx()函数使用Graph对象G生成可视化。show()函数将呈现可视化结果,但如果您在Jupyter Lab中运行示例,则可以省略该函数(#表示注释)。

还可以使用一个漂亮的快捷方式添加节点。如果你试图添加一条指向一个不在网络中的节点ID的边,NetworkX会自动添加该节点!因此,在实践中,您不需要经常直接调用add_node()。下面的代码添加了节点和边,使网络与之前的示例网络匹配,并创建一个新的可视化:

G.add_edges_from([('B', 'D'), ('C', 'E')])
nx.draw_networkx(G)

image

总结


从17世纪哥尼斯堡的桥梁到互联网,网络科学从各种各样的领域中涌现出来,都在寻求量化和研究某种关系。网络科学中的网络模型关系是节点之间的边,它可以代表任何东西,从一种花,到晶体中的一个原子,再到社会中的一个个体。为了量化关系的属性,边可以被定向和/或加权。NetworkX提供了Python类和函数来轻松地创建和操作这样的网络。到目前为止,您应该对网络科学和NetworkX可以解决的问题类型有了一定的了解。接下来的章节将涵盖网络科学的各种应用以及NetworkX的相关特性,并举例说明它们如何应用于真实的数据集。

posted @ 2022-05-27 09:54  蒜泥叔  阅读(415)  评论(0)    收藏  举报