Python-现代图论算法-全-
Python 现代图论算法(全)
原文:
zh.annas-archive.org/md5/543461dd673fc915b1f86bce6efafcf5译者:飞龙
第一章:贡献者
关于作者
Colleen Molloy Farrelly是一位首席数学家、数据科学家和研究人员,擅长将数学应用于生物、医学、社会科学和物理科学。她还著有《数据的形状》一书。她指导过学生,共同撰写论文,并与拉丁美洲、非洲、欧洲和亚洲的人们合作。
她位于美国佛罗里达州的迈阿密,拥有迈阿密大学生物统计学硕士学位。她对发展中国家教育倡议充满热情,并在女性数据科学、IEEE 会议、PyData 和机器学习应用日等会议上发表演讲。
我想要感谢多年来支持我的人们,尤其是早期,包括 John 和 Nancy Farrelly,Peter Schnable,Warmus 家族,De Jong 先生和夫人,Mayor 家族,Justin 和 Christy Moeller,Luke Robinson,以及在我职业生涯中的许多教授和同事。
致我所有的学生以及那些在我之后激励我教学和分享知识的后来者,你们可以用数学和科学来改变世界,使其变得更好。
Franck Kalala Mutombo是卢本巴希大学的数学教授,也是 AIMS-Senegal 的前学术总监。他之前在苏格兰格拉斯哥的斯特拉斯克莱德大学和 AIMS-South Africa 担任研究职位,与开普敦大学联合任命。他拥有斯特拉斯克莱德大学的数学科学博士学位。他目前的研究考虑了网络结构对流行病、扩散、对象聚类、流形微分几何、偏微分方程的有限元方法和数据科学的影响。目前,他在卢本巴希大学和 AIMS 网络中教学。
我对我的支持网络在整个旅程中表达感激之情。我感谢那些为我的职业生涯做出贡献的朋友和教授。我对非洲的无数学生以及他们之后的继任者感到感激。他们的热情和好奇心是数学和科学对塑造更美好世界产生深远影响的持续提醒。我怀着感激之情接受教学和分享知识的机会,培养一个致力于利用这些学科变革潜力的学习者社区,以实现更大的福祉。
关于审稿人
Casey Moffatt,拥有应用数学硕士学位,以及纯数学和哲学的双学士学位,专攻图论、优化和计算机科学。他精通 Python 以及图数据科学、机器学习和算法开发的各种必要软件。他渴望在数学和计算机科学领域突破边界。他想要感谢 Packt 出版社和贡献者,使他们能够实现这样的项目,并感谢那些支持开源技术的无数个人。
目录
前言
第一部分:带示例的图和网络导论
1
什么是网络?
技术要求
图论和网络导论
形式定义
在 Python 中创建网络
随机图
现实世界社交网络示例
其他类型的网络
网络科学的先进用例
总结
参考文献
2
使用 NetworkX 和 igraph 将数据整理成网络
技术要求
不同数据源导论
社交互动数据
空间数据
时间数据
生物网络
其他类型的数据
使用 igraph 将数据整理成网络
使用 NetworkX 的社交网络示例
总结
参考文献
第二部分:空间数据应用
3
人口数据
技术要求
人口学导论
人口因素
地理因素
网络中的同质性
法语非洲音乐传播
AIMS 喀麦隆学生网络流行模型
总结
参考文献
4
运输数据
技术要求
运输问题导论
商店之间的路径
燃料成本
送货时间
导航危险
最短路径应用
旅行商问题
最大流最小割算法
总结
参考文献
5
生态数据
技术要求
生态数据简介
探索跟踪地理分布动物种群的方法
探索捕捉植物分布和疾病的方法
谱图工具
使用谱图工具聚类生态种群
在文本笔记上进行谱聚类
总结
参考文献
第三部分:时间数据应用
6
股票市场数据
技术要求
时间数据简介
股票市场应用
中心性度量简介
在时间切片中应用中心性度量
扩展网络度量以进行时间序列分析
总结
参考文献
7
商品价格/销售数据
技术要求
时空数据简介
布基纳法索市场数据集
存储销售数据
分析我们的时空数据集
总结
参考文献
8
动态社交网络
技术要求
随时间变化的社会网络
友谊网络
三重闭合
深入探讨网络上的传播
动态网络介绍
SIR 模型,第二部分
影响传播的因素
具有演化的野生动物交互数据集的示例
鳄鱼网络
赫伦网络
总结
参考文献
第四部分:高级应用
9
网络机器学习
技术要求
友谊网络和友谊关系数据集简介
友谊网络简介
友谊人口统计和学校因素数据集
网络上的机器学习
基于学生因素的聚类
基于学生因素和网络指标的聚类
友谊网络上的谱聚类
网络上的深度学习
GNN 简介
示例 GNN 对 Karate Network 数据集进行分类
总结
参考文献
10
路径挖掘
技术要求
贝叶斯网络和因果路径简介
贝叶斯定理
因果路径
贝叶斯网络
教育路径示例
教育成果
课程序列
成功的先决条件
分析课程序列以找到最佳学生毕业路径
数据集简介
bnlearn 分析
结构方程模型
总结
参考文献
11
映射语言家族 - 本体方法
技术要求
什么是本体?
本体简介
将信息表示为本体
语言家族
语言漂移和关系
尼罗-撒哈拉语言
映射语言家族
总结
参考文献
12
图数据库
图数据库简介
什么是图数据库?
你可以在图数据库中表示什么?
在 Neo4j 中查询和修改数据
基本查询示例
更复杂的查询示例
摘要
参考文献
13
综合运用
技术要求
问题介绍
刚果民主共和国埃博拉疫情传播 – 2018-2020 爆发
地理和物流
GEE 简介
GEE 的数学
我们的问题和 GEE 公式化
数据转换
Python 数据处理
GEE 输入
数据建模
在 Python 中运行 GEE
摘要
参考文献
14
新领域
量子网络科学算法
图着色算法
最大流/最小割
神经网络架构作为图
深度学习层和连接
分析架构
分层网络
高阶结构和网络数据
使用基因家族的示例
超图
显示信息
元数据
摘要
参考文献
索引
你可能喜欢的其他书籍
前言
你好!网络科学结合了分析的力量和图论深入的理论工具,以解决数据分析中的难题。这使研究人员和行业工程师/数据科学家能够大规模分析数据,并将难以处理的分析问题重新构思,以产生对问题和系统行为的预测洞察力,包括感兴趣的生物、物理和社会系统。
网络科学今天有许多重要的应用,包括以下这些:
-
社交网络数据
-
空间数据
-
时间序列数据
-
空间时间数据
-
更高级的数据结构,如本体或超图
本书简要概述了社交网络应用,并聚焦于网络科学在数据科学领域的尖端应用,如交通运输物流、对话、公共卫生、语言学和教育。到旅程结束时,你将能够将你的数据问题置于网络科学的框架内,以获得洞察力并解决你领域中的难题。
我们将在深入研究与过去几十年在学术界和工业界的工作相关的实际例子和代码时,提供必要的数学背景,包括预测埃博拉疫情、预测食品价格波动、建模遗传和语言关系,以及挖掘社交网络以了解社会联系形成。随着世界面临粮食短缺、公共卫生危机、经济不平等、供应链中断和环境危机,网络科学将在大数据分析中发挥重要作用,以造福社会。
本书面向对象
如果你正在处理数据,这本书就是为你准备的。为了最大限度地利用本书,你应该对 Python 有所了解,特别是pandas和numpy包。此外,假设你对数据分析有所了解,尽管我们解决的网络科学工具和问题是为没有这些问题的背景或方法的读者从头开始构建的。
网络科学在许多科学学科中有着丰富的历史,包括流行病学、生物医学工程、社会学、遗传学、环境科学、粒子物理学、计算机科学和经济学。它在图论中的基础影响了纯数学和应用数学许多领域的研究。科学、技术、工程和数学领域的任何人都可以从网络科学的工具集和解决问题的方法中受益。
本书涵盖内容
第一章,什么是网络?介绍了网络的理论概念,并提供了几个现实世界应用中的网络示例,包括随机图的工作。我们还将开始使用 Python 的 igraph 和 NetworkX 包。
第二章,使用 NetworkX 和 igraph 将数据整理成网络,在第一章的基础上,提供了三个现实世界数据的例子,这些数据可以表示为网络数据,并展示了如何在 Python 中将数据转换为网络形式。我们将介绍涉及空间数据、时间数据和时空数据的问题,并探讨如何通过将数据转换为网络形式来解决这些问题。
第三章,人口数据,探讨了两个使用发展中国家的人口数据来理解网络结构和信息/传染病传播能力的现实世界项目。我们将考虑朋友群体的人口特征和网络属性,以了解这两种类型的信息如何影响疾病传播。
第四章,交通数据,提供了一个交通网络的现实世界例子,并介绍了与最短路径和网络流相关的工具。我们将考虑最优路由和到达目的地的最短路径,包括从一个地点到另一个地点的多站路径。
第五章,生态数据,展示了一个生态网络的现实世界例子,并介绍了谱图理论工具,包括谱聚类和图拉普拉斯算子。
第六章,股市数据,考察了一个使用网络工具分析股市数据的现实世界例子,包括基于边的波动性中心度度量。我们将挖掘数据中的转折点,预示着市场增长或市场崩溃的时期。
第七章,商品价格/销售数据,提供了两个在空间和时间上分析商业数据的现实世界例子,使用了之前在时间序列和空间数据应用中介绍的工具。我们将考察时间和空间上的销售和定价趋势,以更好地理解消费者行为以及时间和空间上定价变化的影响。
第八章,动态社交网络,介绍了一个随时间演变的社交网络数据集的现实世界例子,并分析了它们对传播过程(如流行病和错误信息传播)的脆弱性。我们将考虑影响生态社会网络对疾病传播脆弱性的因素。
第九章,网络机器学习,对基于网络的机器学习和深度学习进行了全面描述,包括监督学习、无监督学习和半监督学习的例子,以理解社交网络中的疾病风险。
第十章**,路径挖掘,介绍了贝叶斯网络和利用教育数据示例进行因果路径挖掘,我们将看到课程顺序和表现如何影响学生成绩。
第十一章**,语言家族映射 – 一种本体论方法,涵盖了本体论以及使用尼罗-苏丹语系及其词汇变体语言数据示例的本体论之间的映射。
第十二章**,图数据库,介绍了使用 Neo4j 的图数据库,包括前几章的数据以及如何使用前几章介绍的图工具和 Neo4j 的查询语言查询 Neo4j。我们将看到图数据库和网络科学工具如何在数据科学中产生协同效应,以及高效的数据存储解决方案。
第十三章**,整合一切,将前几章的内容整合成一个最终项目,使用广义估计方程分析伊图里省和北基伍省的空间时间网络数据和人口数据,以了解 2019 年埃博拉疫情的演变。
第十四章**,新领域,介绍了量子图算法、用于神经网络优化的图论、分层网络和超图。
要充分利用这本书
我们提供 Python 脚本,并假设您对基本的 Python 分析包(如 NumPy 和 scikit-learn)和 Python 语法有一定的了解。我们假设您对基本的分析任务(如汇总统计和在使用numpy或pandas的 Python 中处理不同类型的数据)有一定的了解。每个章节都有相应的脚本,后续的脚本通常依赖于章节中较早的脚本以构建知识。Python 和数据分析中的其他概念将以概念和 Python 代码示例的形式介绍。
| 本书涵盖的软件/硬件 | 操作系统要求 |
|---|---|
| Python 3.12.3 | Windows, macOS, 或 Linux |
如果您使用的是本书的数字版,我们建议您亲自输入代码或从本书的 GitHub 仓库(下一节中有一个链接)获取代码。这样做将帮助您避免与代码复制和粘贴相关的任何潜在错误。
鼓励您在本书的真实世界数据科学项目中尝试代码示例。如果您想深入了解图算法和网络科学,我们鼓励您查看网络科学主题的最新研究论文。Google Scholar 和 arXiv 是网络科学方法和应用论文的两个良好参考。
下载示例代码文件
您可以从 GitHub 下载本书的示例代码文件 github.com/PacktPublishing/Modern-Graph-Theory-Algorithms-with-Python。如果代码有更新,它将在 GitHub 仓库中更新。
我们还有其他来自我们丰富的书籍和视频目录的代码包,可在 github.com/PacktPublishing/ 获取。查看它们!
使用的约定
本书使用了多种文本约定。
文本中的代码:表示文本中的代码单词、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 账号。以下是一个示例:“此脚本显示平均子图中心性在两个子家族树之间有所不同,Greenberg 的平均子图中心性为 2.478,Dimmendaal 的平均子图中心性为 3.276。”
代码块设置如下:
#compare subgraph centrality of language families
gs=nx.subgraph_centrality(G)
print(np.mean(np.array(list(gs.values()))))
gs2=nx.subgraph_centrality(G2)
print(np.mean(np.array(list(gs2.values()))))
粗体:表示新术语、重要单词或您在屏幕上看到的单词。例如,菜单或对话框中的单词以 粗体 显示。以下是一个示例:“当您将鼠标悬停在屏幕右侧的 Movie DBMS 标签上时,您将看到一个 Start 按钮,该按钮启动与该数据库的连接。单击 Start。”
小贴士或重要注意事项
看起来像这样。
联系我们
我们始终欢迎读者的反馈。
一般反馈:如果您对本书的任何方面有疑问,请通过电子邮件发送至 customercare@packtpub.com,并在邮件主题中提及书名。
勘误:尽管我们已经尽最大努力确保内容的准确性,但错误仍然可能发生。如果您在这本书中发现了错误,我们将不胜感激,如果您能向我们报告,我们将不胜感激。请访问 www.packtpub.com/support/errata 并填写表格。
盗版:如果您在互联网上以任何形式遇到我们作品的非法副本,我们将不胜感激,如果您能提供位置地址或网站名称,我们将不胜感激。请通过电子邮件发送至 copyright@packtpub.com 并附上材料的链接。
如果您想成为一名作者:如果您在某个领域有专业知识,并且对撰写或参与一本书籍感兴趣,请访问 authors.packtpub.com。
分享您的想法
读完 Modern Graph Theory Algorithms with Python 后,我们非常乐意听到您的想法!请 点击此处直接进入此书的亚马逊评论页面 并分享您的反馈。
您的评论对我们和科技社区都至关重要,并将帮助我们确保我们提供高质量的内容。
下载本书的免费 PDF 复印本
感谢您购买本书!
您喜欢在路上阅读,但无法随身携带您的印刷书籍吗?
您的电子书购买是否与您选择的设备不兼容?
不用担心,现在每购买一本 Packt 书籍,您都可以免费获得该书的 DRM 免费 PDF 版本。
在任何地方、任何设备上阅读。直接从您喜欢的技术书籍中搜索、复制和粘贴代码到您的应用程序中。
优惠远不止这些,您还可以获得独家折扣、时事通讯和每日免费内容的访问权限。
按照以下简单步骤获取好处:
- 扫描二维码或访问以下链接

packt.link/free-ebook/9781805127895
-
提交您的购买证明
-
就这些!我们将直接将免费 PDF 和其他好处发送到您的电子邮件。
第一部分:带示例的图和网络简介
本书本部分构建了网络科学的实用和理论基础,并介绍了两个在分析网络中非常有用的 Python 包。第一部分详细介绍了可以将数据科学问题表述为网络科学问题的几个示例,包括与社交关系数据、神经网络架构、本体、时间序列数据和时空数据相关的问题。本部分还建立了图论的基础性主题,包括图的类别和形式定义,并通过示例网络介绍了 igraph 和 NetworkX Python 包。
第一部分包含以下章节:
-
第一章**,什么是网络?
-
第二章**,使用 NetworkX 和 igraph 将数据整理成网络
第二章:什么是网络?
本章介绍了图论的基础及其在网络科学中的应用。网络科学并不是数据科学中常见的教学领域,但许多问题可以通过网络科学的视角来构建。基于网络的算法通常比其他机器学习算法具有更好的可扩展性,这使得它们非常适合分析具有许多变量的数据集,探索具有许多位置的地理数据集,或者在高维时间序列数据中识别趋势。后续章节将通过实际示例更深入地探讨这些主题。
在本章中,我们将定义本书中将要使用的术语,探讨网络科学在分析社会关系数据中的常见应用,并介绍将在后续章节中使用的两个 Python 包。完成本章后,你将开始识别那些可以表述为网络科学问题并如何在 Python 中可视化的数据科学问题。
正式来说,我们将涵盖以下主题:
-
图论和网络简介
-
真实世界社交网络的例子
-
其他类型的网络
技术要求
对于本章,我们只有非常少的技术要求或假设。如果你还没有安装 Python,我们鼓励你安装它,因为我们将会经常使用 Python——特别是与 Anaconda 版本 Python 安装一起安装的 Jupyter Notebooks。如果你在安装过程中遇到困难,可以在 Stack Overflow 上找到支持。每个章节的代码可以在以下 GitHub 链接下找到:github.com/PacktPublishing/Modern-Graph-Theory-Algorithms-with-Python。
图论和网络简介
社会联系对社会至关重要,包括家庭关系、社区中的共同角色、贸易关系等等。在过去几十年中,从 MySpace 到 Twitter 再到 TikTok,社交网络在营销、求职和信息共享中扮演了越来越重要的角色。软件系统甚至可以在全球各地的工程师之间构建,他们通过 GitHub 或 Slack 等平台协作,协调来自肯尼亚、印度和澳大利亚的团队的努力,而这些团队从未见过面。
数据科学的一个分支,称为网络科学,使用起源于称为图论的数学领域的算法和统计方法,研究个人、群体甚至社会网络中个体之间的关系。图论研究对象之间的成对关系。图对象(包括人、城镇、思想、时间点以及许多其他要研究的对象)在网络科学中作为网络中的顶点或点来表示;请注意,某些学科可能使用“节点”而不是“顶点”这个术语。对象之间的关系(如人们之间的共同合作或连接不同岛屿的桥梁,或时间点之间的统计联系)在网络中以边的形式表示,并连接具有关系的顶点对。
为了使这个问题更加具体,让我们考虑三位年轻女性:来自南非的 Ayanda,来自日本的 Machiko 和来自比利时的 Greta:

图 1.1 – Ayanda,Machiko 和 Greta
也许 Ayanda,Machiko 和 Greta 参加了一个旨在可持续能源解决方案的在线女性编码黑客马拉松。通过黑客马拉松,他们相遇并组建了一个团队,共同研究为农村村庄提供太阳能解决方案。他们之间形成了具有相互关系的专业网络,如图图 1.2所示:

图 1.2 – 显示女性之间成对连接的 Ayanda,Machiko 和 Greta 的网络表示
当这些女性在他们的黑客马拉松项目中工作时,Ayanda 可能会邀请她社交网络中的同事,增加团队人数,并为 Machiko 和 Greta 随着时间的推移创造新的联系。也许来自肯尼亚的 Amara,Ayanda 的同事,与 Greta 建立了联系,但没有与 Machiko 建立联系,以编码他们项目的后端,为网络增加另一个成员:

图 1.3 – 添加 Amara 后的社交网络
随着时间的推移,网络的演变是当今网络科学中的一个关键问题,因为我们往往对我们明确观察到的关系之外存在的关系的完整数据不完整,并且想要预测未来的现象,例如预测下一次选举中两党假新闻的潜在传播可能性,或者根据现有联系,新成员可能加入犯罪组织的情况。我们将在第八章中探讨与动态社交网络及其应用相关的一些问题,其中我们分析随着社交网络的发展,疾病随时间传播的情况。
在深入研究 Python 中的现实世界问题和解决方案之前,了解网络科学的基本原理非常重要。让我们深入了解图论和网络的一些术语和约定。
正式定义
现实世界的网络通常使用图论的工具进行形式化和研究。正如我们提到的,图论以顶点和连接相关顶点的边的形式定义对象之间的关系。让我们对此进行一些形式化,并探索图论中网络科学的基石。一个图被定义为顶点的集合和连接顶点对的边的集合(Berge,2001)。因此,图很好地代表了网络的架构。回到我们的黑客松社交网络,我们将同事表示为顶点,如果他们合作,则通过边将他们连接起来。
图可以表示不同类型的关系。顶点的自关系可以通过连接顶点到自身的回路来表示。例如,在写电子邮件时,某人可能会在电子邮件中抄送自己,或者给自己发送一封提醒邮件。另一种关系类型是方向性。例如,转发内容是一种单向交互(通常),但成为朋友是一种双向交互,双方都相互连接。单向关系在图中用有向边表示,通常在图的视觉表示中用箭头表示。双向关系用无向边表示,表示为没有箭头的线条。图 1.4 展示了一个具有回路、有向边和无向边的图:

图 1.4 – 具有回路、有向边和无向边的图
在科学文献中,网络和图这两个术语可以互换使用,边和顶点的术语也是如此。表 1.1 展示了一些常见的术语:
| 网络科学 | 图论 |
|---|---|
| 网络 | 图 |
| 节点 | 顶点 |
| 链接 | 边 |
| 集合 | 集合 |
| 关系 | 函数 |
| 有向图 | 有向图 |
表 1.1 – 网络科学和图论之间的术语比较
在实践中,这些区别很少被做出,因此这两个术语通常是同义的。在这本书中,我们将坚持使用 边 和 顶点 作为我们的图组件,并将网络作为从现实世界数据中创建的顶点和边的集合的首选术语。
图论中存在许多类型的图,这些图在现实世界的数据中得到了实现。让我们简要定义一些存在的图类型:
-
一个有向图包含一个或多个有方向的边(指向或来自另一个顶点,称为弧)
-
一个无向图只有边,没有起点或终点顶点
“如果一个图没有多条边(通常用来表示存在或表示关系的强度),则该图是简单的。” 一个简单的无向图不包含回路,但一个简单的有向图可以包含回路。让我们可视化这些图在实际中的样子:

图 1.5 – (a) 有向图,(b) 简单图,和(c) 简单有向图底部
我们可以根据数据定义顶点和它们的连接边或弧,以在 Python 中创建用于可视化和分析的图。在下一节中,我们将介绍一些将在整本书中使用的 Python 包,用于创建和实际研究网络。
在 Python 中创建网络
现在我们对网络有了一些了解,让我们探索它们是如何使用网络科学中常用的两个 Python 包创建的:igraph和NetworkX。
igraph 是一种在 C、R 和 Python 中可用的网络科学软件。igraph 提供了许多网络科学工具,包括网络创建选项、许多网络分析算法和网络可视化图表。让我们通过我们的 Hackathon 网络来探索 igraph 的网络创建和可视化:
-
首先,让我们安装igraph:
#install igraph and pycairo !pip install igraph !pip install pycairo -
然后,我们将导入igraph及其Graph模块:
#import igraph import igraph as ig from igraph import Graph -
接下来,我们将使用Graph模块创建一个有三个顶点且顶点之间无向边连接的图:
#create hackathon network g_colleagues=ig.Graph( edges=[(0,1),(0,2),(1,2)],n=3,directed=False) -
现在,我们可以使用plot函数来可视化我们的 Hackathon 网络。igraph 提供了许多定制选项,包括顶点颜色、顶点大小、边颜色、边大小、顶点标签以及图表的大小(等等)。对于这个图表,我们将限制图像的大小,并创建足够大的顶点,以便用 Hackathon 网络成员的首字母标记:
#plot the hackathon network ig.plot(g_colleagues,bbox= (200,200), vertex_size=40, vertex_label=["M","A","G"])这应该会给你一个看起来像图 1.6的图表,显示Machiko、Greta和Ayanda的 Hackathon 网络:

图 1.6 – igraph 中 Hackathon 网络的图表
现在,让我们在 NetworkX 中重复我们的网络创建过程。NetworkX 包含了 igraph 的大部分功能,但提供了与其他网络科学工具和平台更简单的集成方式,以及探索网络上的微分方程的简单方法:
-
让我们先安装NetworkX:
#install NetworkX !pip install NetworkX -
现在,让我们导入NetworkX:
#import NetworkX import networkx as nx -
NetworkX 在网络构建方面与 igraph 略有不同。我们首先定义一个空图,填充顶点,然后定义存在的边:
#create hackathon network G = nx.Graph() G.add_nodes_from([1, 3]) G.add_edges_from([(1, 2), (1, 3), (2, 3)]) -
我们需要添加属性(我们的网络成员首字母),导入matplotlib,然后绘制我们的图:
#plot the hackathon network import matplotlib.pyplot as plt G.nodes[1]['initial'] = 'M' G.nodes[2]['initial'] = 'A' G.nodes[3]['initial'] = 'G' labels = nx.get_node_attributes(G, 'initial') nx.draw(G, labels=labels, font_weight='bold')这应该会显示一个结构类似但风格略有不同的图表,与我们之前在 igraph 中构建的图表不同:

图 1.7 – 我们 Hackathon 网络的 NetworkX 图表
在接下来的章节中,我们将使用 igraph 和 NetworkX 来展示这两个包中的示例。对于某些问题,igraph 将具有更好的功能;对于其他问题,NetworkX 更可取。在实践中,当你将网络科学应用于现实世界问题时,你将遇到这两个包。在下一节中,我们将概述不同的网络类型和问题,为我们的未来章节奠定基础。
随机图
随着网络科学开始解决越来越多的现实世界问题,理解网络增长过程成为了一个研究方向:
构建边缘是否纯粹是随机的?
给定顶点的数量,任何顶点可能培养的边的数量有限制吗?
具有许多边的顶点倾向于鼓励与特定高度连接的顶点共享边的未连接顶点之间的边吗?
顶点和边是否分离成与其他组连接不良的紧密连接的组?
几种增长过程模型产生了在网络科学研究中有用的常见增长模式。其中一些,例如Erdös-Rényi 网络,作为现实世界网络中组织发展的比较。Erdös-Rényi 网络是随机网络,其中顶点之间的边是以概率方式在任意一对顶点之间创建的。例如,为了创建一个具有许多边的网络,我们可能会将顶点对连接的概率设置为 70%。为了创建一个具有较少边的网络,我们可能会将顶点对连接的概率设置为 10%。图 1.8(a)显示了边连接概率为 70%的 Erdös-Rényi 网络;图 1.8(b)显示了边连接概率为 10%的 Erdös-Rényi 网络:

图 1.8 – 具有边概率为(a)70%和(b)10%的 Erdös-Rényi 网络
在现实世界中,偏好连接,其中一些顶点吸引其他顶点的连接,是顶点之间添加边的一个更现实的模型。偏好连接最著名的例子之一是Barabási-Albert 模型,其中网络围绕某些顶点形成更多的连接。
在一个现实世界的偏好连接例子中,让我们考虑一个前端工程师在社交媒体上寻找潜在合作者的后端工程师。因此,前端工程师的连接不会是随机的。它们将基于工程师的具体需求和搜索后端工程师的结果来培养。无标度网络是这种在现实世界网络形成过程中经常发生的偏好连接的模型。图 1.9显示了添加所需连接后的前端工程师的社会网络,这些连接可能在他们与前端工程师连接之前并不相识:

图 1.9 – 前端工程师通过社交媒体搜索培养的工程连接的无标度网络
网络形成无标度模型的重大批评之一是缺乏中心节点,或者是一组顶点之间具有高连接性而与其他顶点集的连接相对较少的区域。Watts-Strogatz 模型解释了这种形成更密集连接区域的趋势。例如,基因网络通常形成相关基因的簇,这些基因在功能上相互影响;一些基因簇也会影响其他基因簇,形成偶尔连接的基因集,如图 图 1.10 所示:

图 1.10 – 相关基因的网络
最近的研究表明,这些随机的网络模型都无法捕捉到真实网络所具有的所有细微差别。许多真实网络具有优先连接和密集聚类的特点,以及一些根据网络已知信息不会出现的随机连接。朋友的朋友经常会相遇。个人通过搜索社交网络或连接到朋友的其它社交群体来找到与自己有共同兴趣的人。有些友谊是在个人被困在电梯或渡轮上时随机开始的。
现在我们已经探讨了如何在 Python 中创建网络,让我们回到一些真实世界的网络例子,包括有向和无向网络以及随时间改变结构的网络。
真实世界社交网络的例子
真实世界的网络通常比我们考虑的例子要复杂得多。让我们考虑一下社交媒体网络中的细微差别。在最简单的形式中,一个社交网络包含在某个时间点朋友之间的相互连接。然而,一些朋友可能在社交媒体平台上比其他人互动得更频繁;他们可能会评论帖子、重新分享内容,并频繁地互相发消息。加权网络根据关系强度或互动频率的某种测量标准为网络中的边分配数值。
让我们回到我们的黑客马拉松网络,并根据不同团队成员在黑客马拉松期间每天的平均对话次数来加权我们的边。也许 Machiko 正在协调技术的业务用例,与后端工程师 Ayanda 的互动不多,但需要确保前端直观(Greta 的团队位置)。然而,我们预计 Ayanda 和 Greta 会更频繁地合作,因为他们正在整合产品的后端和前端。也许我们有一个如图 图 1.11 所示的加权网络:

图 1.11 – 团队成员之间对话的加权黑客马拉松网络
除了加权,关系可以是无向的或定向的。到目前为止,我们已经考虑了无向网络,其中关系是相互的。友谊、Zoom 会议、共享课程、团队会员资格以及许多其他现实世界的网络都涉及相互关系。然而,消息是一方互动,在发送者和接收者之间。社交媒体内容的转发也是一方关系。基因调控、人口迁移、航班和货物运输也涉及一方互动。有向图允许我们在图中捕捉方向信息,并且像无向图一样,有向图可以是加权的或无加权的。
让我们考虑一场足球比赛,球员们在 5 分钟内互相传球。也许一个前锋会带球一段时间,然后传球给另一个前锋,后者迅速将球传给空中的中锋。图 1.12 展示了队友之间这种加权的足球场互动网络:

图 1.12 – 在 5 分钟内互相传球的一组足球队友网络
网络很少是静态的。考虑一群从大学毕业的朋友。有些人会在接下来的几年里保持联系;有些人会失去联系。持久友谊的强度也可能发生变化。那些留在他们上大学的地方的人可能会在进入职场时加强他们的友谊。那些搬走的人可能会在他们的新地点与其他人建立联系,并开始与其他地区的朋友失去联系。让我们考虑四名从开普敦大学毕业并在不同城市追求不同职业的亲密朋友:

图 1.13 – 毕业生在不同城市迁移和追求不同职业的友谊网络
十年后,这些大学朋友中的一些人不再相互联系,从而产生了一个截然不同的友谊网络,如 图 1.14 所示:

图 1.14 – 毕业十年后的大学友谊网络
图 1**.14显示,一个朋友(右上角)与所有但一个亲密的大学朋友失去了联系。一个朋友(左下角)保持了所有她的亲密大学友谊。这种变化可能看起来相当微不足道,因为所有朋友都至少保持了原始群体中的一个朋友。然而,从网络信息交换的角度来看,原始的友谊网络更容易从右上角的朋友向网络中的其他朋友交换信息。她可以直接与每个朋友沟通。
然而,在十年的友谊漂移之后,右上角的朋友的信息交换必须通过左下角的朋友才能到达网络中的其他部分。在图 1**.14中,重要新闻(可能是关于团聚或婚礼的消息)到达整个网络所需的时间将比图 1**.13中的时间更长。
在本节中,我们介绍了几种类型的社会网络。我们看到了关系可以是相互的或单方面的。我们看到了网络如何随时间变化,以及这可能如何影响网络上的信息交换。我们将在第二章、第三章、第八章和第九章中重新审视社会关系。现在,让我们探索一些可以表述为网络的其他类型的问题。
其他类型的网络
到目前为止,我们主要考虑了社会网络。然而,对象及其关系可以在更广泛的问题范围内定义。网络科学为理解空间数据提供了有用的工具。例如,考虑一个由一系列桥梁连接的几个小岛镇的区域,这些桥梁允许货物和人们从一个地区到另一个地区旅行。在流行病期间,了解哪些路线需要关闭以最大限度地减少疾病从一个镇传播到另一个镇可能是有用的。然而,完全切断路线将使一些地区缺乏必要的供应,如食物或药品。我们将在后面的章节中考虑的工具可以帮助地区规划商品的优化路线,并最大限度地减少流行病的潜在传播。
我们还可以考虑一个商店地图,每个商店都有不同数量的柑橘水果销售量。商店可以根据跨商店的共享管理、基于柑橘水果销售模式相似性或基于地理位置(例如,在同一县或国家内)连接成一个网络。我们如何定义我们的网络将影响我们能够从区域柑橘水果销售和可能影响这些销售模式的因素中获得哪些见解。我们将在第四章中更深入地探讨这个用例。
同样,我们可以将时间序列数据整理成网络,并使用网络科学工具来洞察时间上的模式。例如,考虑科技、农业和制造业部门的每日金融数据。我们可以考虑部门之间的每周相关性,并构建一个由相关性值定义边权的加权网络,跟踪数据中存在的几周内的网络属性,以确定可能预示即将到来的市场崩溃的变化。股票和金融部门之间的相关性网络已被广泛研究,我们将在第六章中回到这个例子。
有时,我们拥有时空数据,其中我们的数据具有空间和时间序列组件。考虑一个国家几个城市市场的粮食价格。价格将在市场之间有所不同,受当地供需、国家某些地区的法规以及当地工资的影响,这些因素可能会影响特定市场的粮食价格。与其他市场的邻近性和随时间的变化(例如,乌克兰冲突限制全球粮食供应)也会影响价格。通过创建一系列基于地理、时间段以及上述其他一些因素的网络的系列,我们可以了解哪些市场在粮食价格方面倾向于相似的行为,哪些地区可能最容易受到价格上涨的影响,哪些地区可能最容易受到供应链问题的影响。这可能允许援助组织更快地将粮食援助转向人们不太可能负担得起未来粮食价格或可能完全失去粮食的地区。我们将在第七章中解决这个问题。
现在我们已经看到了一些空间和时间数据的用例,让我们转向一些可以用网络科学术语表述的数据科学中的更高级问题,包括神经网络架构和语言本体。
网络科学的高级用例
网络科学的工具不仅限于社交网络、空间数据和时间数据。深度学习模型在当今数据科学中无处不在,解决计算机视觉、自然语言处理、时间序列预测和生成式人工智能的问题。大型语言模型(LLMs)和文本到图像生成器依赖于一种称为变换器模型的深度学习架构,这种架构通过嵌入输入数据、调整注意力权重和根据结果解码数据来在数据中寻找模式。这些模型可以调整数十亿甚至数万亿个参数,跨越许多连接的层。当与预训练的对比语言-图像预训练(CLIP)模型结合时,如 DALL-E 这样的变换器模型甚至可以根据文本输入生成逼真的图像。例如,将 hyperdetailed photorealistic king cobra, background desert market 输入 NightCafe 的 DALL-E 算法,产生了 图 1.15 中的图像:

图 1.15 – NightCafe 的 DALL-E 输出图像,提示为“超详细的真实感蛇王,背景沙漠市场。”
然而,考虑到深度学习模型如变换器模型(或常用于图像分类的卷积神经网络)的大小,理解层与层之间的连接对于构建不需要过多调整的良好初始模型至关重要,这有助于根据网络属性调整架构。
此外,网络本身也可以通过一种特殊的深度学习算法进行建模,称为图神经网络,它将网络作为输入数据,并根据某些输出构建回归或分类模型。例如,假设我们想了解哪些网络最容易受到虚假新闻传播的影响;在 2014 年和 2018 年的埃博拉疫情爆发中,有关公共卫生措施和病毒来源的虚假新闻阻碍了公共卫生工作,并导致了更多生命损失,以及一些针对治疗中心的暴力袭击。我们可能已经研究了数百个网络,并根据网络属性和在这些网络上模拟的虚假新闻传播情况将它们分类为高风险、中风险或低风险,但我们想评估从全球社交媒体网站收集的数十万个实际网络。我们可以在我们的分类数据上训练一个图神经网络,并将其应用于更广泛的已抓取网络集合,以对它们的虚假新闻风险进行分类。
除了神经网络之外,网络还有许多其他高级应用,包括本体映射。本体组织对象之间的关系,例如词语之间的语义关系、基因之间的调控关系或疾病之间的共有症状。通常存在多个本体,例如跨连锁店消费者商品的组织。将一个本体映射到另一个本体提供了一种将每个本体中的信息组合成一个单一实体的方法。鉴于每个本体都作为其自身的网络存在,并映射到其他本体上,问题可以简化为网络映射。我们将在本书的后面更深入地探讨这一点。
摘要
在本章中,我们探讨了不同类型的网络,介绍了两个 Python 网络包,检查了不同的网络增长理论模型及其局限性,并考虑了几个非基于社会关系的网络示例。我们还简要介绍了网络科学今天的一些更高级主题,包括网络在深度学习、网络分类和本体映射中的应用。在下一章中,我们将通过实际网络示例更深入地探讨 igraph 和 NetworkX。
参考文献
Aganze, E., Kusinza, R., & Bukavu, D. R. (2020). 刚果民主共和国当前虚假新闻的状况及其社会影响。全球计算机科学和技术杂志。
Aric A. Hagberg, Daniel A. Schult 和 Pieter J. Swart “使用 NetworkX 探索网络结构、动态和功能”。在第七届 Python 科学会议(SciPy2008)的论文集中,Gäel Varoquaux,Travis Vaught 和 Jarrod Millman(编),(Pasadena, CA USA),第 11–15 页,8 月 20 日。
Berge, C. (2001, 1 月 1 日)。图论。Courier Corporation。
BRANDES, U., ROBINS, G., McCRANIE, A., & WASSERMAN, S. (2013, 4 月)。什么是网络科学?网络科学,1(1),1–15。
Csárdi G., Nepusz T. 复杂网络研究的 igraph 软件包。InterJournal Complex Systems,1695,2006。
Ducruet, C., & Beauguitte, L. (2014)。空间科学和网络科学:复杂关系的回顾和结果。网络与空间经济学,14(3-4),297-316。
Estrada E. 复杂网络的架构:理论与应用。OUP Oxford,2012。
Fung, I. C. H., Fu, K. W., Chan, C. H., Chan, B. S. B., Cheung, C. N., Abraham, T., & Tse, Z. T. H. (2016)。社交媒体对 2014 年 8 月埃博拉病毒信息和不实信息的初始反应:事实与谣言。公共卫生报告,131(3),461-473。
Hagberg, A., & Conway, D. (2020). Networkx:使用 Python 进行网络分析。github.com/networkx。
Kim, M., & Sayama, H. (2017). 利用网络科学预测股市波动:一种信息论方法。应用网络科学,2(1),1-14。
Kiss, I. Z., Miller, J. C., & Simon, P. L. (2017). 网络上的流行病学数学。Cham: Springer,598,31。
Mehler, A., Lücking, A., Banisch, S., Blanchard, P., & Job, B. (Eds.). (2016). Towards a theoretical framework for analyzing complex linguistic networks (pp. 3-26). Berlin: Springer.
Mocanu, D. C., Mocanu, E., Stone, P., Nguyen, P. H., Gibescu, M., & Liotta, A. (2018). Scalable training of artificial neural networks with adaptive sparse connectivity inspired by network science. Nature communications, 9(1), 2383.
Valente, T. W. (2005). Network models and methods for studying the diffusion of innovations. Models and methods in social network analysis, 28, 98-116.
第三章:使用 NetworkX 和 igraph 将数据整理成网络
在本章中,我们将介绍在分析项目中常见的多种数据类型,包括 NetworkX 和 igraph 包。
在本章和接下来的章节中,我们将考虑许多现实世界的问题,以建立关于可以重新格式化和作为网络科学问题进行分析的数据的直觉。通常,基于网络的算法在计算成本上低于为时间序列分析或空间数据设计的算法。到本章结束时,你将能够识别许多适合网络分析的问题类型,并且你将准备好深入到后续章节中的问题。
具体来说,本章将涵盖以下主题:
-
不同数据源的介绍
-
使用 igraph 将数据整理成网络
-
使用 NetworkX 的社交网络示例
技术要求
要运行本章中的实际示例,你需要熟悉 Python 编程,并且必须安装 igraph 和 NetworkX Python 包。
本章的代码可在以下链接找到:github.com/PacktPublishing/Modern-Graph-Theory-Algorithms-with-Python
不同数据源的介绍
在实践中,我们很少从头创建网络或遇到自然以网络形式出现的数据源。我们通常必须从不同的数据源创建网络,包括调查或传感器数据、地理数据、时间序列数据、人口数据,甚至机器学习模型的输出数据。在本节中,我们将在深入研究 igraph 和 NetworkX 的数据整理两个实际示例之前,概述一些常见的数据源。让我们深入了解我们的第一个数据源,社交互动数据。
社交互动数据
网络科学的大部分起源于社交网络,它捕捉了个人之间的关系或互动。营销活动通常会招募那些在感兴趣的人口群体中与其他人有很多联系的个人,以及那些他们的联系人也同样在人口群体中有许多联系的人。例如,一个玩具制造商可能会在圣诞节季节推出一款新玩具,可能是一款蒸汽朋克坚果夹子芭蕾鼠王玩偶(如图 2.1 所示),他们希望通过市场研究来确定哪个年龄和性别群体最有可能看到《胡桃夹子》芭蕾舞剧:

图 2.1 – 在圣诞节期间首次亮相的新鼠王玩偶的营销广告
玩具制造商可能会寻找社交媒体影响者(在 YouTube 上有许多订阅者或在 TikTok 上有许多追随者的人),他们的观众网络主要包括 5 至 11 岁的女孩,她们正在欧洲观看影响者的内容。有时,这些数据可以通过抓取影响者的内容轻松获得。在其他时候,需要收集这些数据的一部分并首先进行分析,通过内容策划和相关内容指标的抓取,来缩小目标受众群体中的影响者。
社交网络构建的另一个常见数据来源是调查数据,其中个人对社交群体中的朋友关系或互动模式进行排名。例如,学生可能会指出他们一起学习、社交或上课的其他学生。在许多场合互动的学生之间有更强的社交互动,而在某些场合很少互动或只在特定场合互动的学生之间有较弱的社交互动。加权社交网络不仅可以可视化存在的互动,还可以可视化它们的强度。在社会科学环境中,较强的联系在信息传播或产品或行为的采用中通常扮演着重要角色。例如,当一个青少年开始吸烟或饮酒时,与该个体有强烈联系的人开始这些行为的风险更高。在高度连接的青少年群体中,当一个人采取风险行为时,该行为在群体中传播的风险很高。
弱社交关系可能和强社交关系一样重要(甚至更重要!),在社会学领域,这些关系构成了个人社会资本的基础。社会资本衡量的是个人在需要时可以从与之联系或与个人联系的人那里获取的资源。在求职的背景下,求职者最强和最持久的联系可能不是找到新工作所需要的。然而,朋友的朋友和熟人可能形成一个更大的社交网络,这些联系可能为求职者提供新的就业机会。朋友的朋友和偶然熟人的更大网络通常提供了更多通过口头传播或社交媒体上的职位广告找到下一份工作的机会。
我们将在本章的使用 igraph 将数据整理成网络部分回到基于调查的社交网络数据,在那里我们将根据社会背景中的推荐互动构建一个学生网络。
空间数据
网络数据的另一个常见来源是从地理信息系统收集的数据或按地理组织的数据。空间数据分析是数据科学的一个分支,它分析基于地理的数据;然而,当数据覆盖较大的地理区域或涉及复杂的统计计算时,用网络科学的术语来表述数据和问题可能更容易。网络算法通常比空间数据算法更快,并且很容易在图数据库(如 Neo4j)中存储大型网络。
考虑 COVID-19 通过旅行网络在全球范围内的传播。这场大流行起源于中国,但很快通过感染但病情并不严重的个体在飞机、火车和其他交通工具(如北京到巴黎的航班,如图 图 2**.2 所示)上的旅行迅速传播到亚洲的其他部分以及世界的其他地方。航空旅行还允许在疫情期间将新的变异株从一个大陆传播到另一个大陆。幸运的是,COVID-19 的死亡率较低,大多数感染者并未出现严重疾病。然而,一种与 COVID-19 类似但死亡率高且从感染到症状出现有较长的潜伏期的极高度传染性疾病(如更易传染的埃博拉病毒)通过相同的旅行网络传播,在被发现之前将造成非常严重的全球卫生危机。正如我们在后面的章节中将会看到的,具有空间和社会成分的流行病威胁可以通过网络科学进行建模和模拟。

图 2.2 – COVID-19 初期从北京到巴黎的航班
与健康相关的网络并不是数据科学中唯一有用的空间数据来源。空间数据的一个常见来源是零售数据,其中商店存在于不同的位置,可能携带不同的产品,以不同的速度销售产品,并调整价格以符合地区规范。顾客的人口统计特征也可能在不同地点有显著差异,并产生非常不同的购买模式。例如,考虑大学附近的商店与郊区商店的顾客购买行为。大学附近的商店可能有更多夜间购买,销售大量零食,并且相对于郊区的商店,很少需要库存尿布。分析顾客的购买行为、商品定价或产品库存频率,可以为客户提供宝贵的战略洞察,这些客户和他们的母公司对优化库存、价格和促销时间感兴趣。我们将在本章后面将有关当地市场小米价格的数据整理成网络。
时间数据
网络很少是静态的。随着时间的推移,随着联系的形成和断裂,社交网络会发生变化。销售模式会随着新产品的添加而改变,对特定商品的需求会随着季节的变化而变化,或者经济的变化会促使消费者行为的变化。随着政治和商业气候的变化,股市交易量和行业/地区相关性也会随时间变化。
所有这些变化都涉及数据中的时间成分。有几种方法可以模拟网络中的时间趋势,我们将从两个用例开始,并在本书的第三部分中构建更多用途。
首先,让我们回到我们之前提到的例子,一个求职者利用他的社交网络来寻找新工作。当这个人开始找工作时,他们可能会在 LinkedIn 上添加建议的专业联系人,参加当地的社交活动,或者与一些正在招聘的招聘人员建立联系;所有这些行为都会增加他们的社交网络中的联系(并增加找到新工作的可能性)。图 2.3展示了女性在社交活动中相遇,建立新的专业联系,以便在求职过程中利用:

图 2.3 – 8 周内不断变化的社会网络
我们可以将时间上的变化表示为一系列网络,每个网络代表我们在特定时间捕捉到的求职者的社交网络。我们可能每天、每周甚至每月收集我们感兴趣分析期间的数据。假设我们每周收集两个月的数据。这将给我们大约八个社交网络,我们可以分析和总结这些网络,以跟踪网络大小和连接密度随时间的变化。也许我们还有与求职者获得的面试相关的数据,我们可以将这些数据与他们的社交网络变化一起检查,以了解社交网络的增长是如何帮助求职者获得新工作的。
为了研究社会联系和特定活动如何增加获得面试和工作的可能性,我们可以招募几百名求职者,每周收集关于面试/工作机会以及他们当前社交网络的信息,持续八周,并建立一个回归模型,根据前一周的社交网络指标来预测面试或工作机会。在更复杂的分析中,我们可以使用包含时间序列成分的回归模型来考虑时间效应,以及社交网络指标和求职者的初始数据(如人口统计数据、职业信息、教育背景等)。我们将在本书的第十三章中考虑这种类型的模型。第十三章。
空间数据也可以包括时间成分,例如在两国之间增加新的航班,或者商店的管理结构随时间变化,从而在零售连锁店内的商店之间创建不同的连接。我们已经看到我们如何将空间数据整理成网络。对于时空数据,我们可以在我们采样数据的某个时刻构建网络(如我们的工作网络示例),或者我们可以将我们的数据分成时间段,为每个时间段创建网络,然后在我们的分析中考虑完整的网络系列。在零售店例子中,我们可能会有实时购买行为,将其解析成每周趋势网络,其中商店根据销售相似性连接,基于整个库存的商店对的销售。我们可能对分析 12 月份的购买趋势变化感兴趣,当人们庆祝新年、圣诞节、光明节、库萨和年底的商业交易时。我们将在使用 igraph 将数据整理成网络的例子中考虑这一点。
生物网络
网络科学在现代基因组学研究中的作用突出。环境因素,如压力或饮食习惯,可以通过使一组基因的转录更有可能或不太可能来修改细胞或组织中表达的基因,导致通过将遗传密码翻译成核糖核酸(RNA)然后到蛋白质产生更高或更低的蛋白质水平(图 2**.4):

图 2.4 – 一个展示基因表达、转录和翻译成蛋白质的过程的图表
让我们考虑一个具体的例子。眼镜蛇是有毒的蛇,它们的 DNA 编码与毒液生产相关的基因。这些基因的转录发生在产生并储存毒液的毒腺中,直到蛇攻击目标。这些基因的编码被转录成 RNA,然后翻译成蛋白质。
一起转录的基因集被称为共表达;共表达网络有助于理解遗传因素与疾病或身体特征之间的关系。在我们的蛇毒例子中,编码毒液的基因会在毒腺中共同表达,因为所有的毒液都是在蛇身体的那一部分产生的。环境因素可以通过修改 DNA 结构来间接影响基因的表达模式,以上调或下调转录。例如,当我们的蛇为了自卫而咬人时,它可能会通过咬伤将毒腺中的毒液完全排空。这将导致与毒液基因相关的 DNA 被上调,从而允许产生更多的毒液来补充蛇的供应,以便它可以进食和自卫。
表观遗传学领域研究这些基因-环境相互作用,尤其是在癌症或心理健康障碍等复杂疾病的发展中。通常,通过使用某种微阵列芯片测量感兴趣基因上的蛋白质结合来衡量组织内或组织间的基因表达。许多人类疾病涉及的环境和基因的相互作用比蛇毒腺中毒素水平调节更为复杂;其中一些疾病涉及身体许多部位。
例如,有些人基于他们的遗传风险因素聚集,面临更高的酒精使用障碍风险;当有酒精使用障碍风险的人开始饮酒时,酒精会穿过血脑屏障,并在基因表达上产生表观遗传变化,包括将个人置于疾病风险中的基因表达变化。微阵列通过实验测量基因表达水平。对有酒精使用障碍和无酒精使用障碍的人的基因共表达进行微阵列研究,可以深入了解遗传风险和由于酒精消费而发生的表观遗传差异。网络提供了一种方便的方法来总结表达相似性关系,并且可以挖掘与执行相似任务(如产生与血清素或多巴胺结合的突触结合位点)的相关基因模块的子网络。
在遗传研究中,一个相关的现象是通过表观遗传途径调节基因表达。正如我们讨论的,外部环境因素可以影响基因表达;通常,由基因转录和翻译产生的蛋白质调节其自身的转录,根据现有蛋白质的水平提高或降低表达。例如,与额叶皮层中的血清素受体相关的基因调节中断被认为是大抑郁症的基础,而细胞生长基因下调的中断被认为导致了许多常见的癌症途径,导致无控制的生长和有丝分裂(肿瘤)。
定向网络提供了一种总结基因调节途径的理想方式。不同的生物学和环境机制上调或下调感兴趣的基因。基因可能在研究机制(蛋白质表达、环境中的外部暴露等)中聚集成相似的调节模式。这为特定感兴趣的病理学或环境因素(如压力)的影响提供了见解。
基因组学研究有时会利用网络科学将基因本体(总结单个基因或基因模块的层次关系的网络)映射到疾病本体(总结疾病类别的网络)。我们将在第十一章中深入探讨本体研究,但在此我们先回顾一些基础知识。本体之间的映射使得研究人员可以根据已知基因与类似疾病之间的联系,基于已知基因与疾病之间的联系来提出关于未知遗传与疾病之间联系的假设。回到物质滥用障碍,许多遗传风险因素是已知的,并且在各种成瘾中共享;新出现的行为成瘾,如游戏成瘾,很可能与其他成瘾障碍共享至少一些这些遗传因素。基因与疾病之间的本体映射为研究这些新障碍提供了一个起点。
基因组学是许多类型的数据之一,在这些数据中,网络解决方案并不是解决数据问题的明显工具集。让我们看看一些其他例子,在这些例子中,网络科学提供了其他分析工具无法提供的见解。
其他类型的数据
存在许多其他数据来源,并且大多数都可以被整理成网络形式。让我们回到我们对深度学习的讨论。在深度学习的训练过程中,神经网络每一层的节点根据每次训练迭代的拟合度量与其他层的节点建立和断开连接。让我们考虑一个包含四个训练周期的非常小的前馈神经网络,该网络具有两个节点的输入层、三个节点的隐藏层和两个节点的输出层,最初是一个全连接网络,经过两个周期的剪枝,然后在隐藏层和输出层之间恢复一个剪枝的连接,如图 图 2.5 所示:

图 2.5 – 简单深度学习模型在训练周期中的演变
在 图 2.5 中,我们可以看到每个训练周期在深度学习模型中都有不同的网络结构。通常,我们会为每个周期计算拟合统计量,也许我们感兴趣的是深度学习网络结构的属性如何影响训练和测试集在各个周期中的训练精度。虽然这个模型相当简单,但在实践中,深度学习模型可能有多个层,顶点(在深度学习术语中称为节点)之间的有向边,以及许多个训练周期。这为训练过程中与模型精度相关的一系列网络和网络度量提供了丰富的数据,这可能有助于调整模型或更改初始参数(例如,在微调预训练的转换器模型时调整剪枝参数)。
在计算机视觉和大型语言建模中,微调预训练模型是一种常见的方法。可能需要添加新的训练数据以覆盖特定领域的用例,并且需要调整模型参数以将新的训练数据纳入完整模型。例如,托管在 HuggingFace 上的大型语言模型可能非常适合嵌入用于聚类分析的多数科学论文,但当等离子体物理论文包含在科学论文样本中时,可能需要微调才能良好工作。理解原始大型语言模型的网络结构和其训练演化可以帮助研究人员在微调过程中设置最佳参数。
另一个可以将数据整理成网络形式以进行研究的数据示例是语言学数据。今天存在的许多语言都是从更古老的语言演变而来的。例如,今天存在的闪米特语言,包括希伯来语和阿拉伯语,起源于原始闪米特语,随着原始闪米特语使用者在中东地区迁移和定居,分化成了不同的地区分支。一种语言,东闪米特语(阿卡德语)没有进一步分化成其他语言;另一种语言,西闪米特语,分化成了南闪米特语和南中闪米特语(随着时间的推移进一步分化成新的语言)。图 2.6展示了原始闪米特语向新的语言群体演化的初始过程:

图 2.6 – 从原始闪米特语到早期语言演化的示意图
网络科学可以帮助我们通过分析语言家族层次结构,比较从原始语言到现代语言的演变。比较语言演化的结构可以阐明古代迁移和贸易模式,这些模式可能难以从古代记录或考古遗址中辨别出来。此外,这种比较使我们能够根据语言家族的过去行为、在其他语言家族中观察到的类似演化模式、语言使用模式的社会语言学数据以及当前克里奥尔语或方言的使用范围,预测未来的语言分化。我们将在第十一章中回到语言学的应用,我们将考虑非洲使用的语言及其随时间的演变。
现在,让我们将注意力转向从原始数据文件中创建网络,这是 igraph 和 NetworkX 的功能。这将使我们能够创建网络,以便在接下来的章节中介绍的工具中进行分析。首先,我们将考虑一个涉及时空数据的示例:布基纳法索省级市场的季度小米价格。
使用 igraph 将数据整理成网络
理解商品定价的趋势在许多应用中至关重要。例如,一家加油站连锁店可能希望了解其各个地点之间的定价差异。通常,当地法律要求彼此相距一定距离的加油站定价在彼此的一定范围内,从而在连锁店和连锁店内部形成定价的本地分布。了解这一点可以帮助在各个地区的限制条件下优化价格,或者将数据回溯到区域销售数据,以查看价格分布如何影响销售。
消费者还可以从不同地理区域的商品定价分析中受益。以发展中国家的地方食品市场为例。价格通常不会在一个国家或地区内固定。它们由商品的供应、需求和销售商的成本决定。谷物可能需要从其他国家进口,其价格会随着经济和气候条件的变化而波动。水果的价格可能会随着季节和当地生长条件的变化而变化。当当地地区的染料变得稀缺时,服装的价格可能会上涨。例如,考虑一家连锁超市,如图 2.7所示,它有供应商合同和母公司的财务支持。它可能会经历商品可用性或价格的波动,但很可能会以价格波动不大的相同商品出售:

图 2.7 – 一家连锁超市的插图,是该更大连锁店的一部分
与此相比,一个由不同供应商组成的本地市场,这些供应商可能或可能不在某一天的市场上,他们的商品可用性和价格可能在市场销售的那天波动。较大的市场,如图 2.8所示,有更多经验丰富的供应商和高峰时段,可能比整天沿街排列的更非正式的市场显示出更少的波动。

图 2.8 – 布基纳法索一家大型、正式市场的插图,其中供应商和他们的商品每天都有一些共同之处
当考虑地理因素时,我们通常不仅想要考虑感兴趣的变量,还要考虑这些位置相对于彼此的接近程度。邻近地区的价格、销售和商品可用性可能反映了数据集中未观察到的本地条件,例如当地天气、当地政治环境和竞争性本地商家的数量。我们将在第三章、第四章和第五章中进一步讨论这个话题,但到目前为止,了解我们可以根据它们相对距离为不同位置分配权重就足够了。
在处理空间数据时,还需要考虑的一个因素是选择的度量标准。存在许多空间统计度量,那些熟悉空间数据分析的读者可能希望使用比本文中考虑的更复杂的度量。局部莫兰统计量是空间数据分析中的一个常用指标,它以成对的方式汇总空间区域之间的权重和一个定义在数据上的函数;在这里,我们使用我们定义的权重矩阵和相关函数构建统计量,这些函数应该对读者来说作为数据点相似性的总结统计量是熟悉的。
让我们深入研究我们的示例数据集,该数据集来自世界粮食计划价格数据库中的人道数据交换的布基纳法索 – 食品价格数据集(data.humdata.org/dataset/wfp-food-prices-for-burkina-faso; 访问日期:2022 年 7 月 15 日)。在这个数据集中,我们预先选择了 45 个布基纳法索省份市场的黍米价格,并按季度汇总数据,从 2015 年第二季度开始,到 2022 年第二季度结束。这个时期涵盖了 COVID-19 大流行和乌克兰战争的开始,这两者都影响了供应链。鉴于邻近省份的市场可能受到相同的地方因素和供应链的影响,我们创建了一个由 1 和 0 组成的空间权重矩阵,分别代表相邻省份和非相邻省份。
要运行所有代码,可能需要安装其他包,这些包是igraph或NetworkX的依赖项,例如用于可视化的pycairo。如果你在使用云平台,每台机器可能功能不同,或者已经安装了其他包;如果你遇到任何困难,请咨询 igraph 或 NetworkX 帮助指南中关于在您的操作系统上运行这些包的建议。
让我们首先通过Script 2.1导入构建我们网络所需的包:
#import packages
import igraph as ig
from igraph import Graph
import numpy as np
import pandas as pd
import os
当导入数据时,你需要在下载数据集后指定自己的文件路径。我们通过向Script 2.1中添加来从本地机器导入定价数据和权重矩阵:
#import Burkina Faso market millet prices from the csv file
File="C:/users/njfar/OneDrive/Desktop/BF_Millet.csv"
pwd=os.getcwd()
os.chdir(os.path.dirname(File))
mydata = pd.read_csv(os.path.basename(File),encoding='latin1')
#import weight matrix of Burkina Faso markets
File="C:/users/njfar/OneDrive/Desktop/weights_bk.csv"
pwd=os.getcwd()
os.chdir(os.path.dirname(File))
weights = pd.read_csv(os.path.basename(File),encoding='latin1')
现在我们已经导入了数据,我们可以通过计算市场间的相关系数(忽略时间指示列)并将结果乘以权重矩阵来构建我们的局部莫兰统计量:
#define the metric between markets and construct the local Moran #statistic
#here, correlation coefficient
data=mydata.iloc[:,1:46]
weights_total=weights.iloc[:,1:46]
cor=np.corrcoef(data.transpose())
cor[cor>0]=1
cor_weighted=np.multiply(cor,weights_total)
现在我们已经构建了局部莫兰统计量作为cor_weighted,我们可以使用 igraph 将我们的数据转换成一个网络。我们的图没有关系方向性,因此我们可以将模式设置为undirected。然而,因为我们的相关性包括单个市场内的自相关,我们需要从我们的网络中移除循环。我们将通过定义可能的自循环并将其从边列表中删除来实现这一点:
# create market graph and get rid of loops created from the correlation
bf_market_w=Graph.Adjacency(cor_weighted,mode="undirected")
edge_list=bf_market_w.get_edgelist()
self_loop=[]
for i in range(0,46):
self=(i,i)
self_loop.append(self)
to_remove=[]
for i in edge_list:
for j in self_loop:
if i==j:
to_remove.append(i)
bf_market_w.delete_edges(to_remove)
现在,我们可以通过绘制我们的结果来可视化我们的网络,以查看哪些市场被隔离:
#create plot
ig.plot(bf_market_w)
这应该会显示一个图表,展示一个孤立的市场和几个区域连接的市场:

图 2.9 – 布基纳法索市场通过局部莫兰统计连接的图表
图 2.9 显示许多市场形成了区域集群,其中相邻省份的价格相关。有一个市场是孤立的。大多数市场连接成三或四个市场的群体。一个地区包含六个区域连接且与定价趋势相连的市场。很可能,这个网络可视化的是区域连接性,而不是价格相关性和区域的混合。我们可以通过在计算局部莫兰统计之前应用阈值来可视化高度相关的区域。
让我们将相关阈值设置为 0.9(价格高度相关)通过修改 脚本 2.1 以包括局部莫兰统计计算中的阈值:
#define the metric between markets and construct
#the local Moran statistic here, correlation coefficient
data=mydata.iloc[:,1:46]
weights_total=weights.iloc[:,1:46]
cor=np.corrcoef(data.transpose())
cor[cor>=0.9]=1
cor[cor<0.9]=0
cor_weighted=np.multiply(cor,weights_total)
# create market graph and get rid of loops created from the #correlation
bf_market_w=Graph.Adjacency(cor_weighted,mode="undirected")
edge_list=bf_market_w.get_edgelist()
self_loop=[]
for i in range(0,46):
self=(i,i)
self_loop.append(self)
to_remove=[]
for i in edge_list:
for j in self_loop:
if i==j:
to_remove.append(i)
bf_market_w.delete_edges(to_remove)
#create plot
ig.plot(bf_market_w)
这应该会产生更多孤立的市场,这些市场在我们的时间范围内相关性不高:

图 2.10 – 布基纳法索市场通过局部莫兰统计在选定的阈值 0.9 下的连接图表
图 2.10 显示了一个更稀疏的网络,其中许多市场是孤立的。一些原本区域连接的市场仍然显示出市场间的连接;然而,许多市场不再相互连接。有趣的是,我们的六个区域市场群在阈值化后仍然保持着大部分连接。实际上,该区域只有一个市场在连接性方面与我们的非阈值版本有所不同。
虽然这个示例考虑了整个时间跨度的相关性,但可以将时空数据切割成重叠的时间切片,创建时间感知的指标,如局部莫兰统计(带或不带阈值),并通过绘制一系列由这些时间切片及其网络定义指标创建的网络来可视化这些指标随时间的变化。我们将在 第七章 中进一步探讨这个概念,届时我们将布基纳法索的小米数据集切割成时间切片,以分析随时间和空间变化的图指标。
现在我们知道了如何将数据整理成 igraph 网络,让我们通过另一个示例来看看 NetworkX 是如何做到这一点的。
使用 NetworkX 的社交网络示例
在这里,我们将考虑从 2022 年在喀麦隆的一个班级收集的非洲数学科学研究所(AIMS)学生的社交网络。这个项目中的学生住在同一栋楼里,在课堂上互动,一起吃饭,一起学习。然而,来自同一国家、来自同一本科大学和说同一种语言的学生往往比来自不同背景的学生互动更频繁。如图 图 2.11 所示的这种互动要么是作为背景的有机功能,要么是通过共享项目和住宿安排的人工方式发生的:

图 2.11 – 描绘课堂环境的插图,其中学生在项目内共享课程
为了理解我们学生群体中的这些互动,我们进行了一项关于在各种环境中与其他学生互动的调查问卷。数据收集于 2022 年 11 月至 12 月之间。以下是一些示例问题:
-
你午餐或晚餐时喜欢和谁坐在一起?
-
当你在某个科目或课程中遇到困难时,你喜欢向谁提问?
从这些问题中,我们可以检查学生对他们网络的看法,以了解他们同意的程度。在查看数据后,我们发现大多数互动都是相互的。如果 学生 A 批准了与 学生 B 的亲近程度调查项,那么 学生 B 很可能也会批准这些项。因此,这些数据形成了一个相互互动的无向网络。
我们将使用的数据集包括几个字段。在第一列中,我们有被调查学生的姓名。在接下来的四列中,我们有包括原籍国、年龄、研究领域和本科背景的人口统计因素(我们将在后面的章节中返回),在剩余的五列中,我们有五个学生最强烈推荐的朋友。
让我们首先导入我们将需要的包,以便使用 Script 2.2 将此数据集整理成网络:
#import needed packages
import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
import math
现在,让我们导入数据集:
#reading the dataset
fichier = pd.read_csv("C:/users/njfar/OneDrive/Desktop/AIMS_data.csv")
data = pd.DataFrame(fichier)
要将此数据转换为使用 NetworkX 的社交网络,我们需要通过循环填充我们的网络,包括顶点和边。我们首先添加包含学生姓名和人口统计特征的顶点元数据。然后,我们将根据特定学生在调查中支持的五个最接近的关系添加边来连接顶点,具体操作如下 Script 2.2:
#intializing the social network
aimsNetwork = nx.Graph()
#populating the network with nodes and edges
for i in range(len(data["Name"])) :
aimsNetwork.add_node(data["Name"][i],
Age = data["Age"][i], country=data["Country"][i],
Field=data["Field"][i],
background=data["Background"][i])
for j in range(len(data["Name"])) :
aimsNetwork.add_edge(data["Name"][j],data["Friend 1"][j])
aimsNetwork.add_edge(data["Name"][j],data["Friend 2"][j])
aimsNetwork.add_edge(data["Name"][j],data["Friend 3"][j])
aimsNetwork.add_edge(data["Name"][j],data["Friend 4"][j])
aimsNetwork.add_edge(data["Name"][j],data["Friend 5"][j])
这为我们提供了 AIMS 学生及其在项目中的最亲近朋友的基本网络。让我们绘制这些数据来可视化 AIMS 学生的社交网络。因为我们想在图中显示学生的名字,所以我们首先计算每个顶点的度数,这是一个我们将在后面的章节中重新讨论的中心性度量。在这里,我们只需展示不同学生对网络的重要性,并允许顶点足够大,以便可视化学生的名字。我们可以通过向 Script 2.2 添加以下内容来实现这一点:
#plot AIMS student social network
Degree=aimsNetwork.degree()
var = [500*k[1] for k in list(Degree)]
plt.figure(figsize=(20,20))
nx.draw_spring(aimsNetwork, font_size=10, node_size = var,
with_labels=True, node_color="red")
plt.show()
此脚本应显示与 图 2.12 类似的图像,该图像绘制了 AIMS 学生之间的社交联系:

图 2.12 – AIMS 喀麦隆 2022 年学生社交互动网络图
图 2.12 展示了我们根据调查数据创建的 AIMS 学生网络。请注意,一些学生只有五个最亲近的朋友作为连接,而其他人则有更多亲近的朋友。这在社交网络中很典型,即使是基于调查数据创建的。有些人比其他人有更多的连接。有些人连接到网络的各个部分,将分离的社区联系起来。一些高度连接的个人连接到其他高度连接的个人,在更大的网络中形成密集的区域。这些特性在网络分析中起着重要作用,我们将在后面的章节中深入探讨它们的含义和计算。
摘要
在本章中,我们更深入地探讨了网络的应用案例,将空间市场数据集整理成基于区域连通性和高粱价格相关性的网络,并在 NetworkX 中构建了一个基于调查的社交网络。现在,我们已经拥有了从真实数据源构建网络所需的基本工具,在下一章中,我们可以将注意力转向网络科学的实际应用,在那里我们不仅构建网络,还分析它以获得解决当今科学中重要问题的见解。
参考文献
Berger, S. L., Kouzarides, T., Shiekhattar, R., & Shilatifard, A. (2009). 表观遗传学的操作定义. 基因与发育, 23(7),781-783.
Caballero, J. (2015). 银行危机和金融一体化:网络科学视角的见解. 国际金融市场、机构和货币杂志,34,127-146.
Christakis, N. A., & Fowler, J. H. (2013). 社会传染理论:动态社交网络和人类行为的考察. 统计医学,32(4),556-577.
Dubos, R. (2017). 社会资本:理论与研究. 路透社.
Ducruet, C., & Beauguitte, L. (2014). 空间科学和网络科学:复杂关系的回顾和结果. 网络与空间经济学,14(3-4),297-316.
Kiss, I. Z., Miller, J. C., & Simon, P. L. (2017). 网络流行病的数学. 沙夫豪森:斯普林格,598,31.
Krishnan, H. R., Sakharkar, A. J., Teppen, T. L., Berkel, T. D., & Pandey, S. C. (2014). 酒精成瘾的表观遗传景观. 国际神经生物学评论, 115, 75-116.
Moyano, L. G. (2017). 学习网络表示. 欧洲物理期刊特别专题, 226(3), 499-518.
Sharma, S., Kelly, T. K., & Jones, P. A. (2010). 癌症中的表观遗传学. 癌变, 31(1), 27-36.
Sorrells, T. R., & Johnson, A. D. (2015). 理解转录网络. 细胞, 161(4), 714-723.
第二部分:空间数据应用
第二部分 在第一部分的基础上,介绍了空间数据应用,包括趋势在非洲国家间的传播、学生网络间的疫情传播、涉及道路和兴趣点的交通物流问题、国家公园不同区域的蛇类保护,以及基于文本的城市公园评估聚类。本部分介绍了流行病(以及更一般的微分方程)模型、最短路径算法、旅行商问题解决方案、最小割/最大流算法、谱图算法和预训练的转换器模型。
第二部分 包含以下章节:
-
第三章,人口数据
-
第四章,交通数据
-
第五章,生态数据
第四章:人口统计数据
在本章中,我们将使用社会数据来分析跨越国家的文化趋势以及通过非洲数学科学研究所(AIMS)学生群体传播的流行病。这些学生群体首次在第二章中介绍。我们将看到文化相似性、地理和共享的社会特征如何创造人与人、人与地点之间的联系,从而影响网络结构。我们还将介绍一些在网络上常见的重要结构。最后,我们将通过我们的文化趋势和流行病传播示例来探讨思想和疾病的传播如何受到网络结构的影响。
到本章结束时,你将了解社会因素如何影响社会联系的形成,思想和疾病的传播如何受到网络结构的影响,以及如何在绘制的网络中识别重要特征。我们将在后续章节中继续探讨这些观点。现在,让我们来看看人口及其定义特征。
具体来说,本章将涵盖以下主题:
-
人口统计学简介
-
法语非洲音乐传播
-
AIMS 喀麦隆学生网络流行病模型
技术要求
你将需要 Jupyter Notebook 来运行本章中的实践示例。
本章的代码可在以下链接获取:github.com/PacktPublishing/Modern-Graph-Theory-Algorithms-with-Python
人口统计学简介
人口统计学,最初被定义为对人口生命统计的研究,衡量感兴趣的人口中的个体特征。关于人口的生命记录对于制定公共政策、流行病追踪、城市规划以及许多其他对基础设施和增长至关重要的政府任务至关重要。约翰·斯诺在 1854 年伦敦霍乱爆发期间开创了人口统计学领域,通过绘制地理数据和感染个体的共同特征来确定霍乱爆发的源头(一个水泵)。从那时起,人口统计学在医学研究、政策规划、教育改革以及其他社会科学应用于社会需求的应用中发挥了重要作用。
在本章中,我们将介绍人口研究的一些重要方面以及我们如何通过基于共享地理和人口因素的边来连接顶点来创建网络,从而使用共享的地理和人口因素来创建网络。
人口因素
人口统计学为我们提供了许多潜在的测量方法来研究人口及其小组成员,从而让我们能够推断出这些人口和小组成员之间可能存在的社会联系。例如,我们可能希望了解在卢旺达基加利、印度班加罗尔或中国西安等城市,在一段城市增长期间,性别、教育成就、宗教、社会经济地位或国籍的分布情况。通常,我们通过简单的图表来展示随时间的变化,如图 图 3**.1 所示,它描绘了卢旺达宗教构成 30 年的变化:

图 3.1 – 1993 年与 2023 年卢旺达宗教归属对比图
人口统计学因素随着人口变化而变化,它们在人口内部的不同小组成员之间也有所不同。虽然个人可能共享诸如年龄、性别和教育水平等人口统计学因素,但他们的兴趣、个性和成长环境可能使他们进入更大人口中的不同文化小组成员,例如在南非开普敦。杰斯可能会倾向于朋克摇滚音乐和文化。达拉可能喜欢社交和派对。 Sadako 和 Brigette 可能喜欢自然和艺术追求:

图 3.2 – 来自城市不同小组成员的四个年龄、社会经济地位和教育背景相似的年轻女性
虽然这些年轻女性有一些人口统计学因素,使她们在城市中相遇并形成社会联系的可能性增加,但她们所属的小组身份使得喜欢派对的酒吧女招待不太可能与自己制作衣服以反映自然的艺术女孩建立友谊。然而,如果这四位年轻女性移居到阿联酋迪拜,她们在外国同一城市共同成长的环境使她们在共同探索新国家时相遇并建立友谊的可能性增加。
在大多数情况下,人口统计学因素在社交关系的形成中发挥作用,但它们并不保证这些联系的存在。然而,在没有关于友谊的调查或我们可以抓取的社会媒体数据的情况下,人口统计学因素为共享共同背景的个人之间可能存在的联系提供了证据。我们将在本章后面创建一个新的基于人口统计学因素而不是学生之间认可互动的 AIMS 喀麦隆学生网络时回到这个概念。
地理因素
地理在确定社交关系的形成和可能性方面也起着重要作用。在同一地区的人更有可能在同一餐馆吃饭、在同一地区徒步旅行和加入基于地区的兴趣小组时相遇。例如,考虑三个区域——一个有更大房屋和郁郁葱葱院子的郊区环境、一个人口密集的城市和一个房屋很少的非常乡村社区(如图 3.3 所示):

图 3.3 – 三种不同地理区域的示意图
也许图 3.3 中显示的区域都位于比利时,使他们拥有共同的国家文化。虽然我们预计图 3.3 中每个地理区域内的个体之间形成社交关系的可能性高于跨区域,但这些比利时地区的社交关系更有可能形成,而不是与图 3.4 中显示的内罗毕或德黑兰的个体形成社交关系:

图 3.4 – 分别展示内罗毕和德黑兰的女性
在国家、城市或邻里层面共享地理的人更有可能通过区域互动相互了解。然而,一个在布鲁塞尔的研究人员可能通过学术会议或专业社交媒体平台,如ResearchGate或LinkedIn,遇到内罗毕或德黑兰的研究人员。全球经济和全球社交媒体平台的兴起减弱了地理对社交关系的影响,但仍然更有可能的是,同一地理区域内的人会形成社交关系,尤其是在他们共享人口统计特征的情况下。
然而,全球化,尤其是对于受过教育的专业人士来说,已经改变了社交关系的形成过程,对于那些研究专业人士社交网络的人来说,考虑与该职业相关的其他人口统计因素,而不仅仅是考虑地理,是明智的。COVID-19 大流行及其随后在线/混合工作、会议和网络活动的兴起,使许多专业人士的社交网络超越了本地地理。尽管如此,那些在地理上具有共同背景的人往往拥有共同的文化,这使得即使在疫情之后涉及的地理发生了变化,这些关系也更有可能形成。
网络中的同质性
正如我们所看到的,人口统计和地理因素驱动着人群中个体之间的联系。随着知识经济的兴起,大多数地理区域都专注于某些人口统计因素,因为人们选择与那些在相同地区工作、财富水平相似、来自相似教育背景的人一起生活。相似的人更有可能相遇,更有可能结婚,更有可能属于同一个群体。
让我们考虑三个年轻的女性(马里科、瑞伊和绫子),她们在日本的津和野,年龄组相同,教育水平相似,并来自传统背景,如图 3.5所示:

图 3.5 – 马里科、瑞伊和绫子在日本的津和野外
基于地理和共享的人口统计因素,我们预计如果马里科、瑞伊和绫子相遇,他们将会形成社会联系;鉴于他们所在城镇的大小,他们可能已经见过面了。在网络科学中,这种顶点与其他共享重要特征(如人口统计或地理因素)的顶点形成边的倾向被称为同质性。
同质性在社会网络中的链接预测中起着重要作用,它基于共享的人口统计/地理因素和共享的相互联系来暗示个人的潜在联系。例如,考虑巴黎两位数据科学家路易斯和简之间建立联系的可能性,他们虽然不知道彼此在专业上有所联系,但共享二十位共同同事以及许多人口统计因素:年龄组、教育背景、他们居住和工作的行政区以及职业。如果他们在专业活动中相遇,他们很可能建立专业联系,而且他们可能已经认识但尚未在社交媒体平台上建立联系。路易斯认识简的可能性比认识帕特里克要大得多,帕特里克是一位居住在另一个行政区、年龄较大的房地产专业人士,从未上过研究生院,也从未参加过技术会议。
除了链接预测之外,同质性在聚类网络中也很有用。我们不是通过网络特定的聚类方法(将在后面的章节中详细介绍)根据网络连通性来聚类顶点,而是可以通过我们收集的人口统计和地理因素使用 k 均值或基于密度的聚类来聚类顶点。虽然这在社交网络中更为常见,但这种聚类也可以应用于基因网络、基于地理的销售网络或其他任何类型的网络。
让我们通过两个例子来看看同质性的作用,第一个例子强调了同质性如何影响非洲法语国家的音乐趋势传播,第二个例子展示了基于学生研究领域和家乡的社会互动,流行病可能如何通过我们的 AIMS 学生网络传播。
法语非洲音乐传播
使用共同语言的国家往往在共同的音乐品味、文学和其他文化标志以及贸易、跨境提供就业机会和共享经济联系方面有共同点。在非洲,许多国家的历史包括殖民时期,当时它们处于英语或法国的控制之下;许多国家仍然使用英语或法语作为行政目的的通用语。为了理解法语国家之间的音乐传播,我们将创建一个网络,将拥有超过 10%法语人口的、共享边界的国家联系起来。尽管像毛里求斯或马达加斯加这样的国家有大量的法语人口,但它们在地理上与其他法语非洲部分地区隔离。音乐或文学趋势可能通过其他法语国家的在线来源或广播电台传播;然而,地区音乐会和活动可能不会像与共享边界的国家那样容易地促进传播。
我们首先整合了有关国家边界和法语人口估计的在线信息。让我们根据我们在网上找到的信息,使用脚本 3.1创建我们的法语国家网络:
#load needed packages
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
#create Francophone country network
G = nx.Graph()
G.add_nodes_from([1, 23])
G.add_edges_from([
(23,13),(13,11),(12,13),(13,18),(13,1),(12,3),(12,18),
(3,22),(3,18),(3,21),(3,20),(18,1),(18,14),(18,17),(18,21),
(21,17),(21,14),(17,14),(14,1),(14,6),(14,5),(6,5),(1,8),
(8,16),(8,7),(16,7),(16,2),(16,4),(16,19),(19,4),(4,2),
(7,10),(2,10),(10,15),(10,9)])
现在我们已经确定了至少与 1 个其他法语国家接壤的 23 个法语国家,让我们通过添加到脚本 3.1中来可视化我们的国家网络:
#plot the Francophone network
import matplotlib.pyplot as plt
G.nodes[1]['country'] = 'Niger'
G.nodes[2]['country'] = 'Republic_of_Congo'
G.nodes[3]['country'] = 'Senegal'
G.nodes[4]['country'] = 'Gabon'
G.nodes[5]['country'] = 'Benin'
G.nodes[6]['country'] = 'Togo'
G.nodes[7]['country'] = 'Central_African_Republic'
G.nodes[8]['country'] = 'Chad'
G.nodes[9]['country'] = 'Rwanda'
G.nodes[10]['country'] = 'Democratic_Republic_of_Congo'
G.nodes[11]['country'] = 'Morocco'
G.nodes[12]['country'] = 'Mauritania'
G.nodes[13]['country'] = 'Algeria'
G.nodes[14]['country'] = 'Burkina_Faso'
G.nodes[15]['country'] = 'Burundi'
G.nodes[16]['country'] = 'Cameroon'
G.nodes[17]['country'] = 'Cote_dIvoire'
G.nodes[18]['country'] = 'Mali'
G.nodes[19]['country'] = 'Equatorial_Guinea'
G.nodes[20]['country'] = 'The_Gambia'
G.nodes[21]['country'] = 'Guinea'
G.nodes[22]['country'] = 'Guinea_Bissau'
G.nodes[23]['country'] = 'Tunisia'
labels = nx.get_node_attributes(G, 'country')
nx.draw(G, labels=labels, font_weight='bold')
图 3.6 展示了我们法语国家和它们通过共享边界连接的链接:

图 3.6 – 法语国家网络的可视化
注意
当处理长标签时,带有标签的图表的绘图将包括重叠的标签或被截断的标签。然而,图 3.6 展示了我们网络的一些重要属性:即我们有两个国家(乍得和尼日尔)连接了两个不同的网络(如加蓬或布隆迪这样的中非法语国家以及如塞内加尔或摩洛哥这样的西非/北非法语国家)。正如我们将在创建音乐趋势传播模型时看到的那样,连接网络不同部分的桥梁,例如法语国家网络中的乍得和尼日尔,控制着从子网络到另一个子网络的传播过程。
为了模拟趋势的传播——或者说是思想或疾病的扩散——我们转向一个被称为微分方程的数学领域。微分方程关联了函数及其随时间变化(它们的导数)在一个感兴趣的系统中的关系。例如,微分方程可以模拟机械部件的热流,人口中的观点变化,重力对运动物体的影响,房间内声音的传播,或历史上的天气模式(以及其他许多情况)。
微分方程可以包括一阶导数,即感兴趣函数斜率的变化,二阶导数,与函数的曲率相关,甚至更高阶的导数。对于网络上的传播过程,我们将我们的讨论限制在一阶导数的微分方程上。然而,可以使用我们将在 NetworkX 网络上使用的软件定义和运行任何类型的微分方程。
有时,微分方程会在感兴趣函数中包含多个变量;这些方程被称为偏微分方程。包括流行病传播模型在内的许多现实世界过程都使用偏微分方程进行建模。此外,许多现实世界过程具有随机性成分或依赖于过程在物体或网络上的起始位置。在网络上,通常会对过程进行多次偏微分方程的计算,这些计算具有相同或不同的起始点。这允许出现一系列可能的结局。
现在我们对微分方程有了些了解,让我们深入探讨我们感兴趣的行为、思想和流行病的传播模型:易感者-感染者-康复者(SIR)模型。SIR 模型最初是为了研究流行病(在 1927 年)而开发的,其组成部分与人群中易感个体(尚未感染但可能被感染)相关,感染者(目前患有疾病的人),以及康复或具有抵抗力的人(那些曾经感染或免疫且不能被感染的人)。
随着个体在人群中的混合,感染个体可以以一定的概率将感染传播给易感者。对于我们的模型,感染易感个体的概率由参数beta给出。在实践中,这要么来自文献中关于行为或疾病传播概率的估计,要么在最佳猜测的范围内进行估计,在这些最佳猜测之间运行模型以估计该可能性范围内的潜在传播。一旦个体被感染,该个体就有恢复的概率,由参数gamma给出。一旦恢复,我们的模型也允许再次感染。然而,在易感-感染-恢复-易感(SIRS)模型中,恢复后的个体在一段时间后可以再次感染。在易感-感染-易感(SIS)模型中,恢复被立即再感染的机会所取代,而不是恢复。
流行病传播的一个重要特性是所谓的beta参数值相对于我们的gamma参数值。如果基本再生数 R0 大于1,则预期在流行病的初始阶段,疫情将在人群中传播,这表明可能发生大规模的疫情。许多传染病的爆发都具有 R0 值大于1,包括最近的埃博拉疫情(R0约为1.5)、1960 年加纳的麻疹疫情(R约为14)和 1918 年的西班牙流感(最初R0约为1.5,后来波次中约为3.5)。COVID-19 的 R0 值在不同变体和国家之间差异很大,这使得获得一个标准的 R0 值变得困难。然而,非洲的一个估计将大多数国家的 COVID-19 的估计 R0 值定为2.0-9.7。
SIR 模型在网络上运作的方式略有不同。一个感染顶点通常只感染网络中的邻居,产生一种邻近效应。在我们的网络中,桥梁特性限制了从子网络到另一个子网络的传播机会,因为桥梁顶点和其相邻顶点的感染率低于通过相互连接顶点的中心节点传播。一般来说,桥梁是网络中信息、想法或流行病传播的重要顶点,通常是干预的目标。在疾病流行期间进行疫苗接种活动以限制传播、在营销活动中针对提高产品采用率,以及在犯罪通信网络中捕获,都是针对桥梁进行目标干预以影响感兴趣网络上的传播动态的真实世界例子。
让我们更深入地探讨网络的几何结构,包括中心节点和桥梁。中心节点是高连接性的区域,其中许多顶点连接到许多其他顶点。从几何学角度来看,像中心节点这样的密集连接区域具有高曲率,为传播过程或网络上的随机游走提供了许多可能的路径。在我们的法语非洲网络中,喀麦隆、塞内加尔和马里都表现出中心节点的特性。
然而,需要注意的是,塞内加尔与其他顶点之间有许多边,而这些顶点没有大量与之关联的边。虽然塞内加尔由于其连通性而充当中心,但它不是一个理想的传播目标,因为过程将在相对孤立的顶点周围死亡。然而,喀麦隆和马里是连接到其他顶点的中心,这些顶点要么是中心,要么是桥梁,允许过程以高概率继续传播。中心性度量衡量一个顶点对网络的重要性,创建了不同类型的网络中心测量,可以找到在网络中充当马里/喀麦隆或塞内加尔的顶点。我们将在后面的章节中回顾这些中心性测量,我们将使用 igraph 评估网络属性。
桥梁的工作方式略有不同,但它们也为网络贡献了重要的几何特征。尼日尔和乍得在我们的法语非洲网络中充当桥梁,连接彼此之间没有其他边的中心。技术上,一种称为中介中心性的中心性类型通过计算每对顶点之间的最短路径(代表最直接的通信路线)并计算包含给定顶点的最短路径数量来衡量这种桥梁属性。那些有许多最短路径通过它们的顶点充当网络不同部分之间的桥梁。从几何学上讲,桥梁作为从网络的一部分到另一部分的流量交叉点。如果没有像乍得和尼日尔这样的桥梁将北非和西非与中非连接起来,我们的音乐从加蓬传播到西非将是不可能的,因为趋势必须通过这些国家才能离开中非。
对于我们音乐在法语非洲的传播,让我们考虑一个以 5%的国家开始听新桑巴艺术家的 SIR 模型。我们将说我们的音乐趋势有 25%的机会传播到邻近国家(我们的beta参数)和 10%的机会作为趋势消亡(我们的gamma参数)。这给我们 R0~2.5,这意味着我们的音乐趋势应该一开始就能很好地传播。
让我们通过添加到Script 3.1下载并导入ndlib包:
注意
对于某些包可能存在依赖关系,如果它们尚未在您的机器上安装,则需要安装。
#install and import epidemic models
#you may need to install bokeh and restart the notebook if it is not
#already installed
!pip install ndlib
import ndlib.models.epidemics as ep
现在,我们可以选择我们希望实施的流行病模型,并根据我们提出的音乐传播流行病设置其参数,通过添加到Script 3.1:
# Model Selection
model = ep.SIRModel(G)
# Model Configuration
import ndlib.models.ModelConfig as mc
config = mc.Configuration()
config.add_model_parameter('beta', 0.25)
config.add_model_parameter('gamma', 0.1)
config.add_model_parameter("fraction_infected", 0.05)
model.set_initial_status(config)
现在我们已经将模型导入并配置好,根据我们提出的传播动力学,我们可以在我们的法语国家网络上进行模拟。我们将包括 50 个时间段——可能是一周的时间段,表示大约一年的传播。让我们添加到Script 3.1以模拟传播:
# Simulation
iterations = model.iteration_bunch(50)
trends = model.build_trends(iterations)
如果你的运行给出bokeh库:
#visualize spread dynamics
from bokeh.io import output_notebook, show
from ndlib.viz.bokeh.DiffusionTrend import DiffusionTrend
viz = DiffusionTrend(model, trends)
p = viz.plot(width=500, height=400)
show(p)
这应该会给你一个类似于图 3**.7的图表,它显示了我们的音乐趋势流行病中易感、感染和康复/移除国家的比例。请注意,我们预计受这种新鲁姆巴艺术家影响的国家的峰值数量大约是我们国家数量的三分之一,而这位新艺术家的这种影响持续了超过半年。这对于我们这位新艺术家来说是一个相当成功的成果:

图 3.7 – 音乐在法语国家网络中的趋势传播
现在,让我们将我们的gamma参数修改为等于0.3,给出小于1的 R0。我们预计我们的趋势会非常快地消亡。在这个新场景下修改Script 3.1会产生截然不同的动态(图 3**.8):
# Model Configuration
import ndlib.models.ModelConfig as mc
config = mc.Configuration()
config.add_model_parameter('beta', 0.25)
config.add_model_parameter('gamma', 0.3)
config.add_model_parameter("fraction_infected", 0.05)
model.set_initial_status(config)
# Simulation
iterations = model.iteration_bunch(50)
trends = model.build_trends(iterations)
#visualize spread dynamics
from bokeh.io import output_notebook, show
from ndlib.viz.bokeh.DiffusionTrend import DiffusionTrend
viz = DiffusionTrend(model, trends)
p = viz.plot(width=500, height=400)
show(p)

图 3.8 – 在新的 gamma 参数下,音乐在法语国家网络中的传播
图 3**.8表明,新鲁姆巴艺术家的音乐并没有在邻国传播很多,在专辑发布后很快就会消亡。艺术家在其家乡国家之外不太可能为人所知,而听过专辑的人很快就会忘记这些歌曲。对于我们这位艺术家来说,这与原始场景的结果大相径庭。
喀麦隆 AIMS 学生网络流行病学模型
为了了解流感可能通过社交网络传播的方式,让我们回到我们的喀麦隆 AIMS 学生网络。回想一下,我们使用了关于互动的调查数据来在学生之间建立连接。这使我们能够连接那些经常互动的学生。然而,考虑一下关于互动的调查数据不存在的情况。我们如何推断学生之间可能存在的连接?
我们有关于学生国籍、研究领域和年龄的信息。来自同一国家的学生可能共享一种共同的文化——可能是有相同的本地语言、相同的最喜欢的舒适食品或相同的最喜欢的音乐家。
同样,由于他们共享的课程负担和职业兴趣,同一研究领域的学生很可能在课内外都会花时间在一起。他们的研究领域中的学习小组、小组项目和职业活动可能会定期将学生聚集在一起。如果在任何这些聚会中发生流感或 COVID-19 等传染病爆发,它很可能会在研究领域内传播。
让我们通过连接来自同一国家或共享同一研究领域的学生来创建一个新的喀麦隆 AIMS 学生网络。我们将使用Script 3.2来加载数据集:
#import needed packages
import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
import math
#reading the dataset
fichier = pd.read_csv("C:/users/njfar/OneDrive/Desktop/AIMS_data.csv")
data = pd.DataFrame(fichier)
现在,让我们设置我们的网络和一些初步的向量和数量,帮助我们生成学生之间的连接,包括学生的数量和他们的属性,通过添加到Script 3.2:
#intializing the social network
aimsNetwork = nx.Graph()
#populating the network with nodes and edges
for i in range(len(data["Name"])):
aimsNetwork.add_node(
data["Name"][i], Age=data["Age"][i],
country=data["Country"][i],Field=data["Field"][i],
background=data["Background"][i])
#define length
N = len(aimsNetwork.nodes())
# one can build the adjacency matrix
AIMS_by_Country_or_Field = nx.Graph()
#define objects
AIMS = aimsNetwork
students = list(AIMS.nodes())
现在,我们可以通过遍历我们的属性来根据共享的国籍或研究领域连接学生,通过添加到Script 3.2来在 NetworkX 中构建一个图:
#create edges
for i in range(N-1):
for j in range(i+1,N):
sti = students[i]
stj = students[j]
if AIMS.nodes[sti]['Field'] == AIMS.nodes[stj]['Field'] or
AIMS.nodes[sti]['country'] == AIMS.nodes[stj]['country']:
AIMS_by_Country_or_Field.add_edge(sti,stj)
现在我们有了我们的网络,让我们可视化 AIMS 中学生的连接:
#create plot
Degree=AIMS_by_Country_or_Field.degree()
var = [10*k[1] for k in list(Degree)]
plt.figure(figsize=(20,20))
nx.draw_random(AIMS_by_Country_or_Field, font_size=10,
node_size = var, with_labels=True, node_color="red")
plt.show()
这应该会给你一个高度连接的学生网络的图表,如图图 3.9所示:

图 3.9 – 通过国籍和研究领域连接的 AIMS 喀麦隆学生网络
图 3.9 显示了一个紧密连接的网络,表明许多学生很可能会与其他许多学生互动。这个网络没有很多桥接点,但大多数顶点似乎都是中心。在非常密集的网络中,传播过程往往移动得更快。与法语非洲网络相比,这个网络中顶点之间的最短路径将相对较短,因为大多数顶点都相互连接或几乎连接。网络的直径,即最长最短路径,代表了两个顶点之间信息或疾病传播的最大最短路径。网络直径小(或平均最短路径长度小)表明传播过程(如信息、趋势或疾病)的效率。因此,我们预计我们的 AIMS 喀麦隆学生网络比我们的法语非洲网络更容易受到传播过程的影响。从技术上讲,直径为定义在网络上的一类微分方程(如我们的传播过程)提供了界限。
在这个网络上,如果流行病的 R0 值超过 1,很可能会迅速传播并感染网络中的大部分。让我们运行一个与我们在法语网络中使用的相同beta和gamma参数的流行病,通过添加到Script 3.2来绘制结果,看看类似西班牙流感的流行病是如何通过我们的学生群体传播的:
#Run the simulated epidemic on the AIMS Cameroon student network
model = ep.SIRModel(G)
config = mc.Configuration()
config.add_model_parameter('beta', 0.25)
config.add_model_parameter('gamma', 0.1)
config.add_model_parameter("fraction_infected", 0.05)
model.set_initial_status(config)
iterations = model.iteration_bunch(50)
trends = model.build_trends(iterations)
viz = DiffusionTrend(model, trends)
p = viz.plot(width=500, height=400)
show(p)
图 3.10 显示了流行病的动态,包括流行高峰时的许多感染学生,以及到第 32 周流行病缓解时,几乎整个网络都被感染:

图 3.10 – beta = 0.25 和 gamma = 0.1 在 AIMS 喀麦隆学生网络中传播的流行病
图 3.10 显示了一场非常严重的流行病,这可能会迫使关闭课程并隔离感染的学生。在第八章中,我们将考虑你可以利用的具体策略来降低在人口层面的流行病影响,包括移除连接人口或创建中心的关键顶点。现在,让我们修改Script 3.2来运行第二种类型的流行病,其中 R0 小于 1(beta = 0.25 和 gamma = 0.3):
#Run the simulated epidemic on the AIMS Cameroon student network
model = ep.SIRModel(G)
config = mc.Configuration()
config.add_model_parameter('beta', 0.25)
config.add_model_parameter('gamma', 0.3)
config.add_model_parameter("fraction_infected", 0.05)
model.set_initial_status(config)
iterations = model.iteration_bunch(50)
trends = model.build_trends(iterations)
viz = DiffusionTrend(model, trends)
p = viz.plot(width=500, height=400)
show(p)
图 3.11显示了一种非常不同的流行病类型,它不会迅速感染大量学生并迅速消亡:

图 3.11 – beta = 0.25 和 gamma = 0.3 在 AIMS 喀麦隆学生网络中传播的流行病
如我们从图 3.11中可以看到,即使是密集连接的网络也不会受到某些类型流行病的威胁。如果没有有效的传播条件——无论是通过网络结构还是通过影响传播潜力的疾病特征——流行病将在人群中消亡。然而,像图 3.11中显示的具有初始动态的病毒有可能突变成更具传染性的病毒。
如本章前面所述,1918 年的西班牙流感病毒株从一种传染病突变成为高度传染性疾病,将基本再生数 R0 从略大于1(允许传播)变为3.5,预示着一场全球性的灾难。在实践中,当模拟通过感兴趣的网络传播的流行病时,考虑各种现实参数值非常重要,因为参数的微小差异可能导致非常不同的结果;流行病规划在模拟了广泛的各种场景时效果最佳。
摘要
在本章中,我们介绍了人口统计学因素及其如何通过同质性影响网络发展。我们还介绍了枢纽和桥梁的概念。然后,我们转向 SIR 模型,通过微分方程模型中的传播因子展示了基于社会网络的疾病传播趋势。我们考虑了两个网络:一个相邻的法语国家地理网络和基于人口统计学因素的推定的 AIMS 喀麦隆学生网络。然后,我们通过改变流行病参数进行流行病模拟,考察了 R0 在这两个网络中的作用;这表明,要使趋势或疾病在网络上传播,需要特定的条件。我们将在第八章中再次回顾这些想法和策略,届时我们将更详细地探讨动态网络度量随时间变化,以及个人随时间改变网络中与他人连接时的中心性度量。
在下一章中,我们将探讨网络在交通运输物流中的作用,以及如何将运输路线数据表示为网络。
参考文献
Aiello, L. M., Barrat, A., Schifanella, R., Cattuto, C., Markines, B., & Menczer, F. (2012). 社交媒体中的友谊预测和同质性。ACM 网络交易(TWEB),6(2),1-33。
Cooper, I., Mondal, A., & Antonopoulos, C. G. (2020). COVID-19 在不同社区传播的 SIR 模型假设。混沌、孤子和分形,139,110057。
Das, K., Samanta, S., & Pal, M. (2018). Study on centrality measures in social networks: a survey. 社会网络分析及挖掘, 8, 1-11.
Estrada, E., Kalala-Mutombo, F., & Valverde-Colmeiro, A. (2011). Epidemic spreading in networks with nonrandom long-range interactions. 物理评论 E, 84(3), 036110.
Iyaniwura, S. A., Rabiu, M., David, J. F., & Kong, J. D. (2022). The basic reproduction number of COVID-19 across Africa. Plos one, 17(2), e0264455.
McPherson, M., Smith-Lovin, L., & Cook, J. M. (2001). Birds of a feather: Homophily in social networks. 社会学年度评论, 27(1), 415-444.
Rodrigues, F. A. (2019). Network centrality: an introduction. 从非线性动力学到复杂系统的数学建模方法, 177-196.*
Smith, H. L. (2003). Some thoughts on causation as it relates to demography and population studies. 人口与发展评论, 29(3), 459-469.
Weiss, H. H. (2013). The SIR model and the foundations of public health. 材料数学, 0001-17.
第五章:运输数据
本章探讨了运输物流,涉及将供应或商品从一处地点移动到另一处地点。我们将介绍一个货物配送问题,以找到最佳路线,以最小化配送时间和成本来交付商品。我们将探讨最短路径、访问所有必要地点的最佳路线,以及将算法扩展到大型网络的缩放算法。此外,我们还将检查简单距离加权的潜在问题,以计算路线最优性,考虑路线上的配送风险,这些风险可能会影响最优性。
完成本章后,你将了解如何将运输问题表述为网络问题,并使用 Python 将其扩展到非常大的路由网络。
具体来说,本章将涵盖以下内容:
-
运输问题简介
-
最短路径应用
-
旅行商问题
-
最大流/最小割(max-flow min-cut)算法
让我们从运输物流的一些基本问题开始吧。
技术要求
你需要 Jupyter Notebook 来运行本章中的实践示例。
本章的代码可在以下链接找到:github.com/PacktPublishing/Modern-Graph-Theory-Algorithms-with-Python
运输问题简介
物理商品和供应在许多行业中都很重要,商品在地点之间的移动代表了消费包装商品、零售、军事和制造业等行业的一个重要问题。供应链物流——获取、运输和储存资源的科学——影响着这些行业部门的许多商业方面。没有商品出售,公司就无法盈利。没有材料来制造商品,产品就无法制造或运送到供应商那里。
在 COVID-19 大流行期间,许多关键的供应链路线关闭,导致世界许多地区的商品供应出现长时间等待,或者必需品如食品的价格上涨。像乌克兰战争这样的危机可能导致整个国家粮食短缺,在其他地区造成人道主义危机。许多供应链物流问题可以通过网络科学的视角来表述,图论提供了几个有用的工具来规划在不同地点之间存储货物或材料的最佳路线。在本章中,我们将更多地了解供应链物流,并利用图论工具来规划超市之间的供应路线。
商店之间的路径
零售商面临的一个常见供应链物流问题是跨区域运输商品。例如,考虑一个郊区,该地区有五个属于同一连锁品牌的超市分散在该地区,如图4.1所示:

图 4.1 – 一个拥有五个连锁超市的都市区域
图 4.1 的都市区域显示了附近(右角)的一些商店以及彼此之间较远的商店(如左侧的商店)。也许我们正在将新鲜水果和蔬菜从附近的农场运送到每个商店。不考虑街道、加油站点或其他考虑因素(我们将在本章后面讨论这些),似乎定义商店之间的路线很容易。其中一条路径在图 4.2 中显示:

图 4.2 – 一个为假设的郊区区域中的每个超市配送水果和蔬菜的路线计划
与图 4.2 相反,在实际情况中,卡车可能需要经过许多路线才能到达商店。可能存在替代街道和路线组合。卡车在商店之间可能需要加油,加油站的位置可能会影响哪条路线是最理想的。道路可能因施工而关闭。下午的雷暴雨可能会淹没一些良好路线上的街道,给卡车带来需要避免的危险。一些商店可能没有橙子和葡萄柚,因此需要优先安排早些时候的配送,以便顾客可以购买这些水果。
在更长的距离上,运输方式的问题也会出现。如果需要补充库存的商店之间存在海洋或山脉等障碍,通过海上运输或通过飞机运输货物可能更可取。自从世界全球化以来,商品跨越大陆和海洋运输(海运在图 4.3 中显示)是常见的:

图 4.3 – 一艘离开港口的货船的插图
在美国和欧洲使用的许多产品或产品部件来自中国、日本或印度。海上运输可以提供比陆路或空运更便宜、更快捷的替代方案。供应链物流中的一个关键问题是平衡成本效益、交货时间(TTD)和大量货物移动的需求。让我们更详细地探讨一些这些考虑因素。
燃料成本
当今物流中一个紧迫的问题是关于配送成本优化路线。顾客不希望为配送支付高价或等待很长时间等待货物到达。自 COVID-19 关闭和乌克兰战争以来,燃料价格上升,一些货物路线不再可用。这推高了制造商、需要将货物运送到物理位置的商家以及从商家购买商品的消费者的成本。
地面路线,尤其是当与电动配送车辆(如图 4.4(a)所示)结合使用时,可以为本地运营的公司提供良好的选择。然而,许多供应链依赖于海外定位的部件或商品,因此需要如运输(如图 4.4(b)所示)或航空旅行等选项:

图 4.4 – 以下插图:(a)用于国内运输的半挂车和(b)用于海外运输的运输选项
然而,燃料成本很少是唯一考虑因素,因为对于可能变质的任何商品来说,时间是关键,而在现实世界中,与货物损失相关的安全问题往往比燃料成本更重要。让我们考虑一些场景,在这些场景中,总运输时间(TTD)是优化算法中用于安排交货时间、路线和最佳运输方式的重要考虑因素。
交货商品的时间
对于交货时间的首要考虑因素是紧急程度。某些商品(如农产品或疫苗)可能在一定时间内变质,这通常超过了成本,因为商品在必要的使用时间之外将无法使用。销售窗口也值得考虑,因为圣诞节或斋月期间的物品在假日过后需求不会那么大。这会导致企业利润损失。
让我们考虑两个旅游咖啡馆,一个位于苏里南的帕拉马里博市,另一个位于苏里南乡村地区,靠近一个自然探险营地。城市位置(如图 4.5(a)所示)可以访问冰箱来储存用于其冰沙的水果;乡村位置(如图 4.5(b)所示)没有冰箱。从当地农场运送新鲜水果的运输优先级可能会优先考虑乡村位置,因为那里的水果会更快变质:

图 4.5 – 以下插图:(a)苏里南帕拉马里博的一家咖啡馆和(b)苏里南乡村地区靠近旅游营地的一家咖啡馆
除了变质商品和错过促销期的问题外,时间因素还可以包括路线上的运输障碍,如施工或收费公路。此外,各国海关所需时间可能会有很大差异,因此选择更长的驾驶路线以避免穿越特定国家可能是有利的。
通常,在计算路线时,不仅需要考虑物理距离,还需要考虑旅行时间,包括诸如海关或施工可能性等因素。
导航危险
导航问题不仅包括对交付的人为障碍,还包括自然障碍。飓风可能会延误通过繁忙港口(如迈阿密港)的运输。阿尔卑斯山的雪崩是选择火车运输的公司需要考虑的导航因素。航运业每年平均有 10 艘船在公海和巨浪中损失。一些航线,如南非东南海岸的航线,已知会产生高浪(通常是因为洋流与来自不同方向的多种海洋波浪混合)。
在处理最优旅行路线和确定哪种交通方式最经济便捷时,路径的风险加权可能是明智的。世界上大多数地区都包含开源的风险数据和资料,以确定哪些风险存在以及一个人遇到它们的可能性有多大。例如,世界银行提供了气候变化知识门户(CCKP)在不同时期内的自然灾害风险,包括可下载的数据。
现在我们已经了解了一些路由考虑因素,让我们深入一个简单的例子,包括迈阿密一个局部区域内需要运送农产品到五个商店,这些商店都可以通过卡车到达,并且定义在一年中该地区不会发生洪水或飓风的时期内排除当前施工区域。首先,我们需要了解我们如何计算网络中顶点之间的最短路径,这在图论中有着深厚的根源。
最短路径应用
在图论中,地点和地点集合之间的最短路径有着悠久的历史。最初,这个问题源于关于穿越德国柯尼斯堡七座桥的问题。1736 年,莱昂哈德·欧拉提出,一条穿过每座桥到桥一侧相邻地区的路线恰好只穿过一次是不存在的。确实如此。如果桥的数量比地区的数量多一个,且桥的数量为奇数,那么旅行是可能的,不需要穿越桥超过一次。请注意,这个证明超出了本书的范围;如果你对此感兴趣,你可以在网上找到许多关于柯尼斯堡桥问题的证明,如果你搜索柯尼斯堡桥问题的证明的话。
然而,这种问题在运输行业中经常出现,全球定位系统(GPS)路由解决方案和算法在今天的路由问题中很常见,这些算法计算带有或没有特定约束(如柯尼斯堡桥问题)的最短路径。我们经常希望在穿越尽可能少的道路、桥梁或障碍物的同时访问多个地点,我们可以用类似欧拉提出他的桥梁问题的方式提出这个问题。然而,我们通常有许多不同的可能路线和地点,这使得在有替代路线的情况下证明变得更加困难。
在邻接矩阵中用0或1表示顶点之间是否存在边(或加权,其中存在的边有数字,不仅限于1来表示它们的存存以及它们之间的某些属性)。在地理数据中最短路径计算的情况下,这些权重通常表示位置之间的距离。
在顶点之间可能存在多条路径。例如,考虑一个包含七个顶点的网络。在顶点一和顶点六之间,存在许多可能的路径,包括图中图 4.6所示的那条。然而,最短路径总是存在的,它会最小化网络中任意两个顶点之间的距离(物理距离或其他,这取决于如何从数据集中分配边权重)。当一个网络不连通时,这可能是不确定的或设置为无限距离:

图 4.6 – 一个包含七个顶点,从第一个顶点到第六个顶点的路径的网络
有时,顶点之间的最短路径(比如,在我们图 4.6网络中的一和七之间)可能不是唯一的。可能存在多条相同长度的路径,例如顶点一和顶点七之间的两条最短路径(如图 4.7所示):

图 4.7 – 一对顶点(顶点一和顶点七)之间有多条最短路径的网络
在无向网络中,在寻找顶点之间的最短路径时,可以考虑到顶点之间的所有边。如前所述,如果网络不连通,可能存在无限路径长度。对于无向和无权网络,最短路径将穿越最少的边(如果没有边路径连接两个顶点,则可能存在无限值)。图 4.8显示了一个不连通的网络:

图 4.8 – 一个不连通的网络
顶点八和顶点九之间的最短路径仅仅是连接顶点八和顶点九的边。假设这个网络没有加权,从这个路径的最短距离是一。顶点一和顶点六之间的最短路径是由连接顶点六到顶点三和顶点三到顶点一的边给出的。因此,顶点六和三之间的最短距离是二。然而,顶点八和顶点六之间的最短路径不存在,将被指定为无限距离。
迪杰斯特拉算法从一个配对顶点开始,探索与该顶点相连的顶点。然后记录从该初始顶点到其相邻顶点的最短路径,减去初始顶点(因为它已经在我们的路径集中)。然后探索连接到最短距离相邻顶点的下一个顶点集,以找到存在的下一个最短路径。这种迭代探索一直持续到找到另一个配对顶点。
让我们考虑一下迪杰斯特拉算法如何帮助我们找到商店之间的最短路线。考虑一个来自同一郊区同一杂货连锁店的五家商店的集合,这些商店可能需要母公司的供应商进行补货。表 4.1 给出了这五家商店之间的距离摘要(以英里为单位):
| 商店 1 | 商店 2 | 商店 3 | 商店 4 | 商店 5 | |
|---|---|---|---|---|---|
| 商店 1 | 0 |
2 |
2.4 |
3 |
3 |
| 商店 2 | 2 |
0 |
3.7 |
1.4 |
4.3 |
| 商店 3 | 2.4 |
3.7 |
0 |
4.9 |
0.9 |
| 商店 4 | 3 |
1.4 |
4.9 |
0 |
5.4 |
| 商店 5 | 3 |
4.3 |
0.9 |
5.4 |
0 |
表 4.1 – 郊区连锁商店之间的英里距离表
我们可以在Script 4.1中创建这个商店网络:
#import packages
import networkx as nx
#create the Stores network
STRS = nx.Graph()
STRS.add_nodes_from(["store1","store2","store3","store4","store5"])
#define weighted ebunches, which represent lists of edges
e1 = [("store1","store2",2),("store1","store3",2.4),
("store1","store4",3),("store1","store5",3)]
e2 = [("store2","store3",3.7),("store2","store4",1.4),
("store2","store5",4.3)]
e3 = [("store3","store4",4.9),("store3","store5",0.9),
("store4","store5",5.4)]
#add edges
STRS.add_weighted_edges_from(e1)
STRS.add_weighted_edges_from(e2)
STRS.add_weighted_edges_from(e3)
#plot
weight_labels=nx.get_edge_attributes(STRS,'weight')
pos = nx.spring_layout(STRS)
nx.draw(STRS,pos,with_labels=True,)
nx.draw_networkx_edge_labels(STRS, pos,edge_labels=weight_labels)
Script 4.1 给出了我们五家商店的网络,并有一个很好的图表摘要显示了商店之间的距离,如图 图 4.9 所示:

图 4.9 – 我们五家商店及其之间的距离图
现在我们可以根据我们的网络创建一个邻接矩阵,并通过添加到Script 4.1来找到地点之间的最短路径。让我们计算我们的连锁店位置中商店 1与其他每个商店之间的最短距离:
#create adjacency matrix
adj1 = nx.adjacency_matrix(STRS)
adj1.todense()
#find all shortest paths starting at Store 1
length1, path1 = nx.single_source_dijkstra(STRS,"store1")
length1
从这个计算中,我们得到了length1)之间的最短距离以及一般情况下的最短路径(path1)。我们可以看到length1之间的最短距离。到商店 2的最短路线是两英里,而到商店 4或商店 5的最短路线是三英里。商店 3距离商店 1为 2.4 英里。
使用迪杰斯特拉算法的一个主要缺点是它是一种盲目搜索算法,需要遍历所有可能的选择,以找到路径上每个可能顶点对之间的最短路径。对于大型网络来说,这需要很长时间,在实践中,需要对迪杰斯特拉算法进行修改以减少搜索时间。
A 算法*(发音为 A-star)通过使用启发式函数来引导搜索(与迪杰斯特拉算法中访问每个顶点相反)修改了迪杰斯特拉算法。启发式函数在搜索任务中很常见,因为它们可以加速过程,并可以修改失败算法的搜索。A* 算法中使用的启发式函数结合了从起始顶点到路径的成本以及到达给定目的地剩余成本的估计,以优先考虑最接近最终顶点的顶点。A* 算法的主要用途之一是为 GPS 用户提供路线,以找到到达目的地的最佳路线。
通常,A* 算法有效地找到最短路径候选者,尤其是在大型或密集网络中。然而,其性能取决于用于估计通过网络到达给定目的地成本的启发式函数。虽然迪杰斯特拉算法保证找到最短路径,但 A* 算法不保证找到最短路径。然而,在大型、密集网络中,运行迪杰斯特拉算法是不切实际的,因此必须使用 A*。
表 4.2 总结了迪杰斯特拉算法和 A* 算法之间的差异,以指导您如何以及何时使用每种算法进行最短路径计算:
| 最短路径算法 | 搜索类型 | 结果保证 | 计算速度 |
|---|---|---|---|
| 迪杰斯特拉算法 | 全局搜索所有顶点 | 总是找到最短路径 | 足够慢以限制在密集或大型网络上的使用 |
| A* 算法 | 引导搜索的启发式函数 | 没有找到最短路径的保证 | 足够快以解决大多数问题 |
表 4.2 – 迪杰斯特拉算法和 A* 算法之间的差异
让我们考虑一个不同的商店网络,其中一个网络中并非每个商店都通过创建一个二级商店网络在 NetworkX 中通过 Script 4.2 存在路线:
#create a different Stores network
STRS2 = nx.Graph()
STRS2.add_nodes_from(["store1","store2","store3","store4","store5"])
#define weighted ebunch
e12 = [("store1","store2",2),("store1","store4",3)]
e22 = [("store2","store3",3.7),("store2","store4",1.4)]
e32 = [("store3","store4",4.9),("store4","store5",5.4)]
#add edges
STRS2.add_weighted_edges_from(e12)
STRS2.add_weighted_edges_from(e22)
STRS2.add_weighted_edges_from(e32)
#plot
weight_labels=nx.get_edge_attributes(STRS2,'weight')
pos = nx.spring_layout(STRS2)
nx.draw(STRS2,pos,with_labels=True,)
nx.draw_networkx_edge_labels(STRS2,pos,edge_labels=weight_labels)
图 4**.10 展示了这种新的商店网络,其中一些商店直接相互连接,而其他商店则需要经过其他商店的路线。请注意,商店 5 是离其他商店最远的商店,连接到 商店 4 但没有连接到其他商店:

图 4.10 – 一个商店网络,其中并非每个商店都通过可通行的路线连接到另一个商店
让我们考虑从 商店 2 到 商店 5 的路线。存在几种可能的路线(商店 2 到 商店 3 到 商店 4 到 商店 5,商店 2 到 商店 1 到 商店 4 到 商店 5,以及 商店 2 到 商店 4 到 商店 5)。如果所有距离都相对较短,最短的可能路线可能不是沿途停站最少的路线。在这种情况下,我们只需查看我们的网络,就可以看到 商店 2 到 商店 4 到 商店 5 是最短路线。然而,在非常大的网络中,这会花费很多时间,并且可能涉及更长的路径。
我们可以通过向Script 4.2中添加内容来在 NetworkX 中使用 A*算法找到我们的最短路线:
#find shortest path from Store 2 to Store 5
nx.astar_path(STRS2,"store2","store5", weight='weight')
如预期的那样,A算法找到了从商店 2到商店 4再到商店 5的最短路径。再次,对于更大的网络,我们需要像 A算法这样的算法来快速找到最短路线。即使是一个有 20 家商店并且商店之间有多个连接的网络,手动从网络的可视化中计算也会很成问题。我们已经看到算法如何帮助我们找到两个特定目的地之间的最短路径。现在让我们看看包括在几个不同顶点停止的最短路径。这类解决方案对于许多最优路径问题至关重要,并建立在我们在两个不同目的地之间找到最短路径的问题之上。
旅行商问题
最短路径的自然扩展是在每个位置停止的最短可能路线。例如,考虑一辆需要为我们的五个商店补充所有货物的生产卡车。在每个我们的五个商店停止的最短路线可以节省司机的驾驶时间和燃料,并允许产品在最短的时间内到达每个商店。
旅行商问题旨在找到在每个位置或任意数量可能位置停止的最短路线。在图论中,这个问题(以及欧拉问题)与图中的回路相关,回路定义了一个非空路径,该路径从同一顶点开始并结束。
在实践中,需要算法来找到最短路径,对于大型问题,计算时间和收敛到解决方案可能会限制大多数算法的使用。NetworkX 提供了Christofides 算法作为求解器,该算法找到最短生成树(没有回路的树状网络结构)然后匹配树顶点以找到最小距离。
让我们使用Script 4.3为我们的原始五个商店网络找到旅行商问题的解决方案:
#define traveling salesman algorithm and apply it to the stores's #networks
tsp = nx.approximation.traveling_salesman_problem
tsp(STRS)
此路径从商店 1开始,接着到商店 3(2.4 英里),然后是商店 5(0.9 英里),接着是商店 4(5.4 英里),然后是商店 2(1.4 英里),最后回到商店 1(2 英里)。
让我们通过向Script 4.3中添加内容来查看这是如何在我们的二级存储网络中工作的:
#apply TSP algorithm to the second stores's networks
tsp(STRS2)
在这种情况下,我们需要访问一些商店多次以访问每个商店。我们的算法给出的解决方案从商店 1开始,然后是商店 4(3 英里),然后是商店 5(5.4 英里),然后再次是商店 4(5.4 英里),然后是商店 2(1.4 英里),然后是商店 3(3.7 英里),然后回到商店 2(3.7 英里),最后回到商店 1(2 英里)。这比我们原始的商店网络中需要的路线要长得多(12.1 英里比 22.6 英里),这是由于许多商店之间的非直接路径造成的。
在本节中,我们回顾了解决旅行商问题的解决方案,其中我们需要访问一组顶点,并希望找到访问所有这些顶点的最有效方式。在下一节中,我们将从检查最短路径问题转向查看分割顶点以最大化每个集合中顶点之间的旅行(例如,在关闭几条路线进行维护的同时最大化高峰时段的交通流量)。
最大流最小割算法
除了最短路径和路线之外,运输物流有时还涉及城市规划,例如,以最少的交通模式或供应链中断来规划道路工程。目标是最大化通过兴趣点(例如,主要交叉口或每天有大量游客/工作人员的建筑)的交通流量,同时最小化切断哪些路线。
在图论中,最大流最小割算法旨在将网络分割以最大化通过社交网络、交通网络、通过电气或水管道网络等的信息流。通常,有一个起点和一个终点与流量相关,尽管可以通过所有可能的组合运行算法,并将结果汇总以最大化整个网络的最大流量。
让我们考虑一个例子,即从城市外的密集住宅区到大多数人都工作的市中心地区的交通流量。我们希望规划在整个城市中更换关键交叉路口的交通信号灯的工作,这些交叉路口被运河分隔。城市中的一些道路比其他道路有更多的车道,允许更多的交通流量使用这些路线。我们希望在白天的工作时间内最小化对通勤者的干扰。
我们可以创建一个这种情况的网络,将住宅区指定为顶点"a",市中心地区指定为顶点"g"。我们将使用容量参数指定路线可以处理的交通量。让我们使用Script 4.4在 NetworkX 中构建一个示例网络:
#build the city intersection network
G1=nx.DiGraph()
G1.add_edge("a", "b", capacity=2.0)
G1.add_edge("a", "d", capacity=0.5)
G1.add_edge("b", "d", capacity=3.0)
G1.add_edge("c", "d", capacity=2.5)
G1.add_edge("c", "e", capacity=1.0)
G1.add_edge("e", "f", capacity=4.0)
G1.add_edge("f", "g", capacity=1.0)
#plot network
capacity_labels=nx.get_edge_attributes(G1,'capacity')
pos = nx.spring_layout(G1)
nx.draw(G1,pos,with_labels=True,)
nx.draw_networkx_edge_labels(G1,pos,edge_labels=capacity_labels)
此脚本应生成一个看起来像图 4.11的网络:

图 4.11 – 交通网络的图示
现在我们有了我们的网络,让我们应用我们的最大流最小割算法,并找出我们可以在Script 4.4中添加以替换我们的第一个交通信号灯的地方:
#find cut-points
partition = nx.minimum_cut(G1, "a", "g")
print(partition)
我们的分割建议,我们最好的选择是切断交叉路口"c"和"d"之间的连接。一些通勤者可能会受到影响,但这对最大数量的通勤者来说保留了移动性。
摘要
在本章中,我们探讨了运输问题和路由问题,这些问题在现实世界的工业中经常出现。我们在两个示例商店网络上使用 Dijkstra 和 A*算法找到了商店之间的最短路径。然后,我们考虑了在我们的两个商店网络上进行最优路线规划时的旅行商问题,以了解连通性如何影响路线长度。最后,我们考虑了在小型城市网络上最大化流量的最优切割。在下一章中,我们将通过检查生态数据来处理网络上的聚类问题。
参考文献
陈,L.,金,R.,刘,Y. P.,彭,R.,古腾堡,M. P.,萨切瓦,S. (2022 年 10 月)。几乎线性时间内的最大流和最小成本流。在 2022 年 IEEE 第 63 届计算机科学基础年会(FOCS) (第 612-623 页)。IEEE.
约翰逊,D. B. (1973)。关于 Dijkstra 最短路径算法的注释。《美国计算机学会会刊(JACM), 第 20 卷,第 3 期,第 385-388 页。
康,N. K.,孙,H. J.,李,S. H. (2018)。模块化植物土地运输的改进 A算法。《机械科学与技术杂志,* 第 32 卷,第 5563-5571 页。
利特尔,J. D.,穆尔蒂,K. G.,斯威尼,D. W.,卡雷尔,C. (1963)。旅行商问题的算法。《运筹学, 第 11 卷,第 6 期,第 972-989 页。
刘,S.,闵奇,F.,佩耶里霍夫,N. (2018). 图上的 Bakry–Émery 曲率和直径界限。变分法和偏微分方程计算, 第 57 卷,第 1-9 页。
朗迪内利,D.,贝里,M. (2000)。多模式运输、物流和环境:在全球经济中管理相互作用。《欧洲管理杂志, 第 18 卷,第 4 期,第 398-410 页。
罗森塔尔,W.,莱纳,S. (2008)。《MaxWave 项目:异常波浪的结果。
第六章:生态数据
本章中,我们将介绍一些在生态数据收集中常用的方法,然后探讨可以解析出监测地理区域内动物群体的图论聚类方法。这在生态研究中是一个非常普遍的问题,因为动物群体会迁徙并与其他动物群体重叠。此外,解析出健康和不健康的生态系统是保护和城市规划中常见的调查任务。我们将使用谱聚类分析两种类型的生态数据,以在蛇捕获计数和生态调查文本数据中找到群体。
到本章结束时,你将了解如何将谱聚类应用于网络中的群体查找。你还将看到不同的谱聚类实现如何被公式化,一些算法在处理大型网络时比其他算法更有效。
具体来说,我们将涵盖以下主题:
-
生态数据简介
-
谱图工具
让我们从生态问题的背景知识开始。
技术要求
运行本章中的实践示例需要 Jupyter Notebook。
本章的代码可在以下链接找到:github.com/PacktPublishing/Modern-Graph-Theory-Algorithms-with-Python
生态数据简介
环境研究在保护战略、气候变化监测和农业实践中发挥着重要作用。收集的数据可能包括植物类型分布和密度、动物迁徙模式或疾病范围的数据。例如,农民可能希望跟踪大型农场上的作物疾病,以监测各种作物对年度产量的潜在威胁。保护主义者可能希望跟踪濒危动物群体在穿越国家公园时的迁徙,以便将反偷猎资源部署到拥有大量本地或迁徙群体的地区。让我们首先探讨一些数据收集方法。
探索跟踪地理区域内动物群体的方法
动物群体通常具有高度的流动性,季节变化、天气事件和人类互动驱使动物从一个地理位置移动到另一个地理位置。最大的动物迁徙之一发生在东非的草原上,每年随着雨季的来临和结束,数百万的兽群(如斑马和角马)从塞伦盖蒂迁徙到马赛马拉,然后再返回塞伦盖蒂(图 5.1)。偷猎不仅危害动物群体,而且往往助长其他非法活动,造成当地和国际问题;了解保护区边界的迁徙模式可以将资源定位以遏制偷猎:

图 5.1 – 雨季开始时斑马群的画面
监测一个种群在地理上的移动有多种方式。一种方法是在动物身上贴上卫星追踪标签,这些标签会上传每个标记动物的定位数据。这使得研究人员可以为每个动物构建路径,并汇总标记种群(可能只包括一个物种或几个感兴趣的物种)的结果。例如,在斑马群中,也许在雨季之前,一个保护团队已经用标签标记了 10 只斑马,这些标签将每小时追踪斑马的位置,持续几周。虽然我们预计这 10 只动物将遵循从一座公园到另一座公园的相同的一般路径,但个体可能以不同的速度迁徙,走稍微不同的路线,或者在不同的地点停下来寻找食物和水。这些数据允许研究人员识别出群内行为偏离群体大多数的亚种群。
另一种在地理上追踪动物种群的方法是使用隐藏在可能被感兴趣物种频繁出没的地点(如水坑、森林中的空地或健康的珊瑚礁)的陷阱相机。例如,假设公共卫生官员已经注意到孟加拉国阿特拉伊河附近村庄的眼镜王蛇咬伤事件有所增加(图 5**.2),并希望了解当地的眼镜王蛇种群,以便制定防止人类与眼镜王蛇互动的政策。
或许可以调整工作时间,以防止在特定时间或季节里,农业工人进入被眼镜王蛇频繁出没的地区。官员可以在咬伤事件更为常见的地区设置陷阱相机,以捕捉使用在陷阱相机中的胶片整个生命周期内的眼镜王蛇图像。根据咬伤密度,在感兴趣的区域设置多个相机,并通过每个相机追踪包括眼镜王蛇在内的有毒蛇类的种类、每天的时间、种类以及每个相机识别的个体蛇的数量。然后,这些数据将指导有关人口流动和蛇类控制策略的政策,以减轻对公共安全的威胁。

图 5.2 – 孟加拉国乡村眼镜王蛇的插图
探索捕捉植物分布和疾病的方法
植物分布和疾病的数据捕获涉及一种不同的方法,因为植物通常不会跨越地理区域移动。手动数据收集需要人类对植物物种和疾病的识别,这可能是不可靠的,并且需要很长时间才能收集到有意义的数据。然而,自动驾驶车辆和无人机提供了一种在广阔地理区域内捕获植物图像和视频的方法,这些图像和视频可以用在研究区域本土植物图像数据上训练的卷积神经网络(CNNs)进行处理。例如,哥伦比亚的农民可能希望通过在每周捕获的区域农场无人机或漫游车数据上运行咖啡锈分类器 CNN 来早期识别咖啡锈的实例,以避免作物损失(图 5.3 中的示例)。显示潜在咖啡锈的图像可能会触发一个系统警报,为农民提供农场上的地理位置或植物识别编号。

图 5.3 – 一张用于扫描哥伦比亚咖啡农场上咖啡锈的咖啡树图像
然而,对植物的现场记录文档在研究可能存在新植物物种的地区可以是一个有用的工具。刚果盆地和亚马逊盆地的大部分地区相对未开发,识别潜在的新植物物种可能有助于了解生态系统的重要部分,可能的用于治疗人类疾病的药物,或识别外来物种的威胁。
侵入性植物可能威胁到生态系统。新物种可能预示着新化学物质的发现。让我们考虑一位在亚马逊进行实地考察的植物学家,她遇到了一种以前从未见过的蘑菇类型(图 5.4)。为了确认这是一种新的蘑菇物种,我们的植物学家会拍照,收集样本进行基因分析,并记录她遇到蘑菇的生态系统。

图 5.4 – 一种可能的新蘑菇物种的插图
所有这些数据收集方法都创建了空间数据,其中一些区域可能或可能不在物理上相邻。在地理位置上相隔甚远的地理区域发现的物种可能对应于不同的种群,这些种群将受到不同的人类和环境因素的影响。将此数据视为空间数据并应用一些图论工具可以帮助在生态数据分析中解析出感兴趣的亚种群。
在许多情况下,收集植物生物样本或给动物放置追踪标签是不切实际的。然而,无人机和其他自主车辆可以拍摄该地区的植物和动物的照片(图 5.5),使研究人员能够通过一种特殊的深度学习算法从图像中识别物种,并从深度学习结果中构建网络。

图 5.5 – 一幅森林溪流的插图,通过深度学习算法可以从中识别出植物
现在我们已经知道了如何收集生态数据,让我们探索一些来自图论的工具,这些工具将帮助我们分析来自不同地理区域的收集到的生态数据。
谱图工具
邻接矩阵和邻接矩阵中的顶点度包含了关于网络中顶点连通性的信息。对于一个无向网络,网络的拉普拉斯矩阵是通过从度矩阵中减去邻接矩阵得到的(即 L = D - A,其中 D 是度矩阵,A 是邻接矩阵)。这个矩阵包含了关于网络许多重要属性的信息,包括连通分量的数量、可以将网络分离成单独组件的最稀疏割,以及网络中连接的整体强度。
连通性是图论中的一个重要概念。一个连通网络是指所有顶点之间都存在路径的网络;一个不连通网络是指某些顶点没有到达其他所有顶点的路径。连通网络可以通过切割边来分离;最小割集是需要移除的最少边,将网络分割成两部分以断开连通网络。这些值不仅与图论中与传播过程和其他定义在网络上微分方程相关的理论结果相联系,而且这些信息还告诉我们如何分离网络上的群体。
为了获得这些信息,我们需要对拉普拉斯矩阵进行分解以获得特征向量和特征值(网络频谱)。有时,我们首先对拉普拉斯矩阵进行归一化;在谱聚类中,这不如从频谱计算特定的图论值那样必要。然后,我们找到拉普拉斯矩阵的特征值和特征向量。在实践中,这是通过算法而不是通过直接的线性代数运算来完成的。
从此过程中获得的第二个特征值对应于菲德勒值(也称为代数连通性);此值计算网络中存在多少个连通分量,并关系到网络的鲁棒性。相应的特征向量将网络划分为不同的网络,从而为网络上的分组划分提供两个聚类的解决方案。在谱聚类中,将网络划分为两个单独网络的过程可以重复进行,直到达到预定义的停止点(例如,总聚类数)。
从生态数据构建的空间网络上的谱聚类允许研究人员划分出动物迁徙的区域,区分可能孤立的种群,以及记录植被类型或农作物病害的差异。让我们设置一个简单的例子,并探索计算谱聚类的不同方法。
使用谱图工具聚类生态种群
考虑一位在加蓬的研究者,他希望了解洛昂戈国家公园保护区内加蓬蝰蛇种群之间的相互连通性(图 5**.6)。蛇在公园的七个区域(由顶点表示)被标记,它们的标签记录了它们下一个月的位置。如果蛇的栖息地与多个区域重叠,它们通常会在这几个区域之间移动。可能存在多个蛇种群,为不同的蛇种群提供不同的领地。如果两个区域共享一个区域种群,那么对应这两个区域的两个顶点将有一条边。如果没有蛇在这几个区域之间迁徙,两个顶点将不会共享边,可能代表不同的种群。孤立的种群往往更容易受到气候变化、偷猎和栖息地丧失的影响;了解物种和个体种群范围对于保护工作至关重要。

图 5.6 – 丛林地面上加蓬蝰蛇的插图
让我们使用Script 5.1创建一些关于蛇种群移动的数据:
#create snake area network adjacency matrix
import numpy as np
import networkx as nx
np.random.seed(0)
adj_mat = [[1,1,1,0,0,0,1],
[1,1,1,0,0,0,0],
[1,1,1,0,0,0,0],
[0,0,0,1,1,1,0],
[0,0,0,1,1,1,0],
[0,0,0,1,1,1,1],
[1,0,0,0,0,1,1]]
adj_mat = np.array(adj_mat)
在实践中,地理区域很少与数据集中所有其他区域共享边界。使用Script 5.1空间加权组件(权重总和)对我们的蛇重叠邻接矩阵(adj_mat)进行加权,以推导出加权邻接矩阵(adj_mat_w):
#create spatial weight matrix
weights_total = [[1,1,1,0,0,0,1],
[1,1,1,0,0,0,0],
[1,1,1,0,0,0,0],
[0,0,0,1,1,1,1],
[0,0,0,1,1,1,1],
[0,0,0,1,1,1,1],
[1,0,0,1,1,1,1]]
weights_total = np.array(weights_total)
adj_mat_w=np.multiply(adj_mat,weights_total)
我们可以创建并探索我们的度矩阵,以及我们的拉普拉斯矩阵(从度矩阵中减去邻接矩阵)。让我们将此信息添加到Script 5.1中:
#explore degree and Laplacian matrices
degree_matrix=np.diag(adj_mat_w.sum(axis=1))
laplacian_matrix=degree_matrix-adj_mat_w
print(degree_matrix)
print(laplacian_matrix)
度矩阵编码了连接到给定顶点的顶点数量,并作为中心性的基本度量。中心节点具有高度分数,而更孤立的区域可能具有零或一度。我们关于蛇种群重叠的网络在整个网络中具有类似的度中心性度量:
[[4 0 0 0 0 0 0]
[0 3 0 0 0 0 0]
[0 0 3 0 0 0 0]
[0 0 0 3 0 0 0]
[0 0 0 0 3 0 0]
[0 0 0 0 0 4 0]
[0 0 0 0 0 0 3]]
现在我们来看拉普拉斯矩阵,它编码了我们将在谱分解和聚类中使用的连接信息:
[[ 3 -1 -1 0 0 0 -1]
[-1 2 -1 0 0 0 0]
[-1 -1 2 0 0 0 0]
[ 0 0 0 2 -1 -1 0]
[ 0 0 0 -1 2 -1 0]
[ 0 0 0 -1 -1 3 -1]
[-1 0 0 0 0 -1 2]]
我们有多种方法可以计算 Fielder 矢量以获得我们的谱聚类结果。我们将通过两种方法使用 Python 来计算。根据你的 NetworkX 版本,你可能需要将 nx.from_numpy_matrix 替换为 nx.from_numpy_array。根据问题的规模,使用类似于我们在 Script 5.1 中添加的线性代数求解器可能更容易:
#define Fiedler vector and obtain clustering
G = nx.from_numpy_matrix(adj_mat_w)
ev = nx.linalg.algebraicconnectivity.fiedler_vector(G)
labels = [0 if v < 0 else 1 for v in ev]
labels
nx.draw(G,with_labels=True, node_color=labels)
这显示了两个不同的蛇群汇聚到我们洛昂戈国家公园采样区的第六个区域(以及留在确切相同区域的蛇,用环表示),如图 图 5**.7 所示:

图 5.7 – 蛇群谱聚类
Scikit-learn 提供了一个谱聚类包,我们通过将其添加到 Script 5.1 中提供了一个替代的计算方法。如果在 Windows 上遇到警告信息,请不要惊慌;这不是错误。现在让我们将内容添加到 Script 5.1 中:
#perform spectral clustering with sklearn
from sklearn.cluster import SpectralClustering
from sklearn import metrics
sc = SpectralClustering(2, affinity='precomputed', n_init=100)
sp_clust=sc.fit(adj_mat_w)
sc_labels=sp_clust.labels_
nx.draw(G,with_labels=True, node_color=sc_labels)
如预期,scikit-learn 包产生了与我们的线性代数方法相同的网络划分 (图 5**.8):

图 5.8 – Scikit-learn 蛇群谱聚类
谱聚类不仅限于网络数据或生态数据。任何数值数据集都可以使用谱聚类进行聚类。在图像和文本分析中,我们通常没有很多预标记数据的实例,手动标注数据既耗时又可能错过数据集中的一些重要类别,如果这些类别没有出现在某人手动评分的小样本中。谱聚类使我们能够通过这些领域的工具嵌入数据,基于最近邻创建网络,并应用谱聚类为数据集获取标签,然后可以使用这些标签来训练分类算法。这个过程被称为 半监督学习,自然语言处理和图像分析中的现实世界数据科学通常依赖于这种方法从数据集中构建分类模型。让我们通过考虑一个基于文本的生态数据集来观察这一过程。
文本上的谱聚类
让我们考虑一个生态笔记数据集,包括五个健康和五个不健康的本地公园。虽然这些笔记不如完整的生态调查那么详尽,但它们应该展示如何创建一个半监督学习流程来分类生态系统健康。以下是笔记中一个健康生态系统的例子:
"Mangrove ecosystem. Numerous butterflies, lizards, and insects. Gumbolimbo trees. Soggy soil.', 'Tropical pines. Scat shows raccoon and coyote populations here. Recent controlled burn."
数据集中一个不健康生态系统的例子如下:
"Small grass area. Some saplings. Gravel paths. Many cars parked in non-parking zones. Lots of run-off."
虽然我们可以自己标注这些笔记,但我们将使用光谱聚类来了解半监督学习如何用于为可能无法实现或不可靠的更大数据集生成训练数据标签。首先,我们将使用Script 5.2导入我们的数据:
#set up needed packages
import pandas as pd
import numpy as np
import os
#you may need to install sentence_transformers
#if the package is not already in your environment
#!pip install sentence_transformers
from sentence_transformers import SentenceTransformer
#import first network's data
File ="C:/users/njfar/OneDrive/Desktop/SC_Notes.csv"
pwd = os.getcwd()
os.chdir(os.path.dirname(File))
mydata = pd.read_csv(os.path.basename(File),encoding='latin1')
为了嵌入我们的数据,我们将使用Script 5.2:
#prepare data
mydata['Notes']=mydata['Notes'].fillna(value=".")
#strip to text for input into BERT model
text_list=list(mydata.Notes)
#get BERT--768 vectors;
#note: you will need enough memory to load the transformer model
sbert_model1 = SentenceTransformer('all-mpnet-base-v2')
#encode data with BERT
encoded_text1=sbert_model1.encode(text_list)
现在我们已经嵌入我们的数据,我们可以创建我们的最近邻图。由于我们的样本量很小,我们将通过向Script 5.2添加内容来考虑一个点的三个最近邻:
#make nearest neighbors graph
from sklearn.neighbors import kneighbors_graph
n_adj = kneighbors_graph(encoded_text1, n_neighbors=3).toarray()
现在我们已经准备好运行我们的光谱聚类并检查我们的数据在这个算法中的聚类情况。让我们向Script 5.2添加内容以观察其效果:
#run spectral clustering
from sklearn.cluster import SpectralClustering
from sklearn import metrics
sc = SpectralClustering(2, affinity='precomputed', n_init=100)
sp_clust=sc.fit(n_adj)
sc_labels=sp_clust.labels_
print(sc_labels)
从我们打印的标签中,我们可以看到生态系统3、7、8和10形成一个簇,而生态系统1、2、4、5、6、7和9形成另一个簇。让我们通过向Script 5.2添加内容来查看我们的笔记样本,看看这种方法通过添加内容到Script 5.2如何找到音调或主题上的差异:
#examine notes
print(text_list)
我们可以看到笔记3、4、7、8和10与我们的样本中的其他部分相比是不健康的生态系统。光谱聚类似乎没有发现所有这些差异,但可能另一种类型的文本嵌入会比我们选择的更好地区分音调。也可能更少的邻居或更大的样本量会提供更好的结果。然而,通过我们的光谱聚类算法,我们确实找到了五个不健康生态系统中的四个。如果有人审查结果,就不需要切换很多标签(20%)来生成用于训练分类模型的正确训练标签。我们的数据集的第二列包括正确的音调分类标签。让我们通过向Script 5.2添加内容将我们的 BERT 嵌入转换为 DataFrame:
#create training dataset for supervised learning
#turn BERT embedding into array
BERT_array1=np.array([x for x in encoded_text1])
#convert to dataframes
BERT_df1=pd.DataFrame(BERT_array1)
现在,让我们将我们的数据分为训练集和测试集(分别占 80%和 20%),创建一个k最近邻分类器(根据其两个最近邻的标签对点进行分类,其中k = 2),并通过向Script 5.2添加内容来衡量测试集的错误率:
#create KNN classifier and test accuracy
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
#get predictors and outcome
BERT_df1['Type']=mydata['Type']
df_train, df_test = train_test_split(BERT_df1,test_size=0.2, random_state=0)
X = df_train.iloc[:,0:767]
y = df_train.iloc[:,768]
X_test = df_test.iloc[:,0:767]
y_test = df_test.iloc[:,768]
#create KNN classifier and print accuracy
eu=KNeighborsClassifier(n_neighbors=2,metric='euclidean')
eu.fit(X,y)
print(eu.score(X_test,y_test))
我们的数据分割得到 100%的准确率,这表明没有生态系统类型的误分类。根据您机器上的种子和随机数生成器,您的结果可能会有所不同。然而,这种方法似乎适用于这个数据集。我们通过嵌入处理文本数据、通过光谱聚类获得良好的标签创建起点,然后创建分类模型,为我们的数据集产生了一个高准确率的分类系统。
摘要
在本章中,我们学习了如何为各种数据科学问题收集生态数据。在简要介绍了光谱聚类理论之后,我们通过我们关于加蓬蝰蛇分布的例子展示了如何通过光谱聚类解析出不同的动物种群。最后,我们通过生态系统笔记数据示例探讨了可用于半监督学习管道的最近邻网络光谱聚类。在第六章中,我们将介绍中心性度量,并使用它们来寻找股票定价的临界点。
参考文献
Angelici, F. M., Effah, C., Inyang, M. A., & Luiselli, L. (2000). 自由游荡加蓬蝰蛇(Bitis gabonica)的移动、活动模式和栖息地使用初步放射性追踪研究。生态学、陆地与生命杂志,55(1),45-55。
Corrales, D. C., Figueroa, A., Ledezma, A., & Corrales, J. C. (2015). 用于哥伦比亚咖啡锈病检测的经验多分类器。见计算科学及其应用—ICCSA 2015:第 15 届国际会议,加拿大班夫,AB,2015 年 6 月 22-25 日,第 I 部分 15(第 60-74 页)。Springer 国际出版社。
Froese, G. Z., Ebang Mbélé, A., Beirne, C., Atsame, L., Bayossa, C., Bazza, B., ... & Poulsen, J. R. (2022). 耦合生态学狩猎者 GPS 自我跟踪以量化景观尺度上的村庄野味狩猎动态。非洲生态学杂志,60 (2),229-249。
Mutombo, F. K. (2012). 复杂网络中的长距离相互作用。
Ng, A., Jordan, M., & Weiss, Y. (2001). 关于光谱聚类:分析和算法。神经信息处理系统进展,14。
Nunez-Mir, G. C., Iannone III, B. V., Pijanowski, B. C., Kong, N., & Fei, S. (2016). 自动内容分析:解决生态学和进化中的大量文献挑战。生态与进化方法,7 (11),1262-1272。
Qi, X., Fuller, E., Wu, Q., Wu, Y., & Zhang, C. Q. (2012). 拉普拉斯中心性:加权网络的新中心性度量。信息科学,194,240-253。
Reimers, N., & Gurevych, I. (2019). Sentence-bert:使用 Siamese BERT 网络的句子嵌入。arXiv 预印本 arXiv:1908.10084。
White, S., & Smyth, P. (2005, April). 图中的社区发现光谱聚类方法。见2005 年 SIAM 国际数据挖掘会议论文集(第 274-285 页)。工业与应用数学学会。
第三部分:时间数据应用
第三部分介绍了时间数据应用,包括与股票市场波动预测、商品价格和销售量变化点分析以及通过动态动物交互网络传播的疫情相关的问题。在本部分,我们将概述基于顶点和边的中枢性度量、网络数据结构到单纯复形的扩展、三角闭包和动态疫情模型。
第三部分包含以下章节:
-
第六章,股票市场数据
-
第七章,商品价格/销售数据
-
第八章,动态社交网络
第七章:股票市场数据
在本章中,我们将介绍时间数据并深入探讨股票市场趋势分析。为了理解时间序列数据中的趋势,我们将回到网络上的中心性度量并介绍一些更高级的算法。最后,我们将使用我们的中心性度量分析随时间变化的股票定价数据,并确定不同股票在时间和空间上的行为变化,以预测价格波动和崩溃。
到本章结束时,您将能够将具有时间成分的数据集整理成一系列网络,并使用中心性指标分析随时间的变化。许多中心性指标在大规模网络中表现良好,尤其是在并行运行时。
具体来说,我们将涵盖以下主题:
-
时间数据简介
-
中心性指标简介
-
在时间切片中应用中心性指标
-
将网络指标扩展到时间序列分析
让我们从回到时间数据集和非基于网络的模型分析的限制开始。
技术要求
您需要 Jupyter Notebook 来运行本章中的实践示例。
本章的代码在此处可用:github.com/PacktPublishing/Modern-Graph-Theory-Algorithms-with-Python
时间数据简介
在第二章中,我们简要介绍了时间数据或以时间序列或一组时间序列形式的数据。时间序列数据跟踪许多不同行业的重要指标:每日商店销售量、每周软件产品营销线索量、每日新兴疾病的发病率、人口中每年(如吸烟或蔬菜消费)的行为率,或每小时跟踪市场趋势的股票价格。许多相关因素可以影响随时间的变化趋势,并且如果事先知道这些因素,一些模型会直接考虑这些因素。
然而,考虑一个位于城市中宝石店销售趋势的新宝石店的情况,该城市中宝石店是一种新现象,可能在哈法和特拉维夫之间某个乡村地区(图 6**.1)。因此,关于可能影响销售的因素知之甚少。在挖掘可能影响销售的因素时,理解时间序列数据中存在的趋势至关重要。然而,时间序列数据集对许多监督学习方法,如随机森林模型或线性回归,提出了重大挑战。在某个时间点,销售不是独立的;它们依赖于影响前几日销售的因素,限制了监督学习和许多类型的无监督学习的使用。预测因子的缺乏也提出了挑战。

Figure 6.1 – 以色列特拉维夫和海法之间半路的一家宝石店的插图
幸运的是,对于我们的宝石店来说,许多算法被设计来处理时间序列数据,例如自回归积分移动平均模型(ARIMA 模型)、奇异谱分析(SSA)和霍尔特-温特斯模型。然而,时间序列行为的变化(峰值、崩盘和方差变化)对这些模型构成了挑战。捕捉和预测这些变化对于你想要创建预测模型或挖掘影响时间序列值因素至关重要。在我们的宝石店示例中,旅游的季节性、该地区的冲突以及假日旅行促销活动可能会影响我们店铺所在路线的流量。
一个拥有丰富且非常复杂的时间序列数据的行业是金融。许多社会和经济因素影响股票价格,而梳理股票价格波动中的关系和随机性是金融行业的基础。让我们来看看股市定价数据以及分析股市定价数据的常见任务。
股市应用
近年来,金融部门已从以专家驱动的股市洞察模式转变为更基于机器学习的方法。机器学习模型筛选出新兴趋势,并捕捉到可能逃过人类仔细研究数据的人的微妙趋势。这种策略还允许分析师处理比人类能够处理的数据集大得多的数据集,包括许多不同的部门、国际证券交易所,甚至个别前沿市场。通过收集更多洞察力,投资者和投资管理公司可以在不那么多专业知识的情况下投资于更广泛的市场。
股市分析涵盖了广泛的应用领域。投资者可以在某些市场部门(如科技或农业)内进行投资,或者跨市场进行投资。他们可以关注短期收益(包括在几分钟或几小时内获得的收益)和长期收益(可能跨越数十年)。他们还可以关注外国市场,其中股票价格可能受到与影响本地市场价格的因素非常不同的因素。所有这些场景都指导着分析工作以及收集用于分析的数据的时间尺度。
通常,分析股市数据涉及评估随时间变化的各种趋势。股票的价格可能在一段时间内保持恒定,经历逐渐的价格增长和减少,突然崩盘,或者指数式增长。每种情况都为投资者在短期和长期内的购买/销售策略提供了不同的建议。图 6.2 展示了一个假设的股票,它表现出许多这些模式:

图 6.2 – 股票数据趋势示例,包括停滞期、增长、缩水和崩盘
我们可以在图 6.2中看到,股票 A 在 2022 年开始时价格稳定,然后在 2022 年 7 月左右进入增长阶段。这个增长阶段一直持续到 2023 年初,然后它再次进入一个稳定的定价阶段。在 2024 年 3 月发生事件后,股票 A 的价格崩溃,然后进入一个价格下降的时期,直到我们追踪的时间段结束。
通常,这些趋势不会孤立发生。共享供应链的公司股票可能会表现出类似的趋势。同一行业的股票可能会表现出相似或相反的趋势,这取决于公司之间的关系或行业新闻。在共享贸易或防御区域,由于国家及其市场之间的社会政治联系(如大多数经济体中的 COVID 崩溃),股票也可能会表现出类似的趋势。
临界点,趋势发生剧烈变化的地方,在金融分析中吸引了大量关注。这些代表了在加速增长之前投资的机会,或者在崩溃之前从市场或特定投资中撤出的警告。然而,检测这些趋势挑战了许多在市场分析中常用的工具。
幸运的是,一些新的工具,包括一些基于网络科学的工具,比传统方法更容易识别临界点。许多工具依赖于市场、行业或股票之间的大规模耦合。随着越来越多的股票(或市场)表现出类似的行为,系统就变得容易受到可能导致其崩溃的外部影响(如供应链问题、新立法或大流行病)的影响。仅仅计算个别股票或市场行业之间的相关性可以提供一些洞察力,但将相关性(在时间切片内)转换为网络,使我们能够利用许多深入探究其相关性及其随时间变化的网络科学工具。具体来说,中心性指标允许我们量化并分类网络中存在的关系。让我们探索一些这些中心性指标。
中心性指标简介
我们在第三章中遇到了一些中心性指标,其中我们学习了桥梁和枢纽。许多基于顶点的中心性指标计算与枢纽相关的属性——顶点与其最近邻及其最近邻的连接。许多基于边的中心性指标计算桥梁属性,其中顶点附近的边充当不同枢纽之间的连接器。
度是最简单的基于顶点的中心性度量,我们在第五章中遇到了它。度中心性简单地是直接连接到感兴趣顶点的顶点数量。许多基于拉普拉斯的度量或算法依赖于算法计算中的度矩阵。表面上,这个度量似乎捕捉了重要的枢纽属性;具有高度度中心性的顶点将在网络中拥有很大的影响力(因此,可能是一个很好的干预目标)。它也很好地扩展到非常大的网络。然而,度中心性的一个局限性是它没有意识到顶点在超出任何直接连接到邻居的位置;具有低度中心性的顶点可能连接到许多具有高度中心性的顶点,这使得它在网络行为和结构上的影响力比其度中心性所暗示的更大。
特征向量中心性及其变体(包括PageRank和Katz 中心性)通过考虑超出直接邻居的连通性,提供了一个更全面的基于顶点的中心性度量。因此,特征向量中心性会给我们的假设低度中心性顶点赋予高分数,因为这个顶点靠近非常连通的顶点。技术上,为了找到网络中每个顶点的特征向量中心性,我们可以在邻接矩阵上执行特征分解。由于邻接矩阵不包含负值,我们可以假设第一个特征值是最大的,其特征向量为我们顶点提供特征向量中心性分数。
PageRank 中心性通过用执行随机游走以确定邻接属性而构建的调整邻接矩阵替换邻接矩阵,从而扩展了特征向量中心性并增加了其灵活性。此外,随机游走者属性,其中随机游走可以以低概率穿越图中的未连接区域,创建了一个调整后的邻接矩阵,该矩阵是连通的。然后,在执行调整邻接矩阵上的特征分解之前,对调整后的邻接矩阵进行缩放,该分解用于计算特征向量中心性分数。因此,PageRank 中心性分数提供了灵活性。此外,使用调整邻接矩阵进行此计算通常更容易、更快,使得算法能够很好地扩展到包含数亿个顶点的网络。
基于边的中心性度量捕捉了对于传播过程和不同枢纽之间连通性重要的网络基础设施。中介中心性是最常见的基于边的中心性指标之一,它捕捉了包含给定顶点的最短路径的相对数量,这些最短路径存在于网络中的所有最短路径中。考虑一个有 10 条最短路径的网络,其中 8 条包含一个特定的顶点。如果没有这个顶点,许多最短路径将不存在,这在社交网络中的传播过程或交通网络中的路线效率方面会给网络带来很大不便。然而,中介中心性扩展性不佳,不应在没有某种操作并行化的情况下用于大型网络。
最近的一个基于边的中心性网络已被证明是寻找股市转折点的有效工具。Forman-Ricci 曲率是一个基于几何的工具,它考虑了与感兴趣边相邻的边。在无权网络中,Forman-Ricci 曲率通过从 2 中减去连接到感兴趣边的两个顶点的度中心性来计算。常数 2 代表通过感兴趣边连接的两个顶点之间的连接。连接到边的两个顶点的度中心性计算了与我们的感兴趣边相邻的边的数量(减去通过该边连接的顶点,从而获得我们的常数 2)。在图 6-3中,我们看到三个顶点:两个与中间顶点相关联的单条边的顶点(两个顶点的度中心性均为 1)和一个连接到两个外顶点的中间顶点(度中心性为 2)。因此,两条边都具有-1 的 Forman-Ricci 曲率,因为两个顶点度中心性的总和为 3(2 - 3 = -1)。

图 6.3 – 一个展示 Forman-Ricci 曲率的示例网络,其中中间顶点从第一个和第三个外顶点中拉取
要从这种边度量中获得顶点中心性度量,我们可以对每个顶点的边度量进行求和来评分顶点。在我们的例子图 6.3中,外顶点具有-1 的 Forman-Ricci 顶点中心性,因为它们只连接到一条边。然而,中间顶点连接到两条边,Forman-Ricci 曲率也为-1,因此它的 Forman-Ricci 顶点中心性为-2。因为这个中心性指标依赖于低成本的计算,所以它很好地扩展到大型网络,并且当中介中心性不可行时可以用作基于边的中心性评分的替代方案。
现在,让我们探索一些股市数据,看看网络科学如何帮助我们识别关键趋势。
在时间切片上应用中心性度量
纳斯达克股票市场是位于纽约市的一家美国证券交易所,包括苹果、Alphabet、英伟达和微软等上市公司。Kaggle 在公共许可下提供了纳斯达克股票价格的全历史记录(www.kaggle.com/datasets/jacksoncrow/stock-market-dataset?resource=download),这可以为我们提供这些四家科技公司在其所有上市公司至 2020 年 4 月 1 日之间的股票数据。我们已经为您整理了数据,以包括这些四支股票在 2004 年 8 月 19 日至 2020 年 4 月 1 日期间的数据。让我们看一下这些数据,看看可能存在哪些趋势(图 6.4):

图 6.4 – 2004 年 8 月 19 日至 2020 年 4 月 1 日的纳斯达克精选股票收盘价
在图 6.4中,我们可以看到 Alphabet 的价格一直较高,但所有股票都表现出典型的趋势,即在这段长期交易期间的价格稳定、下跌、上涨以及上升或下降趋势。值得注意的是 2020 年的趋势,股票经历了 COVID-19 的暴跌。波动期包括 2008-2009 年和 2016-2020 年。
时间序列分析的一个重要方面是将时间序列数据窗口化成重叠的部分。虽然可以通过网格搜索来优化窗口化,但窗口化往往更多的是一种艺术而不是科学。窗口的选择会影响可以捕捉到的趋势的时间长度。在我们的股票市场数据中,窗口长度限制了我们可以搜索趋势的时期,从而限制了在最后一个窗口之后的预测市场行为的时间段。窗口过大可能会错过影响短期市场行为的重要趋势。窗口过小可能会限制预测到最近的未来。
我们将选择 5 个交易日的窗口,或者大约一周的股票数据。这使我们能够捕捉到与日内交易相关的趋势,股票基于波动性频繁交易。我们的网络指标应该对基于波动的快速盈利交易表现良好,因为它们捕捉到两只股票之间的相关性增加。
另一个对窗口化时间序列数据很重要的方面是重叠的选择。在我们的例子中,我们将选择最大重叠(4 天重叠)以最大化我们对每日趋势的敏感性。在其他应用中,可能需要更少的重叠来研究更长的时间趋势。请注意,我们的例子使用的是我们机器上的一个路径。您的文件路径将与我们不同。
让我们导入我们的包,并使用Script 6.1将数据加载到 Python 中,以开始我们的工作:
#import packages
import igraph as ig
from igraph import Graph
import numpy as np
import pandas as pd
import os
import matplotlib as plt
#import stock data
File="C:/users/njfar/OneDrive/Desktop/AAPL_GOOGL_Stock_2004_2020.csv"
pwd=os.getcwd()
os.chdir(os.path.dirname(File))
mydata=pd.read_csv(os.path.basename(File),encoding='latin1')
现在我们已经导入了数据,我们可以添加一个循环,将我们的时间序列窗口设置为重叠 4 天的 5 天周期。这种窗口策略提供了找到趋势每日变化最佳机会。然后,我们将创建该时间切片内四只股票之间的相关性,将这些相关性阈值化以限制我们的分析到高相关性,从这些阈值创建一个无权网络,并在时间切片上分析 PageRank 集中度、度集中度、介数集中度和 Forman-Ricci 曲率集中度。我们还将保存每个无权网络以供将来检索,以及每个时间切片的网络度量及其平均值。让我们将这些部分添加到Script 6.1中:
#script to create time slices, derive networks,
#and compute centrality metrics
stock_networks=[]
bet_t=[]
deg_t=[]
eig_t=[]
vcurv_t=[]
bet_ave=[]
deg_ave=[]
eig_ave=[]
vcurv_ave=[]
for Date in range(5,3932):
#wrangle data into graph
data=mydata.iloc[(Date-5):(Date),1:5]
cor=np.corrcoef(data.transpose())
cor[cor>=0.5]=1
cor[cor<0.5]=0
stock_data=Graph.Adjacency(cor)
stock_networks.append(stock_data)
#derive some centrality metrics
d=Graph.degree(stock_data)
deg_t.append(d)
deg_ave.append(np.mean(d))
b=Graph.betweenness(stock_data)
bet_t.append(b)
bet_ave.append(np.mean(b))
e=Graph.pagerank(stock_data)
eig_t.append(e)
eig_ave.append(np.mean(e))
#create Forman–Ricci curvature calculations
ecurvw=[]
for edge in stock_data.es:
s=edge.source
t=edge.target
ecurvw.append(2-d[s]-d[t])
vcurvw=[]
for vertex in stock_data.vs:
inc=Graph.incident(stock_data,vertex)
inc_curv=[]
for i in inc:
inc_curv.append(ecurvw[i])
vcurvw.append(sum(inc_curv))
vcurv_t.append(vcurvw)
vcurv_ave.append(np.mean(vcurvw))
这个脚本应该在你的机器上快速运行。如果你在分析中包含大量股票,你可能希望并行运行脚本以节省时间,或者排除介数集中度,因为随着顶点数量的增加,介数集中度扩展得不好。
现在我们已经计算了我们的指标,让我们检查我们的时间序列窗口集中度指标之间的相关性,以了解不同的指标是如何相互关联的。鉴于 Forman-Ricci 曲率依赖于度集中度指标,我们预计会看到一个强的相关性。我们可以在Script 6.1中添加以获得这些相关性:
#examine correlations among metrics across the time series
print(np.corrcoef(deg_ave,eig_ave))
print(np.corrcoef(deg_ave,bet_ave))
print(np.corrcoef(deg_ave,vcurv_ave))
print(np.corrcoef(eig_ave,bet_ave))
print(np.corrcoef(eig_ave,vcurv_ave))
print(np.corrcoef(bet_ave,vcurv_ave))
你应该会看到度集中度和 Forman-Ricci 曲率集中度之间存在强烈的关联(在我们的分析中为-0.99),但其他集中度指标之间的相关性相对较弱(度集中度和 PageRank 集中度为-0.05,度集中度和介数集中度为 0.01,PageRank 集中度和介数集中度为 0.04,PageRank 集中度和 Forman-Ricci 曲率集中度为 0.04,介数集中度和 Forman-Ricci 曲率集中度为 0.05)。这表明在分析中,度集中度和 Forman-Ricci 曲率可能是可互换的,尽管更复杂的 Forman-Ricci 曲率度量可能捕获更多可能对某些趋势相关的信息。然而,这些相关性是否适用于其他数据集尚不清楚,尽管由于 Forman-Ricci 曲率公式依赖于度集中度,度集中度和 Forman-Ricci 曲率在无权网络中将在一定程度上相关。
让我们可视化网络度量随时间的变化趋势,看看是否有任何模式出现或极端值突出,这可能会表明我们的股票定价行为发生变化。我们将向Script 6.1添加可视化代码来完成此操作:
#plot metric averages across time slices
time=range(0,3927)
plt.plot(time, deg_ave, label = "Degree Average")
plt.plot(time, eig_ave, label = "Pagerank Average")
plt.plot(time, bet_ave, label = "Betweenness Average")
plt.plot(time, vcurv_ave, label = "Forman–Ricci Curvature Average")
plt.legend()
plt.show()
这应该会给你一个类似于图 6.5的图表:

图 6.5 – 我们股票市场数据随时间切片的集中度平均值图
注意,PageRank 中心性没有出现在我们的图表中。PageRank 和介数中心性占据相似的范围值,在我们的图表中掩盖了 PageRank 中心性。然而,我们在图表中确实看到平均中心性值的变化是规律出现的,这表明我们的中心性值可能随着时间的推移捕捉到市场的不同状态。
我们 Forman-Ricci 曲率中心性的平均值表明市场相对稳定的时期,其中值接近零。两个显著的相对稳定时期出现在我们的时间序列开始时(大约 2004-2006 年)以及 2010 年代中期至后期。然而,当我们接近 2008 年和 2020 年时,我们的股票之间的相关性在两次重大市场崩盘之前显著增加。
很可能我们的阈值值选择影响了我们的结果。为了聚焦于股票行为紧密耦合的时期,让我们将阈值值提高到0.9并重新运行Script 6.1:
#script to create time slices, derive networks,
#and compute centrality metrics
stock_networks=[]
bet_t=[]
deg_t=[]
eig_t=[]
vcurv_t=[]
bet_ave=[]
deg_ave=[]
eig_ave=[]
vcurv_ave=[]
for Date in range(5,3932):
#wrangle data into graph
data=mydata.iloc[(Date-5):(Date),1:5]
cor=np.corrcoef(data.transpose())
cor[cor>=0.9]=1
cor[cor<0.9]=0
stock_data=Graph.Adjacency(cor)
stock_networks.append(stock_data)
#derive some centrality metrics
d=Graph.degree(stock_data)
deg_t.append(d)
deg_ave.append(np.mean(d))
b=Graph.betweenness(stock_data)
bet_t.append(b)
bet_ave.append(np.mean(b))
e=Graph.pagerank(stock_data)
eig_t.append(e)
eig_ave.append(np.mean(e))
#create Forman–Ricci curvature calculations
ecurvw=[]
for edge in stock_data.es:
s=edge.source
t=edge.target
ecurvw.append(2-d[s]-d[t])
vcurvw=[]
for vertex in stock_data.vs:
inc=Graph.incident(stock_data,vertex)
inc_curv=[]
for i in inc:
inc_curv.append(ecurvw[i])
vcurvw.append(sum(inc_curv))
vcurv_t.append(vcurvw)
vcurv_ave.append(np.mean(vcurvw))
现在,我们可以重新运行我们的相关性分析,以了解阈值值可能如何影响指标之间的任何相关性。让我们在Script 6.1中重新运行我们的相关性分析:
#examine correlations among metrics across the time series
print(np.corrcoef(deg_ave,eig_ave))
print(np.corrcoef(deg_ave,bet_ave))
print(np.corrcoef(deg_ave,vcurv_ave))
print(np.corrcoef(eig_ave,bet_ave))
print(np.corrcoef(eig_ave,vcurv_ave))
print(np.corrcoef(bet_ave,vcurv_ave))
与我们之前的结果相比,你应该会看到一些显著的不同。度数和 PageRank 中心性仍然不太相关(-0.04),这与 PageRank 中心性和介数中心性(0.003)以及 PageRank 和 Forman-Ricci 曲率中心性的相关性(0.04)相呼应。然而,度数和介数中心性现在中度相关(0.44),介数和 Forman-Ricci 曲率中心性也是如此(-0.39)。尽管略低于我们之前的阈值(-0.98),但度数和 Forman-Ricci 曲率中心性仍然高度相关。
让我们绘制我们的新结果,以调查在初始分析中由于低阈值值而被掩盖的任何趋势。我们可以使用Script 6.1重新绘制:
#plot metric averages across time slices
time=range(0,3927)
plt.plot(time, deg_ave, label = "Degree Average")
plt.plot(time, eig_ave, label = "Pagerank Average")
plt.plot(time, bet_ave, label = "Betweenness Average")
plt.plot(time, vcurv_ave, label = "Forman–Ricci Curvature Average")
plt.legend()
plt.show()
这应该会产生与图 6**.5非常不同的图表。在图 6**.6中,我们可以比在图 6**.5中更清楚地看到波动性时期:

图 6.6 – 在时间切片上使用 0.9 阈值的网络中心性指标图
图 6**.6显示了更多接近 0 的 Forman-Ricci 曲率值,这表明在这些时期市场波动性较低。我们在图表中看到一些波动性增加的时期(更极端的 Forman-Ricci 曲率值),表现为图表中的下降。这些强烈的波动性和耦合时期发生在 2008 年和 2020 年的崩溃之前,以及崩溃后的快速重建时期。这些是投资者感兴趣的时间段,因为在这些时期,大量资金要么损失要么获得。
通常情况下,网络指标似乎能够很好地捕捉市场波动性,尤其是在对数据进行高阈值应用时。这表明了近期文献中提到的观点:网络指标是识别市场波动性(在崩溃之前)和指数增长的有用工具。实际上,这些工具在 2020 年 COVID 崩溃之前很久就捕捉到了市场波动性的增长,如果投资者在市场出现问题之前注意到了波动性警告并撤资,那么在 2020 年之前的几个月里可能已经节省了收益。鉴于波动性和长期陡峭的增长,许多因素都可能引发重大崩溃。一场大规模或位置不佳的区域冲突、供应链的崩溃,或者科技行业政策的变化可能都会导致重大崩溃。
回到图 6.7,我们观察到在 2008 年崩溃之前和 2020 年崩溃之前存在非常不同的趋势。虽然 2020 年之前是一个长期的增长期,近期有几次小崩溃,而 2008 年之前则是相对稳定和缓慢的增长。鉴于这四只纳斯达克股票价格的波动性和加速增长,这些趋势使得市场在未来更容易受到大规模崩溃的影响,如果这些趋势在其他纳斯达克行业中也成立,那么我们预计近期的收益和损失将更加不确定,机会也会更多。

图 6.7 – 返回股票数据的图表
鉴于市场中的这些趋势,网络科学工具在股票市场分析中准备扮演一个关键角色。在将这些工具应用于股票市场数据或更一般的时间序列数据方面,相对较少的研究工作,而且很少有中心性指标被系统地研究。大量现有关于将中心性指标应用于理解随时间变化的股票市场趋势的研究涉及将网络扩展到包括多向关系。现在,让我们将注意力转向将网络应用于超过两个实体之间关系的扩展应用。
扩展网络指标用于时间序列分析
因为网络是拓扑对象,并且我们的相关矩阵可以使用任何值的阈值,所以可以将网络度量扩展到拓扑数据分析领域。网络捕捉实体之间的双向关系。然而,也存在三向、四向甚至更多向的交互。单纯复形将网络的概念扩展以捕捉这些更高数量的交互。三向交互表示为两条双向线界定的面(或三角形)。四向交互表示为四面体,由具有四向交互的三向面组成。这个过程可以继续到任何相互作用的值,其中低维交互形成高维交互的边界。单纯复形将存在于顶点之间的最高级交互收集到一个单一对象中。图 6.8展示了由相互、双向交互界定的三向交互的例子:

图 6.8 – 一个图解,展示了如何通过相互、双向交互定义三向交互
正如网络可以是加权的或无权的,单纯复形也可以在单纯复形内的多向交互中是加权的或无权的。此外,正如网络是由邻接矩阵构建的,单纯复形也是由每个多向交互级别的邻接矩阵(技术上称为边界矩阵)创建的。正如我们通常需要构建邻接矩阵从原始数据创建网络,我们也可以使用原始数据来定义数据中存在的多向交互。
首先,必须为原始数据定义一个关系度量。在我们的股票数据集中,我们选择了相关度量。在构建网络和单纯复形时,距离度量也常被使用,并且可以为数据集上的连续或离散测量定义许多、许多距离度量。一旦定义了度量,就将阈值或一系列阈值应用于度量矩阵,以定义彼此给定半径内的关系(由阈值定义)。构建单纯复形及其关系的两种主要选项存在:
-
通过点的并集定义多向关系,这些点的半径相互接触(称为Vietoris–Rips 复形)
-
计算连接点,这涉及到给定半径内点的相互重叠,其中所有连接点必须位于彼此的半径内(称为切赫复形)
简单复形的过滤涉及通过不同的度量阈值来改变半径。还记得我们如何应用不同的相关阈值来为我们的股票市场数据集产生不同的结果和见解吗?不同过滤级别的简单复形可以产生具有不同性质的不同简单复形,这些性质可能包含对分析师重要的信息。
让我们创建一个函数,使用Script 6.2定义双向交互(对应于网络)的 Vietoris–Rips 单纯复形:
#define Vietoris–Rips complex
from itertools import combinations
from numpy import linalg as LA
def graph_VR(points, eps):
points=[np.array(x) for x in points]
vr=[(x,y) for (x,y) in combinations(points, 2)
if LA.norm(x - y) <= 2*eps]
return np.array(vr)
现在,我们可以将此应用于我们的股票市场时间序列数据的第一个切片。我们将选择 1 和 10 作为起点,以了解哪些顶点对将包含在我们的单纯复形中(在这里,仅在双向交互级别)。让我们将其添加到Script 6.2中,以计算我们的股票市场时间序列数据第一个切片的 Vietoris–Rips 单纯复形:
#apply Vietoris–Rips with multiple thresholds to a slice of our stock #dataset
data=mydata.iloc[0:5,1:5]
vr1=graph_VR(data.transpose(),1)
vr2=graph_VR(data.transpose(),10)
我们可以通过在Script 6.2中添加以下内容来检查每个过滤中包含的顶点对:
#print the results
print("Vietoris–Rips Complex, Threshold=1:")
print(vr1)
print("Vietoris–Rips Complex, Threshold=10:")
print(vr2)
这为我们提供了每个过滤级别的顶点对,应该显示以下内容:
Vietoris–Rips Complex, Threshold=1:
[[0 1]
[0 2]
[1 2]
[1 3]
[2 3]
[2 4]
[3 4]]
Vietoris–Rips Complex, Threshold=10:
[[0 1]
[0 2]
[0 3]
[0 4]
[1 2]
[1 3]
[1 4]
[2 3]
[2 4]
[3 4]]
我们可以通过在Script 6.2中添加以下内容来通过双向交互可视化阈值 = 1 的复形:
edges1 = [(0,1),(0,2),(1,2),(1,3),(2,3),(2,4), (3,4)]
import networkx as nx
G1 = nx.Graph()
G1.add_edges_from(edges1)
nx.draw(G1,with_labels=True)
这给出一个类似于图 6**.9的图表,显示由双向交互连接的一组三个三角形:

图 6.9 – 双向交互的阈值 = 1 结果的可视化
类似地,我们可以通过在Script 6.2中添加以下内容来可视化我们的阈值 = 10 结果:
edges10 = [(0,1),(0,2),(0,3),(0,4),(1,2),(1,3),(1,4),(2,3),(2,4),(3,4)]
import networkx as nx
G10 = nx.Graph()
G10.add_edges_from(edges10)
nx.draw(G10,with_labels=True)
这应该给出一个类似于图 6**.10的图表,它显示了比阈值 = 1 结果更复杂的连接性:

图 6.10 – 双向交互的阈值 = 10 结果的可视化
这些结果表明,不同的半径阈值会产生不同的网络,就像我们的相关阈值产生了不同的网络一样。我们可以从边的第一次出现开始构建完整的过滤,直到网络中存在所有可能的边,以跟踪基于点之间距离的网络结构变化。我们还可以在我们的 Vietoris–Rips 复形构建中包括三向和四向交互,以将我们的分析扩展到数据集中每个切片中存在的完整单纯复形。
虽然单纯复形度量超出了本书的范围,但许多网络度量扩展到单纯复形的例子存在(例如 Forman–Ricci 曲率中心性),并且可能在时间序列数据分析中值得研究。目前,很少有工作阐明了单纯复形度量或方法在股票市场变化点检测中的应用。
如果您感兴趣,我们鼓励您将脚本 6.1和6.2扩展以包括通过单纯复形视角对整个时间序列的分析,并计算网络度量在单纯复形术语下的扩展。我们的章节参考文献部分包括实验这些扩展的论文。
摘要
在本章中,我们介绍了一些时间序列数据和时间序列分析的一般用途,包括股市数据。我们探讨了网络分析中常见的基于顶点和边的中心性度量。然后,我们将网络度量应用于 2004 年至 2020 年纳斯达克股市数据的时间序列问题,以研究网络指标和时间序列阈值如何影响从时间序列数据中提取有用信息的能力,例如我们的股票数据。最后,我们研究了将网络扩展到单纯复形,并使用 Vietoris–Rips 方法和各种阈值值构建了两个单纯复形来构建网络。在第七章中,我们将探讨时间和地理空间上的销售和商品定价,以了解网络科学如何解决时空数据中的问题。
参考文献
De Floriani, L., & Hui, A. (2005, 七月). 单纯复形的数据结构:分析与比较. 在几何处理研讨会(第 119-128 页)。
Durbach, I., Katshunga, D., & Parker, H. (2013). 南非公司网络中的社区结构和中心性效应. 南非商业管理杂志,44(2),35-43.
Estrada, E., & Ross, G. J. (2018). 单纯复形中的中心性。应用于蛋白质相互作用网络。理论生物学杂志,438,46-60.
Johansen, A., & Sornette, D. (1998). 股市崩盘是异常值. 欧洲物理学报 B-凝聚态和复杂系统,1,141-143.
Rodrigues, F. A. (2019). 网络中心性:导论. 从非线性动力学到复杂系统的数学建模方法,177-196.
Salnikov, V., Cassese, D., & Lambiotte, R. (2018). 单纯复形与复杂系统. 欧洲物理学报,40(1),014001.
Samal, A., Pharasi, H. K., Ramaia, S. J., Kannan, H., Saucan, E., Jost, J., & Chakraborti, A. (2021). 网络几何与市场不稳定. 皇家学会开放科学杂志,8(2),201734.
Valente, T. W., Coronges, K., Lakon, C., & Costenbader, E. (2008). 网络中心性度量之间的相关性如何? 连接 (多伦多,安大略省),28(1),16.
Xiong, J., & Xiao, W. (2021). 基于改进的 PageRank 算法在异常基金交易网络中识别关键节点. 在 物理学报:会议系列 (第 1774 卷,第 1 号,第 012001 页)。IOP 出版。
第八章:商品价格/销售数据
在本章中,我们将结合空间和时间方法来处理时空数据——这类数据既包含空间组件也包含时间序列组件。为了处理时间组件,我们将像在第六章中处理股票数据那样,将我们的数据集切割成重叠的时间窗口。为了处理空间组件,我们将基于每个时间切片的相关性计算局部莫兰统计量,并将阈值设置为创建该时间切片的网络。然后,我们将观察时间和空间切片中的Forman-Ricci 曲率中心性和PageRank 中心性的变化。示例包括在第二章中首次出现的布基纳法索小米数据集和一个新的商店销售数据集。
到本章结束时,你将了解如何使用igraph和不同类型的图表来设置时空数据分析,以捕获数据集中空间和时间关系随时间的变化。
尤其是我们将涵盖以下主题:
-
时空数据简介
-
分析我们的时空数据
技术要求
你需要 Jupyter Notebook 来运行本章中的实践示例。
本章的代码可在以下链接找到:github.com/PacktPublishing/Modern-Graph-Theory-Algorithms-with-Python
时空数据简介
在第二章中,我们讨论了使这类数据难以处理、分析和用统计和机器学习方法扩展的一些时空数据方面。回想一下,这两种类型的数据都不是独立的,数据集中的依赖关系跨越了空间或时间。需要预测的替代方法,将时空数据作为网络表示允许分析师利用网络科学工具来找到变化点、挖掘模式,甚至在时间数据的情况下预测未来系统行为。在前几章中,我们学习了如何使用网络科学工具(如中心性)来分析空间和时间数据,以了解重要趋势。
世界上许多分析任务都涉及时空数据——包括受当地政策影响的世界股票市场的分析、分析不同地点的商店数据以了解客户行为和收入趋势、在流行病期间识别疾病来源和人口脆弱性、跟踪特定国家或该国家特定地区的国家或地区的人类行为(如犯罪、饮食习惯、物质使用、出生率或恐怖主义),以及展示气候变化对脆弱国家的影响。
让我们熟悉我们的两个数据集以及与许多时空数据应用相关的相关问题。
布基纳法索市场数据集
在第二章中,我们介绍了布基纳法索市场数据集,该数据集记录了从 2015 年第二季度到 2022 年第二季度的全国市场小米价格。在此期间,由于 COVID-19 供应链问题和乌克兰冲突限制食品分销和援助,世界粮食价格波动。食品安全是全球许多地区的主要问题,了解可能造成价格飙升,使普通个人或家庭无法负担的关键因素,对于满足全球粮食需求和避免饥荒至关重要。
一个国家的某些地区可能比其他地区更容易受到粮食短缺或商品价格上涨的影响,我们数据集中的空间特征捕捉了布基纳法索市场的这些情况。我们可以想象,一个乡村市场(如图 7.1中所示)可能面临比位于奥罗达古市中心的市场的更大的价格和可用性波动。此外,在某个时期内,某些事件可能比同一时期内的其他事件导致更大的价格波动。捕捉时间序列趋势对于理解事件对地区粮食价格的影响原因和潜在影响也很重要。因此,将数据作为时空数据捕捉使我们能够分析跨地点和跨时间的趋势。

图 7.1 – 布基纳法索乡村市场的插图
为了捕捉空间趋势,我们将回到在第二章中引入的权重矩阵,该矩阵连接了位于共享边界的省份的市场。这大致捕捉了布基纳法索的地理特征,使得共享许多边界的地区有可能相互影响其定价,并展示了与国家偏远地区相关的潜在供应链问题。
就像价格可以随时间和地理变化一样,销售量也可以变化。让我们转向下一个例子,探讨由于 COVID-19 期间工作政策的变化和城市人口流动的变化,销售如何在不同商店之间变化。
存储销售数据
让我们考虑一个中等城市中一家本地打印机供应连锁店。随着商店附近人口的变化,可能需要调整业务策略:关闭经营困难以最小化房地产成本的商店,优先为表现良好的商店补货,并在销售量高的地区开设新店。也许 COVID-19 期间的远程办公倡议导致某些城市地区的更多人从家工作,以及更多的人因为可以自由选择居住地而不是靠近办公室而搬往某些地区。也许重返办公室的倡议也影响了家庭办公用品的需求。所有这些因素都可能影响打印机供应店,并迅速变化。
为了进一步探讨这个问题,我们创建了一个模拟数据集,其中包含四个服务于单一大都市区的商店的销售数据,这些数据模仿了由 COVID-19 政策和随后的关于重返办公室与远程工作政策摇摆不定的决策所预示的人口流动趋势。假设商店 1(图 7.2)服务于主要从事护理、杂货店管理和其他不太可能长期远程工作的职业的人口。该地区还有临时学校关闭。我们预计在 COVID-19 封锁期间销售量会最初上升,但随后会迅速回到正常的销售模式:

图 7.2 – 一家打印机供应店的插图 – 商店 1
然而,商店 2 位于市中心附近,服务于主要是中级技术工人的群体,一旦他们完全远程工作,他们大多不适用于重返工作岗位的政策。因此,在最初的封锁期间销售量激增,并稳定到该地区的新的正常水平。
商店 3 服务于市中心附近一个非常受欢迎的郊区,主要由高收入专业人士组成,他们在 COVID-19 之前要么在家工作,要么定期去办公室。通勤通常很漫长,但学校系统和社区的安全性都很出色。在 COVID-19 期间,这个郊区经历了房地产的繁荣,因为该州其他地区的家庭现在可以远程工作,决定搬到这里定居。因此,到 2023 年,该地区将有大量需要打印机供应的远程工作者。如图 7.3*所示,商店 3 可能到 2023 年需要更大的空间:

图 7.3 – 一家打印机供应仓库的插图
然而,商店 4 服务于市中心区域,该区域经历了人口的大量流失,因为喜欢短途通勤便利的年轻家庭搬到了郊区。重返工作岗位的政策并没有吸引工人回到市中心区域的公寓,导致大多数建筑部分空置或被季节性居民居住。理想情况下,我们希望避免供应积压和没有潜在客户的情况(图 7.4):

图 7.4 – 一家无客户的废弃打印机供应店的插图
我们的目的是在趋势发生时迅速发现趋势,以便尽可能快地调整业务策略,以满足对供应不断增长的区域需求,并在我们大都市区的租金飙升时最大限度地减少房地产费用。鉴于这些商店共享地理位置,我们假设空间权重矩阵将所有四个商店相互连接。在一个更大的连锁店中,基于人口统计特征或其他商店的距离创建空间权重可能会使分析更加精确。
现在,让我们将注意力转向代码,这将帮助我们深入了解我们的布基纳法索市场数据和我们的 COVID-19 门店销售数据。
分析我们的时空数据集
我们布基纳法索市场数据集方便地分为季度,为了理解季度间的变化,将我们的窗口大小设置为四个季度(一年),三个季度的重叠(以关注月度变化)是有意义的。正如我们在第二章中所做的那样,我们将通过权重矩阵和相关性指标计算局部莫兰统计量。让我们通过Script 7.1设置所需的包并导入布基纳法索市场数据集及其权重矩阵:
#import packages
import igraph as ig
from igraph import Graph
import numpy as np
import pandas as pd
import os
import matplotlib.pyplot as plt
#import Burkina Faso market millet prices
File="C:/users/njfar/OneDrive/Desktop/BF_Millet.csv"
pwd=os.getcwd()
os.chdir(os.path.dirname(File))
mydata=pd.read_csv(os.path.basename(File),encoding='latin1')
#import weight matrix of Burkina Faso markets
File="C:/users/njfar/OneDrive/Desktop/weights_bk.csv"
pwd=os.getcwd()
os.chdir(os.path.dirname(File))
weights=pd.read_csv(os.path.basename(File),encoding='latin1')
现在我们有了数据和包,让我们通过添加到Script 7.1来计算 Forman-Ricci 曲率和 PageRank 中心性,并将每个时间切片的网络和整体指标保存下来,将相关阈值设置为0.9(以对主要变化的最大敏感性):
#score in yearly sets with 3 quarter overlap
vcurv_t=[]
vcurv_ave=[]
eig_t=[]
eig_ave=[]
nets=[]
for Year in range(4,29):
data=mydata.iloc[(Year-4):(Year),1:46]
cor=np.corrcoef(data.transpose())
weights_total=weights.iloc[:,1:46]
cor[cor>=0.9]=1
cor[cor<0.9]=0
cor_weighted=np.multiply(cor,weights_total)
bf_market_w=Graph.Adjacency(cor_weighted,diag=False)
edge_list=bf_market_w.get_edgelist()
self_loop=[]
for i in range(0,46):
self=(i,i)
self_loop.append(self)
to_remove=[]
for i in edge_list:
for j in self_loop:
if i==j:
to_remove.append(i)
bf_market_w.delete_edges(to_remove)
nets.append(bf_market_w)
d=Graph.degree(bf_market_w)
e=Graph.pagerank(bf_market_w)
eig_t.append(e)
eig_ave.append(np.mean(e))
ecurvw=[]
for edge in bf_market_w.es:
s=edge.source
t=edge.target
ecurvw.append(2-d[s]-d[t])
vcurvw=[]
for vertex in bf_market_w.vs:
inc=Graph.incident(bf_market_w,vertex)
inc_curv=[]
for I in inc:
inc_curv.append(ecurvw[i])
vcurvw.append(sum(inc_curv))
vcurv_t.append(vcurvw)
vcurv_ave.append(np.mean(vcurv_t))
现在我们已经计算了指标,让我们通过添加到Script 7.1来绘制结果,以查看 PageRank 和 Forman-Ricci 曲率中心性随时间的变化:
#plot metric averages across time slices
time=range(0,25)
plt.plot(time, eig_ave, label = "PageRank Average")
plt.plot(time, vcurv_ave, label = "Forman-Ricci Curvature Average")
plt.xlabel("Time Slice")
plt.ylabel("PageRank and Forman-Ricci Curvature Averages")
plt.legend()
plt.show()
这应该会显示一个 PageRank 中心性变化非常小的图表,但 Forman-Ricci 曲率中心性(图 7**.5)会增加并周期性波动。这表明我们市场的小米价格波动性有所增加,大约从 2018-2019 年开始(波动性增加,然后减少,然后再次增加,最终在更高的波动水平上稳定下来),在 COVID-19 和乌克兰冲突期间略有恶化。

图 7.5 – 2015-2022 年布基纳法索市场小米价格的平均中心性指标图
现在我们有一个显示波动性变化的图表,我们可以调查在不同时期我们的市场看起来如何。你可能希望调查所有时期,但我们将比较两个时期——一个低波动性时期和一个高波动性时期——并在以下代码中展示它们。让我们绘制时间周期4,根据 Forman-Ricci 曲率中心性(数据集中的最高中心性测量),波动性较低,每个顶点的尺寸由该顶点的 Forman-Ricci 曲率加权,通过添加到Script 7.1:
#examine different time points with Forman-Ricci
#curvature plots, fourth slice
ig.plot(nets[4],vertex_size=np.array(vcurv_t[4])*-0.5)
这应该会产生一个类似于图 7**.6的图表,显示通过相关性和空间加权连接的非常少的市场,以及顶点(顶点尺寸非常小)的非常低的 Forman-Ricci 曲率:

图 7.6 – 显示同一地理区域内通过相关性>0.9 连接的市场,并按 Forman-Ricci 曲率中心性加权的图表
图 7**.6 显示,大多数市场之间没有相互连接,而那些相互连接的市场往往相互连接性非常小,产生的 Forman-Ricci 曲率中心性指标接近0。这意味着价格是独立的,表明市场网络稳健,不太可能受到 COVID-19 或国际贸易变化等外部因素的影响。影响一到两个市场的变化不太可能影响该国的所有市场,受本地问题(如干旱季度)影响的卖家和消费者在需要时可以从邻近地区寻求谷物。政府也可以通过简单地将一个供应充足的省份的过剩谷物转移到供应有问题的另一个省份来解决短缺问题。从政府的角度来看,解决本地供应问题不会花费太多时间和金钱。
让我们考察一个波动性较高的时期(第 19 个时期),并看看连接性和 Forman-Ricci 曲率中心性如何与时间周期4进行比较,通过向脚本 7.1中添加内容:
#examine different time points with Forman-Ricci
#curvature plots, 19th slice
ig.plot(nets[19],vertex_size=np.array(vcurv_t[19])*-0.5)
这应该会产生一个类似于图 7**.7的图表,其中许多市场相互连接,产生的 Forman-Ricci 曲率中心性指标远高于零,表明该国广大地区的供应链高度互联,容易受到可能导致该地区饥荒的大规模短缺的影响。解决这些问题将使政府在时间和成本上付出更多,使人们容易受到食品短缺或价格飙升的影响,使得谷物对消费者来说难以负担。
注释
一些相互连接的市场有许多相互连接,产生了强大的曲率指标,而一些市场则与其他任何市场都没有连接。这些连接性较弱的市场的价格表明,一些地区不太容易受到广泛的谷物价格上涨或短缺的影响,这些短缺可能导致饥荒。

图 7.7 – 布基纳法索市场小米价格网络的第 19 个时期
从我们的分析中,我们可以了解到我们市场价格随时间的变化情况。在 2017 年之前,市场价格在各个市场之间的波动性较小。各个市场在价格方面并没有紧密相连,这表明价格受到的是本地影响。然而,随着市场在价格方面越来越依赖于全球力量,市场变得更加波动,容易受到世界事件(如 COVID-19 和乌克兰冲突)的影响。确实,在我们的原始数据集中,我们可以看到在这些事件之后价格飙升。这表明需要全国范围内的方法来解决不断上升的食品价格,而不是仅仅关注那些正在挣扎或容易受到本地生产或全球援助变化影响的本地市场。
通过查看美国国际开发署(USAID)数据库和 Google 上找到的文章的历史变化,我们看到 2010-2020 年是布基纳法索发展和国际粮食援助的时期,尽管这个国家的大多数人主要依赖自给自足的农业,而不是在市场上购买的食物。鉴于价格上涨,自给自足的农业和粮食援助是必要的,因为粮食价格达到了危机水平。
现在我们已经看到了如何分析时空数据来可视化波动趋势,让我们将注意力转向受在家办公和重返办公室政策影响的本地城市中的四个商店。我们将忽略权重,因为这些商店位于同一区域,并且只包括四个商店。我们将再次使用0.9作为阈值,以最大化我们在数据中找到极端波动期的机会。让我们使用Script 7.2导入我们的数据并开始:
#import store sales data
File="C:/users/njfar/OneDrive/Desktop/Store_Sales.csv"
pwd=os.getcwd()
os.chdir(os.path.dirname(File))
mydata=pd.read_csv(os.path.basename(File),encoding='latin1')
我们将通过在Script 7.2中添加内容来计算这个网络的 Forman-Ricci 曲率和 PageRank 中心性;如果你遇到运行时警告,不用担心,因为它可能出现在 Windows 机器上,但这并不表示你的代码运行有问题:
#score in yearly sets with monthly overlap
vcurv_t=[]
vcurv_ave=[]
eig_t=[]
eig_ave=[]
nets=[]
for Month in range(2,54):
data=mydata.iloc[(Month-2):(Month),1:6]
cor=np.corrcoef(data.transpose())
cor[cor>=0.9]=1
cor[cor<0.9]=0
stores=Graph.Adjacency(cor)
edge_list=stores.get_edgelist()
self_loop=[]
for i in range(0,52):
self=(i,i)
self_loop.append(self)
to_remove=[]
for i in edge_list:
for j in self_loop:
if i==j:
to_remove.append(i)
stores.delete_edges(to_remove)
nets.append(stores)
d=Graph.degree(stores)
e=Graph.pagerank(stores)
eig_t.append(e)
eig_ave.append(np.mean(e))
ecurvw=[]
for edge in stores.es:
s=edge.source
t=edge.target
ecurvw.append(2-d[s]-d[t])
vcurvw=[]
for vertex in stores.vs:
inc=Graph.incident(stores,vertex)
inc_curv=[]
for i in inc:
inc_curv.append(ecurvw[i])
vcurvw.append(sum(inc_curv))
vcurv_t.append(vcurvw)
vcurv_ave.append(np.mean(vcurv_t))
再次,我们可以通过在Script 7.2中添加内容来绘制 PageRank 和 Forman-Ricci 曲率中心性,以识别高波动和低波动期:
#plot metric averages across time slices
time=range(0,52)
plt.plot(time, eig_ave, label = "PageRank Average")
plt.plot(time, vcurv_ave, label = "Forman-Ricci Curvature Average")
plt.xlabel("Time Slice")
plt.ylabel("PageRank and Forman-Ricci Curvature Averages")
plt.legend()
plt.show()
你应该会看到一个类似于图 7.8的图表,其中波动性在时间期间总体上相当稳定,有几个波动性增加或减少的时期,这些时期的价格可能受到我们商店经理无法控制的外部因素的影响。

图 7.8 – PageRank 和 Forman-Ricci 曲率平均值的图表
虽然我们不会期望波动性在各个时期之间有重大变化,从而在各个时期的网络图中显示出来,但我们确实看到了一些值得调查的波动性差异。让我们再次选择两个时期进行调查(时期10和时期30)。我们将首先通过在Script 7.2中添加内容,通过 Forman-Ricci 曲率对顶点进行加权来可视化销售的互连性,来调查时期10:
#examine different time points with
#Forman-Ricci curvature plots, tenth slice
ig.plot(nets[10],vertex_size=np.array(vcurv_t[10])*-0.5)
这应该会显示一个类似于图 7.9的图表,其中只有两家商店相互连接,这表明这是一个相对稳定的时期,外部影响不应该像在其他更波动的时期那样影响我们的商店的销售。

图 7.9 – 第 10 个时期的商店图表
让我们通过在Script 7.2中添加内容来比较这个图表与时期30的图表:
#examine different time points with
#Forman-Ricci curvature plots, thirtieth slice
ig.plot(nets[30],vertex_size=np.array(vcurv_t[30])*-0.5)
这段代码应该会生成一个类似于图 7.10的图表,显示所有四个商店之间的连通性(最大可能的波动性),这使得商店容易受到可能影响所有四个商店的销售而不是仅影响一个本地商店的事件的影响:

图 7.10 – 来自第 30 期的我们店铺数据的网络图,显示了最大波动性
综合来看,我们的结果表明,在 COVID-19 爆发前几个月,我们店铺的波动性相对稳定,在居家办公政策实施后波动性增加,并在一定程度上持续到重返工作岗位的政策实施。从我们的原始模拟数据来看,一些店铺从这种变化中受益,而其他店铺则遭受了相当大的损失。随着波动性的变化,店铺经理需要关注他们可以控制的与各自店铺相关的因素,而负责该地区所有店铺的经理可能需要制定策略,以在考虑那些陷入困境的店铺的建筑整合的同时,调整增长店铺的供应和增长需求。
总体而言,这些分析在危机时期对定价和销售脆弱性提供了一些见解,使决策者能够确定需要战略转变的时间点。结合其他分析(例如,通过多通道单频谱分析进行的时间序列预测,或者关于人口统计或购买行为时间差异的信息),这些类型的分析为在变化的时代继续繁荣提供了对时间和特定地理区域的洞察。
摘要
在本章中,我们将我们对时间和空间数据的先前见解扩展到处理时空数据集的分析问题,包括一个店铺销售数据集和布基纳法索市场小米价格数据集。我们按时间切分了这两个数据集,计算了空间统计量,并分析了网络中心性指标以识别数据中的变化点和波动期。波动期对应于网络对崩溃和价格、销售以及其他指标飙升的脆弱性,因为系统的互联互通使得网络的一部分对其他部分产生影响。我们在 COVID-19 和布基纳法索市场的乌克兰冲突期间以及 COVID-19 对销售数据的影响中看到了这一点。在 第七章 中,我们将查看时间和地理空间上的销售和商品定价,以了解网络科学如何解决时空数据中的问题。在 第八章 中,我们将考虑动态网络,其中连接甚至个人会随时间变化,并研究这些变化如何影响野生动物种群中的疾病传播。
参考文献
Han, X., Zhu, G., Zhao, L., Du, R., Wang, Y., Chen, Z., ... & He, S. (2023). 基于 Ollivier–Ricci 曲率的时空图神经网络用于交通流量预测. 对称性, 15 (5), 995.
Schlör, J., Strnad, F. M., Fröhlich, C., & Goswami, B. (2022, May). 基于曲率的网络分析识别遥相关模式. 见 EGU General Assembly Conference Abstracts (pp. EGU22-7256).
谢克哈, 姜志, 阿里, R. Y., 伊夫特利奥古卢, E., 唐晓, G. M., & 周晓 (2015). 时空数据挖掘:计算视角. 国际摄影测量与遥感杂志, 4 (4), 2306-2338.
王宇, 黄志, 邢国, 李辉, 杨磊, 苏燕, ... & 山晓 (2022). 将 Ollivier-Ricci 曲率应用于表示城市交通网络中出行需求与供给的不匹配. 国际应用地球观测与地理信息杂志, 106, 102666.
第九章:动态社会网络
在前面的章节中,我们考虑了随时间不变化的网络。它们的几何形状保持不变,基于它们的传播过程和重要性指标也不会变化。然而,这在许多现实世界的网络中并不适用,在这些网络中,新的连接被建立,旧的连接被切断。
在本章中,我们将考虑随时间变化网络以及这些变化如何影响网络结构和传播过程。例如,在社会网络中,用户可以加入或停用账户。随着他们与其他用户内容的互动,他们关系的强度可能会发生变化。所有这些行为都会随着时间的推移推动网络变化,影响信息交换等过程作为中心出现和消失或在不同中心之间建立桥梁。我们将考虑从野生动物观察和假设在鳄鱼和苍鹭种群中传播的流行病收集的模拟数据和试验数据。
到本章结束时,你将了解网络随时间变化的方式以及这些影响对传播过程和网络指标的意义。你还将知道如何将动态数据集整理成网络并分析时间切片。这些方法可以扩展到更大的人口和更长的时间框架,因此到本章结束时,你将能够以规模处理人口模型。
在本章中,我们将涵盖以下主题:
-
随时间变化的社会网络
-
对网络传播的深入探讨
-
带有不断演变的野生动物交互数据集的示例
技术要求
在本章中,我们将使用 Jupyter 笔记本来运行我们的动态网络示例。您也可以在支持 Jupyter 笔记本的云平台上运行此代码,例如 Amazon Web Services (AWS) 或 Google Cloud Platform (GCP)。我们将使用在笔记本电脑上运行的 Jupyter 笔记本,处理本章中的示例不需要云访问权限。
随时间变化的社会网络
考虑你最近的朋友圈。在过去一年、过去五年、过去十年里,这个圈子发生了怎样的变化?
许多可以用网络表示的社会关系和其他类型的数据会随着时间的推移而演变。友谊随着人们的搬家、毕业、结婚、换工作、旅行或去世而疏远或建立。动物随着季节、气候的变化以及人类活动侵占放牧地而迁徙。商店的销售模式可能会因该地区新商店的开设、人口流动和重大世界事件(如 COVID-19 或乌克兰冲突)而中断。
在接下来的几节中,我们将探讨动态网络,其结构随时间变化。随着网络结构的变化,与信息/疾病流动和网络分割相关的重要属性也会发生变化。
友谊网络
许多社交网络平台允许友谊群体发展和甚至鼓励结构的变化。考虑分享帖子或推文,在你的网络帖子/推文/图片中标记其他人,他们可能有尚未遇见你的朋友,并添加与你分享的内容相关的可搜索标签。这些活动中的每一项都能为你带来更多的可见性,让你在最初的社会网络之外得到关注,让朋友的朋友、尚未在社交媒体平台上与你建立联系的认识者,以及与你话题帖子中分享相似兴趣的个人能够找到你并建立联系。
假设有人在社交媒体平台上发布了一张超现实的梦境捕手图像(图 8.1):

图 8.1 – 一张使用人工智能(AI)创建并发布到社交媒体平台上的梦境捕手图像
也许用户添加了#AIArt和#Dreamcatcher标签,并标记了一个发布类似内容的朋友(图 8.1)。其他平台用户可能会搜索使用人工智能艺术平台创建图像的其他人,并希望关注该用户或点赞/分享内容。这为用户提供了更多联系,并扩大了他们的社交网络。
被标记的朋友可能会从这些新联系中受益,因为该用户的新联系会访问朋友的主页。此外,那些尚未遇见该用户的朋友也可能与该用户建立联系或点赞/分享他们的内容。这也扩大了用户的社会网络。
许多社交网络平台还通过创建兴趣页面或群体来连接用户,这些页面或群体允许具有相似兴趣的用户发布内容、建立联系和讨论主题。例如,许多社交媒体平台提供动物兴趣群体或页面,展示可爱的动物艺术或照片,如图 8.2中所示的动物艺术:

图 8.2 – 一张茶杯中环绕着玫瑰的小象人工智能艺术图像
这些兴趣群体鼓励用户之间的联系和可搜索内容的共享,以增长群体的成员人数(有时由广告优化算法或其他付费用户,包括在某些情况下的一些群体本身)鼓励)。受欢迎的内容往往鼓励群体增长和群体内用户之间的互动/联系。不受欢迎的内容往往阻碍增长。
鼓励具有相似兴趣的用户之间建立联系并优化内容传播的算法的阴暗面是阴谋论和错误信息传播的可能性,以及促进种族主义或歧视性群体之间的联系。在 2016 年和 2020 年美国总统选举(以及 COVID-19 大流行期间),错误信息在社交媒体平台上迅速传播。在大流行或国家危机期间,错误信息可能引发公众恐慌,增加资源压力,或导致更高的死亡率。在政治领域,错误信息可能影响选举结果或加速不同政治团体之间的分歧。
鼓励社交网络演化以增加点赞数,通过连接那些可能喜欢其他用户内容或相关广告观点的人的算法可能会无意中做到以下事情:
-
促进可能喜欢或评论错误信息之间的用户之间的传播
-
鼓励在分享错误信息或有害内容之间的用户之间建立联系
-
在社交网络上创建一个持续加剧这一问题的反馈循环
这也可能发生在社交媒体平台、社区团体、网络聊天室和其他论坛上。虽然推广更多猫猫表情包可能无害(除了浪费时间看猫猫表情包的潜在可能性),但推广种族主义意识形态或鼓励宗教暴力则相当有害。
三角闭合
大多数网络演化算法的影响结果来自一个称为三角闭合的网络属性。社交网络中的三角闭合大致基于以下前提:在网络上,一个用户的朋友的朋友的用户可能在实际生活中认识该用户,但尚未建立联系。这是社交网络中基于直接连接的三角闭合实例。另一个与我们的用户的朋友共享许多朋友群体的用户很可能认识该用户(或者基于共享的社交网络,会成为该用户的好连接);此外,其他用户可能与该用户有众多共同兴趣(许多朋友推荐算法的前提);这是基于元数据的三角闭合实例,其中连接的形成取决于用户元数据的相似性,而不是共享的连接。
考虑 Pieter、Kwame 和 Pablo。这三个人都喜欢足球、软件工程和远足。Pablo 和 Pieter 彼此认识,Pieter 和 Kwame 也是如此;然而,我们不知道 Kwame 和 Pablo 是否认识(图 8.3**.3):

图 8.3 – 我们三位足球迷之间已知关系的图示
给定已知的两种关系以及共享的兴趣元数据,Kwame 和 Pablo 很可能彼此认识(或者如果他们建立了联系,也会相处融洽)。网络中开放三角形的百分比衡量了网络的总体三角形开放度。具有高开放三角形百分比的网络在时间上有很高的进化潜力,因为朋友的朋友或具有相似兴趣的个人可以通过共享内容或团体成员资格相互连接。现在我们对我们对关系及其随时间演变的情况有了更多的了解,让我们更深入地研究在演变网络上的传播过程。
深入研究网络上的传播
现在我们对网络随时间变化的情况有了一定的了解,让我们看看如何在 Python 中表示这些网络,并计算在动态网络上随时间推移的传播过程,例如流行病学模型。Python 提供了几个工具来帮助我们可视化并分析动态网络,正如我们在前面的章节中所做的那样。让我们开始吧。
动态网络简介
我们可以通过跟踪不同时间点的连接来跟踪网络随时间的变化。让我们考虑一个狮子群,其中个体在一天中的不同时间周期性地互动。图 8.4 展示了这个具有时间戳的示例网络,以跟踪边:

图 8.4 – 一个具有时间戳的动态网络示例
图 8.4 展示了一个具有随时间演变的边和顶点结构的动态狮子网络示例,这些边和顶点可以带有时间信息。Python 提供了一个方便的包来创建这样的网络。NDlib 包利用 DyNetx 来模拟时间演化的图,它利用 DyNetx 的几个关键原语来创建和分析动态网络。这为在现实世界中处理动态网络提供了一个强大的框架。这在流行病学、社会网络分析和交通系统等领域尤其有价值,在这些领域中,理解时间动态至关重要。让我们通过使用 Script 8.1 创建 图 8.4 来探索这个包:
#create Figure 8.4
#import packages
#install dynetx if needed
#!pip install dynetx
import dynetx as dn
import networkx as nx
import matplotlib.pyplot as plt
#create an empty graph
g = dn.DynGraph()
#add vertices and edges with time information added
#adding the edge ("D","E") at t=0 that vanishes at time e=2
g.add_interaction(u="D", v="E", t=0, e=2)
# adding some edges at time t=1
g.add_interactions_from([("C", "F"), ("F", "E")], t=1)
# adding some edges at time t=2
g.add_interactions_from([("B", "E"), ("A", "B")], t=2)
# adding some edges at time t=3
g.add_interactions_from([("B", "C"),("C","D")], t=3)
# adding some edges at time t=4
g.add_interaction(u="A", v="C", t=4)
一旦我们创建了 图 8.4,我们就可以返回一个快照列表,每个快照代表狮子网络在时间不同点的静态视图。这些快照实际上是不同时间戳的图的实例。让我们在 Script 8.1 中添加以显示这些图表:
#create plots for each time point
for i in range (5):
g1 = g.time_slice(i)
nx.draw(g1,with_labels=True)
print ("snapshot at t = ", i)
plt.show()
我们还可以打印每个快照的边列表。让我们在 Script 8.1 中添加以获取每个时间点的边列表:
#create lists of edges at each time point
for i in range (5):
g1 = g.time_slice(i)
print ("snapshot at t = ", i)
print(g1.edges())
这应该给我们以下每个时间点的边分析,如下所示:
snapshot at t = 0
[('D', 'E')]
snapshot at t = 1
[('D', 'E'), ('E', 'F'), ('F', 'C')]
snapshot at t = 2
[('E', 'B'), ('B', 'A')]
snapshot at t = 3
[('D', 'C'), ('C', 'B')]
snapshot at t = 4
[('C', 'A')]
在每个时间点理解边结构对于评估网络结构和性质至关重要,这些性质有助于网络上的流动,例如中心节点和桥梁。可视化和边列表也为我们提供了一种总结信息的方法,这可能会为例如通过小群体传播的流行病提供额外的见解。离开我们的狮子例子,让我们考虑在新型疾病(如 COVID-19)爆发期间办公室环境中的徽章跟踪。不同的人将在不同的日子与办公室中不同数量的人互动,这取决于他们的日程安排。不同时间点存在的边列表以及员工之间的交互可视化可以帮助研究人员追踪新的爆发并计算重要的流行病模型参数,以了解疾病对更大人群的潜在影响。
正如个人之间的联系会随时间变化一样,网络中的个人本身也可能发生变化。也许有一位员工因病请假或请了个人假,因此在那个时间点从网络中退出。使用DyNetx,我们还可以创建一个交互网络来模拟一个动态结构,其中顶点和边都可以随着时间演变而出现和消失。回到图 8**.4,让我们在Script 8.1中添加以下交互流:
#print interaction stream
for i in g.stream_interactions():
print(i)
此脚本为每个时间点创建一个交互列表,表示网络中存在的交互。虽然我们没有狮子离开或进入我们的网络,但狮子的交互确实会改变,并且狮子在特定时间点可能与网络中的其他狮子有或没有交互。让我们进一步查看输出,以了解哪些时间点在网络狮子之间涉及最多和最少的交互:
#output of interactions for each time point
('D', 'E', '+', 0)
('C', 'F', '+', 1)
('F', 'E', '+', 1)
('D', 'E', '-', 2)
('B', 'E', '+', 2)
('A', 'B', '+', 2)
('B', 'C', '+', 3)
('C', 'D', '+', 3)
('A', 'C', '+', 4)
前两个值指定了参与边的顶点。第三个值指定了边操作的类型,其中'+'表示出现(边创建)和'-'表示消失(边删除)。最后一个值表示与边操作相关的时间戳。例如,我们可以看到狮子 F 在时间点1建立了多个网络内的交互。我们还可以看到狮子D和E,它们的交互始于第 0 个时间点,在第 2 个时间点停止交互。
这种类型的信息对于流行病追踪至关重要,因为它允许我们缩小接触范围以进行接触追踪。接触追踪涉及通过时间和受影响个体之间的互动向后工作,以找到最初感染了感兴趣疾病的原始患者(零号患者)。这使流行病学家能够确定疫情开始的地域,以及从零号患者开始追踪其在时间和空间上的演变。一些疾病迅速突变,这使治疗的发展变得复杂。今天有效的方法可能无法应对下一次突变。这就是为什么流感疫苗通常每年都要接种,因为流感病毒株会定期突变。然而,一些疾病的突变非常缓慢或根本不发生,这允许有效的治疗或疫苗。
现在我们对 Python 中的动态网络构建有了一些了解,让我们更深入地探讨易感者-感染者-康复者(SIR)模型,比我们在第三章中探讨的要详细一些。
SIR 模型,第二部分
在第三章中,我们探讨了 SIR 模型来追踪网络传播过程,但我们没有深入到微分方程的技术细节。在本节中,我们将更深入地探讨 SIR 模型的数学。让我们首先定义我们将在模型中使用的术语:
-
S(t) 表示时间 t 时易感者的数量:那些没有疾病但可以感染它
-
I(t) 表示时间 t 时感染者的数量:那些正在积极感染并能将疾病传播给易感者的个体
-
R(t) 表示时间 t 时康复者的数量:那些不再感染且由于免疫力而不能再被重新感染的个体
-
beta (β) 是感染者向易感者群体的传播率
-
gamma (γ) 是康复率(感染者成为康复者的速率)
-
N 是总人口大小
易感者、感染者和康复者的数量会随时间变化,因为个体会感染并在之后康复。我们可以通过将这些群体与一系列方程中的传播和康复率联系起来,来定义每个时间点的群体数量。易感者群体会随着疾病从感染者传播到易感者而减少。在特定时间点,感染者群体可能会增长或减少,因为更多的易感者被感染,以及更多的感染者康复。康复者群体会随着时间的推移而增长,因为感染者从疾病中康复。
对于更技术性的读者,我们可以安排这些术语来定义一个微分方程系统,该系统控制着易感者群体中的传播和康复过程,如下所示:



高传播率与低恢复率相结合将导致大量感染个体的出现。低传播率与高恢复率将导致人群中缓慢或逐渐消失的流行病。
然而,人群内的互动很少是随机的,正如 SIR 方程所假设的那样。动态网络提供了一种捕捉随时间互动的方法,从而可以更准确地模拟感兴趣人群中的传播模型,或者通过模拟感兴趣人群中的互动水平来更准确地规划。
影响传播的因素
在第三章中,我们考察了桥梁和中心节点对音乐趋势或流行病在网络上传播的重要性。从那时起,我们考虑了许多与中心节点和桥梁概念相关的网络中心性指标。让我们简要回顾一下这些中心性指标中的几个。
集中度可以通过几个中心性指标来评估,包括以下内容:
-
度中心性(在第六章中定义)
-
PageRank 中心性(在第六章中定义)
-
中心节点度中心性(在第六章中定义)
度中心性是最简单且与网络上的传播过程最相关的。一个感染顶点与其他顶点之间的连接数量会影响感染顶点将其疾病传播给其直接邻居的能力。整个网络中度中心性的组合会影响疾病在全球范围内传播的整体能力。具有非常低度中心性的稀疏网络不会为疾病同时感染许多个体提供机会,导致公共卫生工作者可以有效地实施隔离和接触追踪等策略,而不会在特定时间点被大量感染者所淹没。
然而,具有非常高的度中心性的网络可能包括许多中心或单个大型中心。一个大型中心允许一个感染个体将疾病传播给许多人,这些人也有许多可能被感染的接触者。这意味着在流行病初期,公共卫生资源很容易被压垮,在许多人被感染之前控制这种流行病的可能性相当低。我们在许多全球城市在 COVID-19 期间看到了这一点,全城关闭成为避免压垮医疗系统的必要措施;农村地区没有像大城市那样经历感染率的快速上升。
桥梁在网络流行病建模中也发挥着重要作用。如果两个大型中心没有连接,很容易将一个中心从另一个中心隔离,以阻止流行病从一个中心传播到另一个中心,因为我们只需确保在感染中心流行病结束之前,两个中心之间不建立任何桥梁。连接两个中心的桥梁为桥梁顶点/顶点成为感染源并从一个社区传播到另一个社区提供了机会。因此,桥梁为感染传播提供了机会,使其成为地区或全球问题,而不是局部社区问题。
回想一下,桥接属性可以通过中介中心性(在第六章**)来衡量,它衡量的是通过一个顶点的网络最短路径的数量。本质上,这是衡量每个顶点在网络上的传播过程重要性的方法。具有高中介中心性的顶点表示,如果该顶点被感染,有很高的可能性将疾病传播到人群的其他部分。隔离或接种疫苗给具有高中介中心性的顶点可以破坏网络上的疾病传播,这些个体代表在有限资源的情况下对整体流行病严重程度产生重大影响的机会。在 COVID-19 的背景下,频繁的国际旅行者充当了国家之间的桥梁。停止从感染区域到尚未受影响地区的国际旅行允许小国,如加勒比海岛屿上的国家,避免流行病传播到其人群。
Forman-Ricci 曲率中心性(在第六章中定义)通过考虑通过一组顶点连接到其他边的边,在网络上同时考虑了桥接属性和中心属性。最近的研究表明,Forman-Ricci 曲率可以找到对传播过程重要的边和顶点,因此,它可以用作在流行病模拟中(例如,通过疫苗接种将顶点从人群中移除)的一个有效指标。
离心率,图中从一个顶点到另一个顶点的最大距离,是另一个常用于衡量流行病在种群水平上潜在影响的指标。网络的半径是网络顶点中最小的离心率值,网络的直径是网络顶点中最大的离心率值。密集网络比稀疏网络直径小,因为顶点往往更相互连接(允许在更短的时间内有更大的传播潜力)。
半径和直径限制了网络上的微分方程,如我们的 SIR 模型,的行为。虽然理论证明超出了本书的范围,但我们将通过下一节中两个野生动物流行病数据集的真实世界模拟来实际探索半径和直径。让我们从探索我们的数据集开始。
进化中的野生动物相互作用数据集示例
我们收集了两个关于物种内野生动物相互作用(涉及同一物种动物的相互作用)的短期数据集。
第一个数据集包括在冷锋经过该地区后,在南佛罗里达湾每隔 15 分钟观察到的 4 只鳄鱼在 12 个时间段内的观察。鳄鱼之间的社会相互作用被定义为在单个 15 分钟内相互作用的动物。每 15 分钟记录一次连接,从而在 12 个时间段内形成鳄鱼社会相互作用的动态网络。
第二个数据集包括在南佛罗里达湾的迁徙鱼饵球中,7 只蓝鹭在 10 个时间段内每隔 5 分钟进行观察的相互作用。蓝鹭之间的相互作用被定义为占据同一立方米空间内的蓝鹭。每 5 分钟记录一次连接,从而在 10 个时间段内形成蓝鹭社会相互作用的动态网络。最初,种群被分为两个筑巢社区,一个社区有 2 只蓝鹭,另一个社区有 5 只蓝鹭。
让我们从检查Crocodile Network数据集上的流行病动力学和中心性指标开始。
鳄鱼网络
我们首先考虑我们的鳄鱼网络,其中 4 只鳄鱼在 3 小时内进行相互作用。脚本 8.2加载相关包并创建随时间变化的初始网络集:
#import packages
import networkx as nx
import dynetx as dn
from past.builtins import xrange
import matplotlib.pyplot as plt
#create a dynamic graph object
crocodile = dn.DynGraph() # empty dynamic graph
#fill in relevant interactions
crocodile.add_interaction(u="Croc1", v="Croc2",t=0)
crocodile.add_interactions_from(
[("Croc1","Croc2"),("Croc3","Croc4")],t=1)
crocodile.add_interactions_from(
[("Croc1","Croc2"),("Croc3","Croc4")],t=2)
crocodile.add_interactions_from([("Croc1","Croc2")],t=3)
crocodile.add_interactions_from(
[("Croc1","Croc2"),("Croc2","Croc3")],t=4)
crocodile.add_interactions_from(
[("Croc1","Croc2"),("Croc2","Croc3")],t=5)
crocodile.add_interactions_from([("Croc1","Croc2")],t=6)
crocodile.add_interactions_from([("Croc3","Croc4")],t=7)
crocodile.add_interactions_from([("Croc3","Croc4")],t=8)
crocodile.add_interactions_from(
[("Croc2","Croc3"),("Croc3","Croc4")],t=9)
crocodile.add_interactions_from([("Croc2","Croc3")],t=10)
crocodile.add_interactions_from(
[("Croc1","Croc2"),("Croc2","Croc3")],t=11)
#plot time slices
for i in range(12):
g1 = crocodile.time_slice(i)
nx.draw(g1,with_labels=True)
plt.show()
图 8**.5显示了第二个时间点图,其中两组鳄鱼与另一只鳄鱼进行了相互作用:

图 8.5 – 鳄鱼网络的第二个时间段图
我们可以通过向脚本 8.2中添加内容来跟踪鳄鱼相互作用随时间的变化:
for i in crocodile.stream_interactions():
print(i)
这在它们发生的时间点产生了以下相互作用变化:
('Croc1', 'Croc2', '+', 0)
('Croc3', 'Croc4', '+', 1)
('Croc2', 'Croc3', '+', 4)
('Croc1', 'Croc2', '-', 7)
('Croc3', 'Croc4', '+', 7)
('Croc2', 'Croc3', '+', 9)
('Croc3', 'Croc4', '-', 10)
('Croc1', 'Croc2', '+', 11)
('Croc2', 'Croc3', '-', 12)
我们可以看到,互动在观察期结束时变得更为频繁,而在观察期开始时变化缓慢。这可能会影响流行病的动态,因为在观察期后期,鳄鱼有更多样化的互动。此外,早期增加的互动为疾病在人群中传播提供了机会,因为鳄鱼开始相互互动。
让我们考虑一个以高感染率(beta = 0.3)相对于恢复率(gamma = 0.05)感染一只鳄鱼的流行病开始的情况。这相当于一种中等传染性疾病穿过我们的鳄鱼种群,导致较长的感染期。鳄鱼痘就是这样一种可以导致幼鳄死亡的疾病。感染动物往往会出现数周或数月的症状。细胞感染通常发生得很快,潜伏期短(几分钟)。虽然感染率和恢复率的精确参数尚不清楚,但这些估计是感染的良好代理。让我们在Script 8.2中添加代码来模拟鳄鱼种群在 12 个时间周期内的互动过程中鳄鱼痘的传播:
#run epidemic model
import ndlib.models.ModelConfig as mc
%matplotlib inline
from ndlib.viz.mpl.DiffusionTrend import DiffusionTrend
import ndlib.models.dynamic as dm
#model selection
model = dm.DynSIRModel(crocodile)
#model configuration
config = mc.Configuration()
config.add_model_parameter('beta', 0.3) # infection rate
config.add_model_parameter('gamma', 0.05) # recovery rate
config.add_model_parameter("percentage_infected", 0.25)
model.set_initial_status(config)
# simulate snapshot based execution
iterations = model.execute_snapshots()
#iterations = model.execute_iterations()
trends = model.build_trends(iterations)
#visualize trends
viz = DiffusionTrend(model, trends)
viz.plot()
图 8**.6 总结了算法运行过程中我们鳄鱼样本中这种流行病的动态。鉴于这是一个概率模型,你的流行病在时间点或特定时间点感染鳄鱼的数量上可能会有所不同。该图总结了流行病每个时间点易感、感染和移除(康复)鳄鱼的数量。
在我们的试验中,这种鳄鱼痘流行病以第0期的单个鳄鱼感染迅速开始,并在第5期迅速感染整个种群,观察期结束时没有动物康复。任何新引入种群且对鳄鱼痘没有免疫力的动物很可能在进入种群后不久就会感染鳄鱼痘,并在整个观察期内保持生病。这表明需要对感染鳄鱼进行隔离,以避免野生种群中流行病的传播(可能通过在当地康复中心隔离和治疗):

图 8.6 – 我们鳄鱼网络中鳄鱼痘的病毒动力学
我们可以通过检查关键网络指标随时间的变化来检查任何可能有助于鳄鱼痘在我们鳄鱼网络动物中传播的变化。从我们构建的动态网络中,我们可以看到在鳄鱼网络数据集的 0-5 期间人口混合的增加,到 5 期末期(对应于所有鳄鱼实际上都已感染的时间点),所有鳄鱼都可以相互感染。让我们向 脚本 8.2 添加内容,以便我们可以在每个时间点计算网络中顶点的中介中心性以及网络的总体半径和直径:
#obtain network centrality statistics for crocodile network
for i in range(12):
dg = crocodile.time_slice(i)
try:
# computing betweenness centrality
dd = nx.betweenness_centrality(dg)
plt.plot(dd.values())
plt.title("betweenness centrality")
print()
plt.show()
print ("timestamp = ", i,",", "nodes =",
len(dg.nodes()),",",
"max degree = ",max(dg.degree().values()))
print ("diameter = ", nx.diameter(dg))
print ("radius = ", nx.radius(dg))
except:
print('Infinite value observed.')
注意,当我们观察到孤立顶点时,我们观察到无限值。我们将通过在我们的脚本中添加一个 try/except 子句来跳过这些时间段的计算。输出应显示类似于 图 8**.7 的图表(对应于第一个时间点),显示顶点之间的中介中心性:

图 8.7 – 鳄鱼网络观察的第一个时间点的中介中心性图表
在每个图表下方,我们可以看到时间戳的摘要、连接顶点的数量、网络的最大度数、网络半径和网络直径(对于存在连接顶点的时间点)。图 8**.8 显示了观察的第一个时间点的输出,其中网络的半径和直径都是 1:

图 8.8 – 鳄鱼网络数据集中观察的第一个时间点的输出
注意,我们在动态 Crocodile Network 数据集中观察到的最大直径是 2。其中一些较大的直径发生在感染期间,此时更多的鳄鱼在相互互动(并形成新的互动)。在现实世界的流行病中,人群混合在流行病传播动力学中起着重要作用,更多的混合往往会产生更严重的流行病,涉及更多人群的病例,以及更长的流行病持续时间。
现在我们对动态网络和流行病学模型有了更多了解,让我们转向更大的 Heron Network 数据集,其中包含来自两个不同筑巢群体的个体在诱饵球上的互动,这更接近于涉及多个群体的真实流行病的开始。
鹅网络
让我们从我们的 Heron Network 数据集开始。脚本 8.3 创建了一个鹅网络并绘制了该网络中的每个时间点:
#create empty graph
blue_heron = dn.DynGraph() # empty dynamic graph
#add relevant interactions
blue_heron.add_interactions_from(
[("h1","h2"),("h2","h3"),("h3","h4"),("h4","h5")],t=0)
blue_heron.add_interactions_from(
[("h1","h2"),("h2","h3"),("h3","h4"),("h5","h6")],t=1)
blue_heron.add_interactions_from(
[("h1","h2"),("h2","h3"),("h5","h6"),("h6","h7")],t=2)
blue_heron.add_interactions_from(
[("h1","h2"),("h3","h4"),("h6","h7")],t=3)
blue_heron.add_interactions_from(
[("h2","h3"),("h3","h4"),("h4","h5"),("h6","h7")],t=4)
blue_heron.add_interactions_from([("h3","h4")],t=5)
blue_heron.add_interactions_from(
[("h1","h2"),("h2","h3"),("h3","h4"),("h4","h5"),
("h5","h6")],t=6)
blue_heron.add_interactions_from(
[("h1","h2"),("h2","h3"),("h3","h4"),("h4","h5"),
("h5","h6"),("h6","h7")], t=7)
blue_heron.add_interactions_from(
[("h1","h2"),("h2","h3"),("h3","h4"),("h5","h6"),
("h6","h7")],t=8)
blue_heron.add_interactions_from(
[("h1","h2"),("h3","h4"),("h5","h6"),("h6","h7")],t=9)
#plot network over time
for i in range(10):
g1 = blue_heron.time_slice(i)
nx.draw(g1,with_labels=True)
print()
plt.show()
图 8**.9 显示了我们鹅网络中的第一个时间点,其中来自一个筑巢社区的五个鹅在我们的诱饵球上相互互动:

图 8.9 – 我们鹅网络的第一个时间点图表
注意,我们的白鹭网络在观察期间显示出许多不同的交互模式。这会影响我们的病毒动力学,因为不同的动物在不同的时间周期进行交互。让我们考虑一种传播迅速(beta = 0.4)且解决较慢(gamma = 0.2)的传染性疾病。禽流感疫情往往传播迅速,这些参数可能代表一种通过人群的新型禽流感变种。在真实的禽流感疫情中,较长的潜伏期意味着我们需要观察种群超过 50 分钟(可能是在几天的时间里)。然而,让我们看看我们通过向Script 8.3添加交互来提出的流行病是如何在我们白鹭种群中传播的:
#run epidemic model
import ndlib.models.ModelConfig as mc
%matplotlib inline
from ndlib.viz.mpl.DiffusionTrend import DiffusionTrend
#from ndlib.viz.mpl.DiffusionPrevalence import DiffusionPrevalence
import ndlib.models.dynamic as dm
# model selection
model = dm.DynSIRModel(blue_heron)
# model configuration
config = mc.Configuration()
config.add_model_parameter('beta', 0.4) # infection rate
config.add_model_parameter('gamma', 0.2) # recovery rate
config.add_model_parameter("percentage_infected", 0.1)
model.set_initial_status(config)
# simulate snapshot based execution
iterations = model.execute_snapshots()
#iterations = model.execute_iterations()
trends = model.build_trends(iterations)
#visualize trends
viz = DiffusionTrend(model, trends)
viz.plot()
这个模拟显示,到观察期结束时,近一半的白鹭种群被感染,感染和恢复水平在第二个时间点较低。新的感染定期发生,有一只白鹭似乎比预期的感染期更长(周期 4–7)。图 8.10可视化了这个流行病的动态(由于感染模型是概率性的,所以你的运行结果可能会有所不同):

图 8.10 – 我们白鹭网络中流行病的可视化
如果这种流行病发生在白鹭的真实种群中,可能可以对表现出长期感染期的感染白鹭进行隔离,以避免在种群中进一步传播。在野生动物保护区或康复中心等受保护的种群以及为人类消费而培育的种群中,这种策略是常见的,以避免疾病在动物之间传播。在野外,很难识别感染动物,甚至直到许多动物在监测区域生病,才能检测到爆发。
现在我们通过向Script 8.3添加内容来考虑流行病过程中的网络度量,再次添加一个try/except子句,因为在观察期间有时白鹭会被隔离:
#obtain network centrality statistics for the blue heron network
for i in range(10):
dg = blue_heron.time_slice(i)
try:
# computing betweenness centrality
dd = nx.betweenness_centrality(dg)
plt.plot(dd.values())
plt.title("betweenness centrality")
print()
plt.show()
print ("timestamp = ", i,",", "nodes =",
len(dg.nodes()),",",
"max degree = ",max(dg.degree().values()))
print ("diameter = ", nx.diameter(dg))
print ("radius = ", nx.radius(dg))
except:
print('Infinite value observed.')
在第一个观察期,我们得到一个介于度中心性图之间,值变化很大,如图图 8.11所示:

图 8.11 – 我们白鹭网络中时间周期 1 的介于度中心性图
介于度中心性在整个观察期间变化很大,从几乎1到0。直径从1(时间点6)到6(时间点8);半径从1(时间点6)到3(时间点7和8)。孤立顶点很常见,我们看到种群在交互中分裂(时间点3和9),其中一些白鹭在不同的地点交互,而一些则完全不交互。图 8.12显示了分裂的白鹭种群示例:

图 8.12 – 在点 3 观察到的分叉苍鹭种群相互作用模式
交互模式的频繁变化可能限制了这种流行病的潜在传播,因为动物的交互频率足够低,持续时间足够短,相对于鳄鱼群体中记录的频繁和持久的交互,限制了接触传染个体的机会。在野外,同一物种动物之间交互的频率和持续时间在确定共享同一地理区域的物种中种群流行病的可能性方面起着关键作用。独居物种往往比形成大型 herd 或 flock 的物种传播传染病的速度要低。
自然现象,如诱饵球或暴风雨后的临时水源,为疾病在独居物种或孤立群体中传播提供了时间有限的相互作用机会。因此,它们为保护主义者提供了一个机会,研究那些除了涉及所需资源(如食物或水)的一次性事件外,可能不会频繁互动的动物群体中的流行病潜力。我们检查过的模型为我们提供了估计传染病对通常孤立但在这些事件中混合的群体影响的工具。
摘要
在本章中,我们探讨了动态网络以及随着时间的推移网络结构的变化如何影响流行病的传播,通过鳄鱼和蓝鹭种群中疾病传播的例子进行了探讨。我们还探讨了网络指标与流行病传播之间的关系,指出与更高传播率和假设群体中更严重流行病相关的连通性模式。这些工具对于理解现实世界网络中的趋势和流行病传播至关重要,使研究人员能够规划关键基础设施以应对人类群体中如 COVID-19 或埃博拉等危机,威胁濒危动物群体的传染病,国家选举前的虚假新闻,或社交媒体上青少年中传播的危险行为趋势。
在下一章中,我们将重点转向网络上的机器学习(ML)。
参考文献
Bianconi, G., Darst, R. K., Iacovacci, J., & Fortunato, S. (2014). 三角闭合作为复杂网络中社区基本生成机制的论文。物理评论 E, 90(4), 042806.
Büttner, K., Krieter, J., Traulsen, A., & Traulsen, I. (2016). 动物贸易网络中的流行病传播 – 基于距离和网络的控制措施比较。跨界和新兴疾病, 63(1), e122-e134.
Fèvre, E. M., Bronsvoort, B. M. D. C., Hamilton, K. A., & Cleaveland, S. (2006). 动物迁徙与传染病传播。微生物学趋势, 14(3), 125-131.
Ganesh,A.,Massoulié,L.,& Towsley,D. (2005 年 3 月)。网络拓扑对流行病传播的影响。IEEE 计算机和通信学会第 24 届年度联合会议论文集。 (第 2 卷,第 1455-1466 页)。IEEE。
Garin,F.,Varagnolo,D.,& Johansson,K. H. (2012)。匿名网络中直径、半径和离心率的分布式估计。IFAC 会议论文集, 45(26), 13-18.*
Giuggioli,L.,Pérez-Becker,S.,& Sanders,D. P. (2013)。重叠域中的相遇时间:应用于领土动物种群中的流行病传播。物理评论快报, 110(5), 058103.*
刘,C.,& 张,Z. K. (2014). 动态社交网络中的信息传播。非线性科学和数值模拟通讯, 19(4), 896-904.*
洛,T.,唐,J.,霍普克罗夫特,J.,方,Z.,& 丁,X. (2013)。在社交网络中学习预测互惠和三角闭合。ACM 知识发现数据(TKDD), 7(2), 1-25.*
Martcheva,M. (2014)。禽流感:建模及其控制意义。生物系统杂志, 22(01), 151-175.*
Milli,L. (2018)。理解复杂网络中的传播和演化。
Moore,R. L.,Isberg,S. R.,Shilton,C. M.,& Milic,N. L. (2017)。痘病毒病变对咸水鳄(Crocodylus porosus)皮肤的影响。兽医微生物学, 211, 29-35.*
Read,J. M.,Eames,K. T.,& Edmunds,W. J. (2008)。动态社交网络及其对传染病传播的影响。皇家学会接口杂志, 5(26), 1001-1007.*
Sarker S,Isberg SR,Moran JL,Araujo R,Elliott N,Melville L,Beddoe T,Helbig KJ。鳄鱼痘病毒进化基因组学支持观察到的痘病毒在咸水鳄(Crocodylus porosus)上的感染动力学。病毒。2019 年 12 月 2 日;11(12):1116。DOI:10.3390/v11121116。PMID:31810339;PMCID:PMC6950651。
Sekara,V.,Stopczynski,A.,& Lehmann,S. (2016). 动态社交网络的基本结构。美国国家科学院院刊, 113(36), 9977-9982.*
Stewart,J. D.,Barroso,A.,Butler,R. H.,& Munns,R. J. (2018)。在表面被捕获。生态学, 99(8), 1894-1896.*
van Dam,E. R.,& Kooij,R. E. (2007)。具有给定直径的图的极小谱半径。线性代数及其应用, 423(2-3), 408-419.*
王毅,曹,阿洛菲,阿卜杜拉,A. M.,& 埃莱伊,A. (2015). 复杂网络中节点相关性下的 SIR 模型的重新审视。物理 A:统计力学及其应用, 437, 75-88.*
第四部分:高级应用
第四部分 介绍了更多高级算法来处理网络问题,包括图神经网络、顶点聚类、贝叶斯网络、本体网语言、子图挖掘和图数据库。本部分解决的问题包括根据人口统计和网络结构因素对社交网络顶点进行聚类、理解物质滥用的演变、挖掘与学生学习成果相关的因果途径、创建基因本体、比较尼罗-撒哈拉语言的语言分类、绘制食物网以及创建具有各种关系的电影数据库。
在第四部分中,第十三章和第十四章值得关注。第十三章结合本书中的概念来构建和分析与刚果民主共和国埃博拉疫情相关的数据。第十四章展示了前沿的网络科学应用,包括量子网络科学、深度学习架构的网络分析、网络的高阶结构以及以医疗、环境、图像和语言数据应用为重点的超图。
本部分包含以下章节:
-
第九章,网络机器学习
-
第十章,途径挖掘
-
第十一章**,语言家族的映射——本体方法
-
第十二章,图数据库
-
第十三章,整合一切
-
第十四章,新领域
第十章:网络机器学习
在本章中,我们将考虑在关系数据上通常使用的机器学习(ML)模型及其在网络科学中的应用。虽然许多特定于网络的工具提供了对网络结构和网络内传播预测的良好见解,但机器学习工具使我们能够利用关于网络中个体的额外信息,构建一个更全面的关系、传播过程和与网络或其个体相关的关键结果视图。我们将考虑友谊网络以及与个人及其与其他个人的联系相关的元数据,以探索网络上的机器学习。
我们首先将回到基于共享活动和个体特征的网络构建,然后转向基于网络和元数据特征的聚类,最后根据网络及其元数据预测个体和友谊网络的结果。您将学习如何将网络度量与元数据相结合,以及如何使用网络数据构建几种类型的机器学习模型,这些模型将在本书剩余章节中构建。让我们深入探讨一些友谊网络及其元数据。
具体来说,本章将涵盖以下主题:
-
友谊网络和友谊关系数据集简介
-
网络上的机器学习
-
网络上的 SDL
技术要求
本章中展示的实用示例代码可以在以下位置找到:github.com/PacktPublishing/Modern-Graph-Theory-Algorithms-with-Python
友谊网络和友谊关系数据集简介
在本节中,我们将考虑基于学生行为因素的友谊网络,以形成一个网络。然后,我们将应用无监督学习(UL)方法,即聚类,将个体分组到友谊群体中,以比较添加额外网络结构信息前后的性能。
友谊网络简介
让我们考虑一个以年龄和地理为基础的小学校的学生群体,这在美国很常见。同学可能参加相同的课外活动,如运动队、校报或管弦乐队。他们也可能一起学习、共享餐食或在周末聚在一起。有些人可能形成一个核心的友谊群体,他们上一些相同的课程,参加相同的课外活动,一起学习,并在与学校相关活动之外一起闲逛。这种强大的社会联系通常是一个重要的社会支持和社会关系的来源。这些往往对个人的生活决策和结果非常重要,尤其是在青春期和成年早期,同龄人在心理社会发展中扮演着重要角色。
其他朋友群体可能只一起学习或同一个团队打球,共享的其他兴趣或互动很少。这种弱社会联系在社会中也发挥着重要作用,将个人与社区内广泛的各种资源联系起来,使年轻人接触到更广泛的各种观点和新思想。社会变革通常来自不同社区之间的弱联系,例如在同一个体育队伍中打球、在学校共享课程以及参与宗教活动。虽然弱社会联系通常不会提供强大的社会支持,但它们在网络中起着桥梁作用,可以将个人介绍给将成为强社会联系的其他人。
在我们的第一个友谊网络中,我们将考虑弱社会联系和强社会联系。强社会联系主要发生在由七个朋友组成的群体中,他们大多数时间都在同一个团队打球,上一些相同的课程,一起学习,并在上学前和周末进行体育活动:

图 9.1 – 一群男孩在上学前打篮球的插图
图 9**.1 展示了三个强社会联系男孩在上学前打篮球。我们预计想法、行为和传染性疾病会迅速通过这一部分网络传播,因为这个群体大部分时间都在一起。
相比之下,网络中的弱社会联系包括偶尔的互动,可能包括核心课程或一个共同兴趣将个人聚集在一起短暂的时间,这样他们可以互相认识,并且可能对同学有所了解,但可能不太了解其他学生的兴趣、家庭生活或抱负:

图 9.2 – 同一课堂中的学生在课程期间可能不会互动的插图
图 9**.2 展示了同一课堂中的学生,他们可能不会在那个单一的课程之外互动。这种弱社会联系使学生接触到不同的想法、不同的兴趣、季节性流感等,但对个人的影响不如对整个个体群体的影响大。
在本章中,我们将通过在学生人口统计数据和网络指标以及与学生人口统计数据相关的元数据上使用 UL 算法来推断可能共享强社会联系的学生群体。我们还将通过使用 GNN 的监督学习(SL)来分析随机生成的网络中的社会网络风险,以了解不同类型网络的不同流行病风险。在深入分析之前,让我们先探索一下我们的初始数据集。
友谊人口统计和学校因素数据集
在本章中,我们将主要使用一个包含关于 25 名学生信息的数据集,这些学生通过许多不同的生活方式因素相互连接:团队会员资格、休闲锻炼、周末体育活动、游戏出席率和家庭作业学习小组会员资格。人口统计和社会经济因素,以及课程分配,也通过四门选修课程的注册、性别、居住区的邻里和之前在两所当地初中之一就读的经历将学生联系起来。
这个数据集是从 Farrelly 在大学一年级的一个月日记中提取的。Farrelly 本人是编号#7的个体。为了创建一个加权网络,我们将计算学生之间因子的连接总和。这将给出一个近似值,表明哪些学生彼此之间联系最紧密。我们首先将探索聚类以辨别友谊群体。
在我们转向同时基于元数据和网络指标进行聚类之前,让我们看看如何仅根据元数据来聚类这个网络。
网络上的机器学习
现在我们已经对友谊数据进行了探索,让我们看看聚类算法的性能如何根据是否包含关于网络的结构信息而变化。我们将首先考虑仅学生因素。
基于学生因素的聚类
在我们第一次尝试聚类时,我们将关注数据集本身,该数据集包含有关学生人口统计和社会活动的元数据。最简单的聚类算法之一是k-means 聚类,它通过迭代地划分数据以最小化簇内方差并最大化簇间方差。这意味着聚在一起的学生的共同点比与其他簇中的学生更多。k-means 聚类是一个简单的算法,在大多数情况下都表现良好。然而,需要指定期望的簇数,这通常在事先并不知道。我们将使用3个簇的大小并评估模型拟合度;此外,我们将重新启动算法五次,以确保无论算法的起始点如何以及随机误差如何,我们都能得到一个最优的三簇解决方案。
重要提示
如果你使用的是 Windows 机器,你可能会收到一个不影响结果的警告;scikit-learn上的一些包没有考虑到新的 Windows 操作系统。操作系统的最新版本和包依赖关系的更新往往会触发这些警告。
让我们用Script 9.1深入探讨 k-means 聚类代码:
#import packages needed
import pandas as pd
from sklearn.cluster import KMeans
import igraph as ig
from igraph import Graph
import numpy as np
import os
#import file
File ="<YourPath>/Friendship_Factors.csv"
pwd = os.getcwd()
os.chdir(os.path.dirname(File))
mydata =
pd.read_csv(os.path.basename(File),encoding='latin1')
#k-means model
X=mydata[mydata.columns.drop('Individual ID')]
km=KMeans(n_clusters=3,init='random',n_init=5)
km_model=km.fit_predict(X)
#explore k-means model
km_model
#add to dataset as first solution
km_1=np.array(km_model)+1
mydata['km_1']=km_1
聚类结果建议三聚类解决方案是一个很好的拟合。一个聚类组(#0)包括个体1-7和个体10;这个组主要一起做作业,参加比赛,周末一起锻炼,并在同一个团队中玩耍。聚类#0的特点是紧密的朋友圈,他们共享许多相同的活动,并且在一周的大部分时间里都在一起。我们会担心在这个组中开始并传播流行病。很可能,他们共享相同的保护行为,如健康饮食、定期体育锻炼和社会参与。然而,可能导致身体伤害的传染病或风险行为(尝试危险的体育动作,接受挑战…)是一个担忧,因为这种行为很可能会在整个朋友圈中传播。
另一个组(#1)包括个体8-9、12-14、16、19和23-25;这些个体通常共享课程 2,不在学校外一起锻炼或运动,不一起做作业,也不共享许多其他课程。集群#1的特点是缺乏与我们样本中其他人的参与和互动。这个组在保护行为和风险行为传播方面风险较低,因为他们与我们样本中的其他人没有强烈的社交联系。很可能,他们不会受到或影响他人的行为。
最后一个组(#2)包括个体11、15、17-18和20-22;这个组是异质的,包括没有太多共同点的队友,一些共享几门课程的个体,以及与其他人联系较少的孤立个体。总的来说,这个组对于像集群#1那样的流行病或行为传播风险较低;然而,他们在样本中更为活跃,可能会受到队友或与他们共享多门课程的个体的影响。
基于学生因素和网络指标的聚类
现在,让我们基于阈值化的皮尔逊相关系数创建一个网络,这通过在Script 9.1中添加内容来表示个体之间活动/课程的相似性:
#create network via Pearson correlation
cor=np.corrcoef(X)
cor[cor>=0.5]=1
cor[cor<0.5]=0
X2=np.asmatrix(cor)
#create graph with self-loops removed
friends=Graph.Adjacency(X2)
edge_list=friends.get_edgelist()
self_loop=[]
for i in range(0,25):
self=(i,i)
self_loop.append(self)
to_remove=[]
for i in edge_list:
for j in self_loop:
if i==j:
to_remove.append(i)
friends.delete_edges(to_remove)
ig.plot(friends)
运行这个添加到Script 9.1的代码,会得到如图图 9**.3所示的友谊网络图:

图 9.3 – 阈值化友谊数据集的网络图
图 9**.3显示了两个独立的组,一个由两个个体组成的小组,以及一个由组内个体之间稀疏和密集连接组成的大组。鉴于我们友谊数据集的连接模式,我们预计个体之间的度数和 PageRank 中心性会有很大的变化。让我们在Script 9.1中添加内容,并将我们的特征矩阵附加到重新运行我们的 k-means 分析中,包括人口统计因素和两个缩放中心性指标,以查看我们的聚类如何变化:
注意
你可能会发现关于复制对象的警告;这不会影响分析或对象。
#create scaled metrics and attach to X
d=np.array(Graph.degree(friends))/10
p=np.array(Graph.pagerank(friends))*20
X['degree']=d
X['pagerank']=p
#create new k-means model with graph metrics added
km2=KMeans(n_clusters=3,init='random',n_init=5)
km_model2=km2.fit_predict(X)
#explore new k-means model
km_model2
#add to dataset as first solution
km_2=np.array(km_model2)+1
mydata['km_2']=km_2
与我们最初的 k-means 模型相比,我们可以看到聚类结果中的一些变化。在聚类#0中,个体19被添加(一个与初始#0聚类一起做作业并参加比赛的同队成员)。我们的初始聚类#1显示了个体8-9、12、16和23-25;个体13、14和19不再分配到这个聚类,但其他个体仍然保留。在剩余的聚类中,个体13和14加入了我们的初始聚类,他们似乎比初始聚类#1有更多的连接性,根据中心性指标更适合聚类#2。似乎添加网络连接性指标提高了 k-means 聚类结果,因为那些可能不共享每个活动但显示出类似群体连接的个体被重新分配到更接近他们在社交网络中位置的群体。
现在我们来看看如何使用我们在第五章中首次遇到的半监督聚类算法——谱聚类——来获得我们友谊网络聚类的半监督解决方案。
友谊网络的谱聚类
正如我们在第五章中看到的,谱聚类提供了一个聚类选项,可以分割邻接矩阵或距离矩阵;这可以通过 UL 或Script 9.1来完成,以在我们的友谊数据集上运行具有三个聚类和五个初始化(类似于我们的 k-means 运行)的无监督谱聚类,并与我们的 k-means 结果进行比较,通过向Script 9.1添加以下内容:
注意
再次,你可能会遇到来自 scikit-learn 的 Windows 警告,或者关于图未完全连接的警告(通过拉普拉斯矩阵评估,这会导致与完全连接网络不同的聚类方法)。这两个警告都不会影响结果。
#import packages needed
from sklearn.cluster import SpectralClustering
from sklearn import metrics
#perform spectral clustering and attach to dataset
sc = SpectralClustering(3, affinity='precomputed',n_init=5)
sp_clust=sc.fit(cor)
mydata['sp']=sp_clust.labels_
sp_clust.labels_
与我们在前一小节中获得的 k-means 解决方案相比,这些结果有显著差异。鉴于 k-means 模型都考虑了特定的活动和课程表,而不仅仅是相关性的总结,这种差异是有意义的。谱聚类解决方案专注于网络连接性,而不是友谊数据集中包含的因素或连接性和因素的组合。在这种情况下,k-means 解决方案更符合我们的数据——尤其是第二个 k-means 解决方案,它包括网络指标和原始因素。
无监督与半监督聚类算法的选择高度特定于当前任务。对于非常大的网络,k-means 算法有很好的扩展性解决方案,并且添加良好的扩展性网络连通性度量可以改善 k-means 解决方案,而不会牺牲效率。对于涉及纯网络连通性解决方案的问题,谱聚类可能更可取,尤其是如果构建网络所使用的因素未收集或对于第三方网络是未知的。然而,谱聚类也可以接受部分标记的数据作为输入,允许 SSL 指导学习过程,考虑到已知的数据信息。
现在我们已经看到了如何将 UL 和 SSL 算法用于网络数据集,让我们将注意力转向 SL 算法,重点关注一种特别设计的深度学习(DL)算法,该算法专门用于将网络数据集作为其输入。
网络上的深度学习
在本节中,我们将考虑一种新的深度学习模型,称为 GNNs,它通过嵌入网络顶点、边或全局属性来处理和操作网络,以学习与单个网络、网络内的顶点属性或网络内的边属性相关的结果。本质上,深度学习架构通过演变这些嵌入的拓扑结构来找到输入数据中的关键拓扑特征,这些特征可以预测结果。这可以通过完全监督或半监督的方式进行。在这个例子中,我们将专注于 SSL,其中只有一些标签是已知的;然而,通过提供所有标签作为输入,这可以改变为 SL 设置。
在我们深入探讨 GNNs 的技术细节之前,让我们更深入地探讨它们的使用案例。对网络本身进行分类通常可以提供关于图像特征或类型、分子化合物毒性或作为药物剂的潜在用途,或给定旅行路线和人口枢纽,在感兴趣的国家的潜在流行病传播等重要问题的见解。
通常,在 GNNs 的网络嵌入步骤之前,数据如分子或图像会被转换成网络结构。在分子化合物的背景下,共享共价键的原子,例如,被表示为通过边连接的顶点。因此,每个化合物都基于该化合物的分子结构产生一个独特的网络。对于蛋白质,氨基酸可以作为顶点,共享键(如由二硫键产生的半胱氨酸桥)的氨基酸之间存在连接。
在筛选用于药物开发的潜在化合物时,我们通常想要预测该化合物是否可能具有毒性。使用已知的毒性化合物数据库和无毒性化合物数据库,我们可以开发一个 GNN,根据新化合物的分子结构以及我们关于已知或未知毒性的分子的知识,预测开发中的新化合物的毒性。这允许在动物或人体试验之前快速筛选潜在的新药毒性。
GNN 还能够根据输入网络学习顶点标签,这是本章的重点。例如,在一个犯罪或恐怖主义网络中,我们可能希望根据收集到的情报数据中关于领导者和非领导者的知识,在网络中识别潜在的领导层。情报数据中通常存在不完整的信息,从已知信息中进行学习可以帮助识别网络中未知的关键玩家,这些玩家可能难以从线人或卧底特工中识别。由于顶点预测涉及已经构建的网络,我们通常跳到 GNN 的嵌入步骤,而不是整理数据。然而,可能需要在图中添加顶点标签,以表示网络中关于领导结构已知的信息。
使用 GNN 进行边学习与顶点学习类似,通常通过使用具有关于边属性(如恐怖主义网络成员之间的通信频率或重要性,可能涉及协调恐怖袭击或在该地理区域内招募新成员)的完整或不完整信息的现有网络。在这种情况下,我们在进行 GNN 训练之前将边嵌入,而不是顶点。
现在我们已经了解了一些可以用 GNN 解决的问题,让我们更多地了解构建 GNN 所使用的架构和数学运算。
GNN 简介
GNN 构建涉及几个关键步骤。在前一小节中,我们提到了数据转换作为可能的第一个步骤。GNN 需要一个网络或网络张量作为算法嵌入步骤的输入,因此数据必须包含网络结构化的数据以及与网络本身或感兴趣网络中的边/顶点相关的一些结果标签。可能需要一些数据工程来将图像、分子或其他数据源整理成网络结构。在前一小节中,我们概述了分子或蛋白质数据如何转换为网络结构。许多常见类型的数据都有标准的转换方法,可以将它们转换为网络数据;例如,在前几章中,我们将空间和时间序列数据转换为可用于 GNN 输入的网络结构。
当我们的数据存在于一个具有网络、边或顶点标签的网络结构中时,我们就准备好在网络、边或顶点级别嵌入相关结构了。嵌入的目标是在嵌入级别(网络、边或顶点)找到相关网络几何的低维表示。它们还可以包括其他相关信息,例如网络、边或顶点的其他属性。有时,手动创建这些嵌入是有利的,以便包含相关的网络结构和属性信息。例如,在我们的友谊网络中,我们有许多个人参与的活动数据;我们可能希望创建一个嵌入,不仅能够捕捉网络中心性指标,还能够捕捉作为网络顶点表示的个人活动参与度。在我们的 k-means 示例中,包括这两种类型的信息(网络结构和收集到的活动数据)提高了 k-means 在寻找我们假设存在的组时的性能。
Python 中的许多 GNN 包,如 PyTorch(我们将在后续部分中使用),都有函数可以总结网络在网络、边和顶点级别的属性,以在指定的维度上创建自动嵌入。我们在 GNN 训练之前如何嵌入数据对结果有很大影响,因此在构建 GNN 时考虑这一步很重要。即使使用我们将会使用的 PyTorch 等包函数,指定维度也会影响算法性能。我们不想维度太低(遗漏了与感兴趣的结果相关的关键特征),但也不希望维度太高(可能包含很多噪声)。在实践中,这个参数通常通过网格搜索进行优化。
一旦我们有了嵌入,我们就可以定义结果为目标标签。我们可能需要使用 one-hot 编码将文本标签转换为一系列二进制结果。正如其他深度学习算法可以处理多类分类问题、连续结果或其他类型的分布一样,GNN 可以适应许多感兴趣的不同结果。这种灵活性使它们非常适合建模网络分类/回归问题中的结果。
深度学习架构本身并不独特。熟悉卷积神经网络(CNNs)的读者将认识到我们将讨论的许多组件和反向拟合算法,因为它们在 GNN 的上下文中是相同的。我们从一个维度等于嵌入维度的输入层开始,并以一个维度等于我们结果类别数(对于分类问题,我们将在本章中考虑)的输出层结束。当只有输入层和输出层存在时,神经网络(NNs)近似线性回归,输入矩阵和输出向量之间存在一个学习到的映射。然而,在这些层之间,我们通常包括隐藏层,以进一步处理输入层和输出层之间的特征,如图9**.4所示:

图 9.4 – GNN 生命周期总结,包括数据工程和深度学习架构步骤
隐藏层细化输入层和输出层之间的拓扑映射,通常在训练过程中汇总发现的拓扑特征,以输入到下一个隐藏层。对于小型网络和小型网络样本,隐藏层的数量应该较小,以保持解的稳定性和获得良好的性能。对于大型网络或网络集,可以添加更多隐藏层以提高性能,而不会遇到解的不稳定性或拟合问题。
隐藏层通常使用一个非线性映射函数,称为激活函数,在输入层和连接到该特定隐藏层的输出层之间。在实践中,只有少数激活函数是常见的,包括ReLU 函数,对于负数或零输入值返回 0,对于正输入值返回输入值本身。
卷积层,也常用于隐藏层,将一个滤波函数(通常是核)应用于输入层,通过定义的核函数对其进行转换。通常,卷积层会降低矩阵或张量的维度,因此可能使用零填充以保持维度,以避免以限制给定输出维度可能层数的方式转换层。对于小型数据集,例如我们考虑的,这并不一定是问题,因为浅层网络往往是我们在有限数据量下可以训练的唯一稳定的 GNN。
构建有效架构的理论超出了本书的范围,对深度学习(DL)感兴趣但没有背景知识的读者可以通过阅读本章末尾提供的参考文献来获取这些知识。
一旦定义了架构(无论是通过专家猜测还是再次通过网格搜索来优化架构),我们必须拟合连接每一层节点以及层间节点的参数(称为 权重)。有许多选项可以做到这一点,并且可以定义自定义拟合算法。然而,我们将关注 PyTorch 包中我们示例中使用的两个最常见选项:Adam 优化器和随机梯度下降(SGD)。
SGD 通过探索定义在神经网络上的梯度函数,在节点之间以及层与层之间调整权重,这与梯度提升法拟合线性回归模型的方式非常相似。定义了一个 学习率 来控制梯度函数的探索。较大的学习率可以更快地拟合模型,但可能无法找到全局最小值或最大值。SGD 的一个缺点是算法可能会陷入局部最优,导致结果准确率低于给定输入数据、层间映射函数和输出数据所能达到的准确率。它还倾向于较慢,需要更多的算法迭代,甚至可能需要更多的处理能力来拟合模型。
Adam 优化器 允许节点之间具有灵活的学习率,从而加快模型拟合速度,并通过允许学习率调整到局部梯度景观来避免局部最优。Adam 还允许衰减率,进一步定制局部权重学习。自从最初的 Adam 优化器开发以来,已经发展了许多 Adam 优化器,并且很可能会有更多针对 GNN 和其他深度学习架构的开发。一个缺点是 Adam 优化器通常占用内存较多。在训练大型 GNN 时,可能更倾向于使用 SGD 以避免训练过程中的内存问题。
在实践中,很难知道哪种优化器最适合拟合定义的架构的权重,因此通常会采用网格搜索来优化这一选择。一旦选择了拟合算法,就会运行预定义的(通常通过网格搜索优化)迭代次数,或者算法会运行直到满足停止标准。Adam 优化器通常比 SGD 优化器收敛得更快,但性能可能会根据数据和架构而变化。
现在我们对 GNN 的构建块有了一些了解,让我们通过一个开源体育网络示例来探索,该网络由分配给两位不同老师的两名学生组成(这是我们感兴趣的结果)。
示例 GNN 对 Karate Network 数据集进行分类
对于我们的示例,我们将预测一个常见开源网络中的顶点级属性:Zachary 的Karate Network数据集。这个数据集由 34 个个体组成,他们通过 78 条边连接在一个空手道训练网络中,当管理员和教练之间发生冲突时,他们最终分裂成管理员和教练两派。在这个网络上的顶点分类和学习问题中的一个主要任务是预测哪些个体最终站在冲突中的哪一方(管理员或教练)。我们将通过半监督 GNN 模型方法来预测顶点标签。
我们首先将安装所需的包并导入我们的数据集。如果您还没有安装必要的包,请在运行我们的代码之前在您的机器上安装它们。我们已经在Script 9.2中提供了这一步骤作为选项:
#install packages if you have not installed them on your machine
#!pip install dgl
#!pip install torch
#import packages
import dgl
import dgl.data
import torch
import torch.nn as nn
import torch.nn.functional as F
import itertools
from dgl.nn import SAGEConv
#import Karate Club dataset with instructor/administrator labels
dataset = dgl.data.KarateClubDataset()
num_classes = dataset.num_classes
g = dataset[0]
为了嵌入我们的顶点数据,我们将使用 PyTorch 的默认嵌入算法,其维度为6。考虑到我们网络的大小,任何位于4至6维度范围内的内容都应该能合理地工作。让我们在Script 9.2中添加代码以嵌入我们的顶点:
#embed vertices with a dimension of 6
vert_em = nn.Embedding(g.number_of_nodes(),6)
inputs = vert_em.weight
nn.init.xavier_uniform_(inputs)
这段脚本应该为我们的网络中的每个顶点输出嵌入向量。现在我们已经嵌入顶点,我们可以创建我们的标签。鉴于我们希望展示半监督方法,我们将向网络提供关于六个顶点(1、3、5、12、15和32)的信息。您可以尝试调整脚本的这一部分,看看顶点数量的增减如何影响我们选择架构的性能和稳定性。让我们通过添加到Script 9.2来添加标签信息:
#obtain labels and denote available labels for GNN learning
#(here: 1, 3, 5, 12, 15, 32)
labels = g.ndata['label']
labeled_nodes = [1, 3, 5, 12, 15, 32]
接下来,我们需要构建我们的 GNN 架构并定义训练参数。许多使用此数据集的 GNN 论文和教程采用非常浅的网络架构和 Adam 优化器。为了比较和展示构建 GNN 的其他选项,我们将使用两个隐藏层而不是一个(包括与 ReLU 函数耦合的卷积层),使用小型层(隐藏层分别为八个和六个节点),SGD 拟合算法(学习率为0.01,动量为推动算法的0.8,接近默认值),以及990次迭代。许多在线的例子使用 Adam 优化器和比我们的架构节点更多的单隐藏层,允许更少的训练迭代。然而,对于更大的网络顶点标签预测问题,更复杂的架构可能表现更好,因此我们将展示如何包含更多隐藏层以及如何使用不同于 Adam 的拟合算法。让我们通过添加到Script 9.2来定义我们的架构并拟合我们的权重:
#build a three-layer GraphSAGE model
class GraphSAGE(nn.Module):
def __init__(self, in_feats, h_feats1, h_feats2,
num_classes):
super(GraphSAGE, self).__init__()
self.conv1 = SAGEConv(in_feats, h_feats1, 'mean')
self.conv2 = SAGEConv(h_feats1, h_feats2, 'mean')
self.conv3 = SAGEConv(h_feats2, num_classes,'mean')
def forward(self, g, in_feat):
h = self.conv1(g, in_feat)
h = F.relu(h)
h = self.conv2(g, h)
h = F.relu(h)
h = self.conv3(g, h)
return h
#6 embedding dimensions as input,
#a hidden layers of 8 and 6 nodes, and 2 classes to output
net = GraphSAGE(6,8,6,2)
#GNN training parameters
optimizer=torch.optim.SGD(
itertools.chain(
net.parameters(), vert_em.parameters()),
lr=0.01, momentum=0.8)
all_logits = []
#train GNN
for e in range(990):
logits = net(g, inputs)
logp = F.log_softmax(logits, 1)
loss = F.nll_loss(logp[labeled_nodes],labels[labeled_nodes])
optimizer.zero_grad()
loss.backward()
optimizer.step()
all_logits.append(logits.detach())
if e % 90 == 0:
print('In epoch {}, loss: {}'.format(e, loss))
你应该看到损失函数(此处为逻辑回归链接函数)随着迭代次数的增加而降低,这是你的输出。典型的 GNN 架构准确率在 95%-100% 范围内。由于这个数据集较小,我们的架构较大,你的算法运行准确率可能会有很大差异。这与算法拟合步骤中的随机采样和底层梯度景观的粗糙度有关。让我们在脚本 9.2中添加一些内容来找到我们的准确率:
#obtain accuracy statistics
pred = torch.argmax(logits, axis=1)
print('Accuracy',(pred == labels).sum().item() / len(pred))
我们运行该算法的准确率在此次运行中达到了 ~97%。这与其他 GNN 架构的性能相当。然而,如果你的准确率在一个或多个脚本运行中显著降低,请不要感到惊讶,因为我们没有足够大的样本量来适应这种架构。改变嵌入维度、架构和训练算法参数将影响准确率,并且鼓励感兴趣的读者修改脚本 9.2,以了解不同选择如何影响准确率和拟合的稳定性。
通常,GNN 分类器在较大的网络和更多的标签输入到半监督使用时工作得更好,并且表现出更好的稳定性。Zachary 拳击网络数据集足够小,因此建议使用其他方法来分类网络。然而,在大型社交网络(如社交媒体平台上的那些)或大型地理网络(如由连接城市超过 50,000 人的道路定义的美国城市网络)上学习标签将导致更稳定的 GNN 解决方案,并且可以创建一个非常深的架构。但是,为了拟合这些大型模型,我们通常需要一个云计算平台,因为大型数据集和大量迭代对笔记本电脑来说可能很难处理。
GNN 在许多不同领域的基于网络的分类问题中显示出巨大的潜力,并且它们很可能将继续发展和解决与大型网络和网络集合相关的紧迫问题。然而,云计算解决方案通常是必需的,这需要与数据以及云平台上的 Python 笔记本解决方案合作的专业知识,该平台用于存储数据和拟合 GNN。
摘要
在本章中,我们考虑了网络数据集上机器学习算法的几个用例。这包括通过拟合 k-means 和谱聚类在友谊网络上的 UL。我们考虑了对个人参与的活动原始数据集以及添加了网络度量以改进聚类精度的原始数据集进行 k-means 聚类。然后,我们通过一种称为 GNNs 的深度学习算法类型,在网络上和网络的集合上进行 SL 和 SSL。我们通过浅层 GNN 准确预测了 Zachary 的空手道网络数据集中个人的标签,并将结果与其他现有的网络分类问题解决方案进行了比较。在第十章中,我们将使用与条件概率相关的网络工具挖掘教育数据中的因果关系。
参考文献
Acharya, D. B., & Zhang, H. (2021). 加权图节点聚类通过 Gumbel Softmax。arXiv 预印本 arXiv:2102.10775。
Bongini, P., Bianchini, M., & Scarselli, F. (2021)。用于药物发现的分子生成图神经网络。神经计算,450,242-252。
Fan, W., Ma, Y., Li, Q., He, Y., Zhao, E., Tang, J., & Yin, D. (2019, 五月)。图神经网络在社交推荐中的应用。世界万维网会议(**第 417-426 页)。
Hartigan, J. A., & Wong, M. A. (1979)。算法 AS 136:一个 k-means 聚类算法。皇家统计学会系列 C(应用统计),28(1),100-108。
Imambi, S., Prakash, K. B., & Kanagachidambaresan, G. R. (2021)。PyTorch。使用 TensorFlow 进行编程:边缘计算应用解决方案,87-104。
Kumar, V. (2020)。对图神经网络的研究(博士论文,都柏林爱尔兰的 Trinity College)。
Labonne, M. (2023)。使用 Python 进行图神经网络实践:使用 PyTorch 构建强大的图和深度学习应用程序的技术和架构。Packt 出版社。
Liang, F., Qian, C., Yu, W., Griffith, D., & Golmie, N. (2022)。图神经网络及其应用的综述。无线通信和移动计算,2022。
Mantzaris, A. V., Chiodini, D., & Ricketson, K. (2021)。利用简单的图卷积神经网络作为模拟网络中影响传播的模型。计算社交网络,8,1-17。
Min, S., Gao, Z., Peng, J., Wang, L., Qin, K., & Fang, B. (2021). STGSN—一个用于时间演变社交网络的时空图神经网络框架。知识系统,214,106746.
Ng, A., Jordan, M., & Weiss, Y. (2001)。关于谱聚类的分析和一个算法。神经网络信息处理系统进展,14。
Scarselli, F., Gori, M., Tsoi, A. C., Hagenbuchner, M., & Monfardini, G. (2008). 图神经网络模型。IEEE 神经网络 Transactions,20(1),61-80.
Wieder, O., Kohlbacher, S., Kuenemann, M., Garon, A., Ducrot, P., Seidel, T., & Langer, T. (2020). A compact review of molecular property prediction with graph neural networks. 《药物发现今日:技术》,37,1-12.
Wu, Z., Pan, S., Chen, F., Long, G., Zhang, C., & Philip, S. Y. (2020). A comprehensive survey on graph neural networks. 《IEEE 神经网络与学习系统汇刊》,32(1),4-24.
Zachary, W. W. (1977). An information flow model for conflict and fission in small groups. 《人类学研究杂志》,33(4),452-473.
Zhang, L., Xu, J., Pan, X., Ye, J., Wang, W., Liu, Y., & Wei, Q. (2023). Visual analytics of route recommendation for tourist evacuation based on graph neural network. 《科学报告》,13(1),17240.
Zhou, J., Cui, G., Hu, S., Zhang, Z., Yang, C., Liu, Z., ... & Sun, M. (2020). 《图神经网络:方法与应用综述》,AI open,1,57-81.
第十一章:路径挖掘
在本章中,我们将探讨路径挖掘,我们将使用网络科学和推理算法来揭示存在于顺序数据中的路径。在医学领域,疾病进展通常遵循从一种疾病状态到另一种疾病状态的路径,在教育领域,课程材料通常建立在学位课程(如法律或医学)中的先前课程材料之上,这两种领域的结果路径都很常见。我们将考虑一个模拟的医学课程示例,以了解哪些课程可能需要额外的支持,以确保学生在假设的医学院中取得成功或失败。我们将探讨教育背景下的路径挖掘,但现实世界中的许多问题都涉及路径。让我们更深入地探讨一些这些场景。
到本章结束时,您将了解如何识别涉及达到感兴趣结果路径的问题,将高级推理算法应用于在数据集中找到可能的路径,并解释结果以在路径的关键点进行干预,以达到给定的感兴趣结果。我们将探讨教育背景下的路径挖掘,但现实世界中的许多问题都涉及路径。让我们更深入地探讨一些这些场景。
具体来说,本章我们将涵盖以下主题:
-
贝叶斯网络和因果路径简介
-
教育路径示例
-
分析课程顺序以找到最佳学生毕业路径
技术要求
您需要 Jupyter Notebook 来运行本章中的实践示例。
本章的代码可在以下链接找到:github.com/PacktPublishing/Modern-Graph-Theory-Algorithms-with-Python
贝叶斯网络和因果路径简介
许多跨行业的感兴趣的结果都涉及一系列事件或选择,以达到感兴趣的结果。包裹的到达取决于在运输和到达之间每个中继点的包裹安全到达。机械故障可能涉及单点故障(SPOFs)或故障级联,其中在机械本身故障之前,机器的多个部分会先发生故障。
考虑药物成瘾的路径。首先,一个人必须处于药物使用的情况中——通过朋友、通过家庭或通过一个新的社交群体。然后,这个人必须尝试一种成瘾性物质。接着,他们必须足够喜欢这种物质,以至于频繁使用,达到对药物产生身体或心理依赖的程度。图 10.1以图表形式展示了这一系列步骤:

图 10.1 – 导致药物成瘾的事件连续发展过程
图 10**.1看起来很像一个有向网络,其中每个情况是一个顶点,每个途径中的每一步是一个有向边。每个代表进展步骤的边可能被从一个顶点到下一个顶点的进展概率加权。让我们考虑一个处于尝试新型毒品高风险的青少年群体,以及研究人员收集的关于每个使用阶段的群体横断面数据,以确定每个步骤的风险。假设所有青少年都处于他们可以尝试毒品的情况中,但实际上只有 30%的人尝试了。尝试毒品的人中,只有 20%的人喜欢它并继续使用。然而,继续使用的人中,有 40%会依赖毒品。图 10**.2总结了这些信息:

Figure 10.2 – A pathway to drug addiction with probability of transition at each step in the pathway
图 10**.2显示了随着毒品使用进展到不同使用阶段,概率链。我们可以通过乘以给定阶段之前每一步的转换概率来找到达到每个阶段的概率。例如,在这个群体中,定期使用涉及尝试毒品(有 30%的可能性这样做)和开始定期使用(有 20%的可能性这样做);这给出了 6%的可能性(0.3 乘以 0.2),即这个群体中的青少年定期使用这种新毒品。鉴于 40%的这些定期使用新毒品的青少年最终会对其产生依赖,我们预计在这个群体中的任何青少年在他们的环境有利于尝试毒品的情况下,对新毒品的依赖性进展的概率为 2.4%。
数学为我们提供了一种正式的方式来研究这些途径或从一组数据中构建它们。让我们转向我们需要用来形式化事件序列中概率直觉的数学工具。
贝叶斯定理
依赖于其他事件的事件的概率称为条件概率。在概率论中,条件概率是在另一个事件已经发生的情况下,事件发生的概率的度量。在图 10**.2中,药物依赖的进展依赖于定期使用新毒品,这又依赖于第一次尝试毒品,这又依赖于处于人们使用毒品的情况中。虽然条件概率不需要涉及这么多条件步骤,但它确实涉及一个先前的、影响感兴趣事件发生概率的事件。
回到我们图 10**.2中的例子,我们有一个宇宙,其中青少年接触到了毒品使用,在图 10**.3中以矩形表示:

Figure 10.3 – A universe in which drug use is possible
图 10.3 展示了一个对我们青少年群体来说概率为 100% 的事件;他们中的所有人都在家、学校或与朋友在一起时接触到了这种新药。然而,在新的、远小的宇宙(如 图 10.4 所示)中,尝试新药的事件只发生了 30%:

图 10.4 – 在我们最初接触药物使用的宇宙中尝试药物的新宇宙
图 10.4 展示了一个新宇宙,其中一部分青少年尝试了新药。在这些青少年中,20% 会定期使用该药物。这创造了一个新的宇宙,如 图 10.5 所示:

图 10.5 – 包含经常使用新药的青少年的较小宇宙
图 10.5 展示了一个与最初所有可能尝试这种新药的青少年群体相比非常小的青少年宇宙(正如我们所预期的那样,因为在这个群体中只有 6% 的青少年最终会定期使用这种新药)。在那些经常使用新药的青少年中,我们可以再次将 图 10.5 中所示的宇宙分割,以获得成为药物依赖的青少年的集合。我们不会可视化这个宇宙,因为它太小,无法在常规药物使用的狭小矩形框内很好地可视化。
贝叶斯定理提供了一个公式,通过将先前事件的概率与感兴趣的事件相关联来计算条件概率。我们可以通过以下公式计算事件 A 在事件 B 发生的条件下的概率:
P(A|B)=(P(A)*P(B|A))/P(B)
在这里,P(A|B) 是在事件 B 发生的条件下事件 A 发生的概率,P(A) 是事件 A 发生的概率,P(B|A) 是在事件 A 发生的条件下事件 B 发生的概率,而 P(B) 是事件 B 发生的概率。
为了使这个例子更加具体,让我们回到我们的药物使用例子。我们将事件 A 定义为尝试新药,事件 B 定义为出现在使用该药物的地方。事件 B 的概率是 100%,同样,在事件 A 发生的条件下,事件 B 的概率也是 100%。事件 A 的概率是 30%。让我们将这些值代入我们的公式中:
P(A|B)=(0.3*1)/1
这给我们带来了预期的 30%。然而,在概率论中,并非所有事件都有 100% 的概率,并且随着条件事件的增加,许多计算将变得更加复杂。在现实世界的数据中,我们可能需要使用算法来估计这些概率,前提是我们已经收集了数据。让我们继续到事件链,例如我们的药物使用例子。
因果途径
条件概率可能涉及超过两个感兴趣的事件及其条件关系。因果路径涉及一系列条件概率,这些概率可能相对较短,例如我们的药物依赖示例,或者非常非常长且复杂,例如导致疾病风险的蛋白质激活路径。
多亏了贝叶斯定理,我们可以以分段的方式将条件概率链式连接起来,直到所有条件概率都链接到一个最终路径。这对于估计已知因果路径的效果大小和进展速率非常有效。然而,很多时候,我们不知道导致感兴趣的结果的确切事件序列,只是收集了大量我们认为与结果相关的数据。为了分析这些数据,我们需要一个算法。幸运的是,这样的算法确实存在。让我们深入了解贝叶斯网络及其在因果路径挖掘中的应用。
贝叶斯网络
一个贝叶斯网络描绘了一组变量及其条件概率,作为一个有向无环图(DAG)。没有通过边连接的顶点是条件独立的(不相互依赖)。通过边连接的顶点是条件依赖的。
概率的链式法则允许我们将贝叶斯网络构建为条件概率的乘积。考虑事件 A、B 和 C。回到我们的药物使用示例,事件 A 可能是常规使用,事件 B 是尝试药物,而事件 C 可能是与药物相关。因此,我们的因果链如下:
P(A,B,C)=P(A|B,C)*P(B|C)*P(C)
P(A, B, C) 指的是所有事件发生的概率。P(A|B, C) 指的是在 B 和 C 发生的情况下 A 发生的概率。P(B|C) 是在 C 发生的情况下 B 发生的概率。因为这些事件通常是从数据中推断出来的,我们需要使用算法来估计联合概率分布 P(A,B,C)。通常,这是通过计算基于数据的条件期望值来完成的。然后,算法通过最大化完全似然来最大化期望值,假设计算出的期望值是正确的。然后,根据上一步计算出的似然值再次调整值。一旦期望值和似然值收敛,算法就会停止。
现在我们已经了解了贝叶斯网络的基础知识,让我们转向一个教育数据示例,其中包含因果路径和贝叶斯网络可以学习的数据集。
教育路径示例
贝叶斯概率和网络的一个常见用途是在教育研究中。课程排序涉及建立先前的知识,而基于先前知识选择课程的学生必须首先获得这些先前的知识,才能在当前课程中取得成功。先修课程允许教授要求学生在他们的课程之前先修某些课程。进入大学以及随后进入研究生项目都是基于在先前教育水平成功完成考试的条件。因此,教育是一个自然产生贝叶斯网络的领域。让我们深入一个例子。
教育成果
教育中的许多成果都是学生长期学习课程序列的最终结果。例如,在南非和美国,一个希望从事法律工作的学生必须学习许多课程,并通过最后的考试,才能独立执业。通过考试依赖于课程作业的先前成功以及实习和其他实际法律活动中获得的经验。大多数医学学位都遵循类似的教育方法,结合课程作业、实践经验以及最终考试,最终达到该领域的专业地位。
理解这些路径中的关键里程碑和转折点确保尽可能多的学生通过最终考试以获得他们的执照。然而,存在许多课程,并非所有学生在整个教育过程中都学习相同的课程。医学学生可能专注于与他们感兴趣的医学亚专业最相关的课程。法学学生可能在不同的法律实践分支实习,以了解他们可能喜欢从事哪种类型的法律。因此,数据通常是 incomplete;加上项目规模小,这创造了一个困难的数据挖掘场景。
课程序列
在专业教育中的一个主要注意事项是课程依赖性。例如,在开始病理学课程之前,医学学生通常完成人体解剖学。你可能会预期病理学的成功至少部分依赖于人体解剖学的成功。然而,病理学的成功可能并不依赖于人体遗传学课程的成功。也可能的情况是,这三门课程的成功并不影响最终考试结果(不太可能,但有可能)。
为了使问题更加复杂,课程中的某些模块可能比其他模块与学生成果更相关。因此,即使是课程层面的分析也可能不足以精确指出学生成功或失败通常源于何处。当查看这类现实世界问题时,考虑路径被审查的分析水平是很重要的。
成功的前因
收集与学生成功相关的数据时,通常有两种方法。一种方法是无假设的方法,不对哪些课程或模块与结果关系最密切做出假设。这种方法的优势在于确保收集所有可能的数据,以便发现任何现有的关系。然而,收集的课程/模块数据量可能与样本量相对较大,导致算法性能下降。
另一种方法是在收集数据之前对感兴趣的路径有先验知识。这种方法限制了收集的数据量,允许算法在足够大的样本量上运行以获得良好的性能;然而,如果猜测错误,结果不会反映系统中实际存在的真实路径。
随着我们模拟数据,我们将采用先验知识方法生成一个小数据集,以展示贝叶斯网络如何在数据集中找到路径。让我们深入数据集模拟,看看贝叶斯网络的实际应用。
分析课程顺序以找到最佳学生毕业路径
在这个例子中,我们将处理一个代表医学课程的数据集,以理解完成医学学位的路径。在真实的医学课程中,我们可能会包括所有课程以及可能的其他因素,例如毕业所需的临床经验和研究项目。然而,为了运行一个简单的例子,我们假设数据挖掘已经完成,以确定与毕业结果相关的课程。
数据集简介
让我们想象一个有许多课程最终导致最终执照考试的医学课程。一些课程在最终执照考试中并不是特别强调(但在进入该领域之前仍然很重要)。然而,有一小部分课程会定期出现在执照考试中,其中一些课程建立在先前重要的执照课程之上。让我们假设人体解剖学、细胞生物学、病理学、微生物学和神经科学是通常与执照考试成功相关的五门课程。一些材料可能在课程之间重叠——尤其是人体解剖学、病理学和微生物学。
我们可以使用 Python 模拟五门课程的学生表现,其中三门课程在课程序列中有材料重叠,两门课程与其他三门课程相对无关,并在期末考试中探索我们如何挖掘与期末结果——我们的期末考试——相关的课程路径。numpy包有几个有用的函数,首先生成具有不同成功概率的二项分布(random.binomial()),然后根据其他生成的概率分布选择不同的结果(使用where()子句):
-
让我们通过脚本 10.1来观察这一过程,其中我们首先导入我们的包,然后为500名学生生成条件课程分布:
#import needed packages import pandas as pd import numpy as np #create conditional courses that relate to final exam passage #rates #course 1, with low passage rates in general course1=np.random.binomial(1,0.75,500) #course 2, with low passage rates on the first attempt if course #1 was failed course2a=np.random.binomial(1,0.95,500) course2b=np.random.binomial(1,0.5,500) course2=np.where(course1>0,course2a,course2b) #course 3, with passage rates relative dependent on prior #performance course3a=np.random.binomial(1,0.95,500) course3b=np.random.binomial(1,0.65,500) course3=np.where(course2+course1>1,course3a,course3b) -
然后,我们将向脚本 10.1添加我们的最后两门课程以及期末考试上的相关表现:
#create two other courses that are not related to performance on #final exam course4=np.random.binomial(1,0.8,200) course5=np.random.binomial(1,0.85,200) #create final exam passage rates passa=np.random.binomial(1,0.95,200) passb=np.random.binomial(1,0.75,200) pass_final=np.where(course1+course2+course3>2, course3a,course3b) -
现在我们已经有了关于课程通过/失败表现的课程数据,我们可以创建一个包含这些数据的数据框,以便将其传递给我们的贝叶斯网络路径挖掘。让我们将此部分添加到脚本 10.1中,为我们的路径挖掘做准备:
Course_Data=pd.DataFrame([course1, course2, course3, course4, course5, pass_final], index=['Course_1', 'Course_2', 'Course_3', 'Course_4','Course_5', 'Pass_Final_Exam']).transpose()
现在我们有了我们的数据集,我们可以将注意力转向我们将创建的贝叶斯网络。
bnlearn 分析
Python 有一个易于使用的包可以将贝叶斯网络拟合到数据集,例如我们在脚本 10.1中生成的数据集:bnlearn包。如果您尚未安装当前版本的numpy,您需要在安装bnlearn包之前更新您的numpy版本,以避免安装错误。我们假设您已经完成了这一步。请按照以下步骤操作:
注意
此外,还有一个pandas依赖项,因此我们将在以下代码中提供一个安装特定版本包的示例,以处理pandas版本依赖问题。安装完成后,您需要重新启动您的 Jupyter 内核。
-
首先,我们将安装bnlearn包,并使用脚本 10.2加载它:
#install bnlearn package if not already in directory and import !pip install pandas==1.5.3 !pip install bnlearn import bnlearn as bn -
现在我们已经安装了包,我们可以通过向脚本 10.2添加函数的默认参数来将贝叶斯网络拟合到我们的Course_Data数据集:
#fit Bayesian network model = bn.structure_learning.fit(Course_Data)默认参数包括一种爬山算法,它以贪婪的方式搜索局部模型空间(其中每一步调整一个边),以及用作性能测量的贝叶斯推理标准(BIC)(这是一个基于模型偏差的测量,并受到模型参数数量的惩罚)。
-
bnlearn包有一个很好的表格总结,显示了贝叶斯网络中发现的依赖关系,以显示哪些变量是相关的。让我们将此部分添加到脚本 10.2中,并检查打印的表格结果在图 10.6中的结果:
#print dependencies print(model['adjmat'])

图 10.6 – 我们贝叶斯网络结果的总结
图 10.6显示了不同变量之间存在的哪些关系。目标是依赖事件,而来源是目标所依赖的先验事件。如果发现存在依赖关系,则目标与来源相关的单元格将读取为True,如果没有发现依赖关系,则单元格将读取False。由于这是关于课程时间安排的朴素分析,我们将忽略结果的方向性(例如,根据来源和目标的方向性,期末考试不依赖于它之前的任何课程,但发现课程依赖于期末考试成绩)。通常,贝叶斯网络分析用于寻找关系,而不是显式方向性,这可以通过其他统计方法(本章后面讨论)进行测试。
我们确实找到了我们模拟的几个依赖关系。Course_2被发现依赖于Course_1,期末考试成绩依赖于Course_1、Course_2和Course_3。虽然这并不完全准确,但我们确实发现我们所有的四个依赖关系都在因果路径中。
-
通过向Script 10.2添加内容,我们可以可视化我们在分析中找到的 DAG:
#plot Bayesian network derived from dataset bn.plot(model)这个图应该显示类似于图 10.7的内容,显示我们模拟的四个相关变量作为一个课程成功路径中存在的:

图 10.7 – 贝叶斯网络输出图
对于我们使用条件随机分布抽取的小数据集,我们的结果相当不错。然而,贝叶斯网络对拟合中使用的算法非常敏感。让我们重新运行我们的分析,使用穷举搜索,它对所有可能的贝叶斯网络结构进行评分,以选择最佳模型,而不是使用爬山算法。请注意,由于拟合模型所需的计算时间和功率增加,它不推荐作为大型数据集或具有许多变量的数据集的拟合算法。
注意
根据您的系统,您可能无法在您的系统上完整运行以下脚本。在我们的机器上,以下脚本运行超过了一个小时。
Script 10.3运行了这个新的贝叶斯网络拟合到我们设计为依赖于先前课程成绩的三门课程:
#fit Bayesian network
model = bn.structure_learning.fit(Course_Data,methodtype='ex')
现在我们可以通过向Script 10.3添加内容来检查我们贝叶斯网络找到的关系表,如图图 10.8所示:
#print dependencies
print(model['adjmat'])

图 10.8 – 我们模拟的三门课程之间的贝叶斯网络依赖关系表
图 10.8 显示,这个穷举搜索算法确实找到了所有三门课程都是相互依赖的,以及这些依赖关系的正确方向——通过Course_2依赖于通过Course_1,以及通过Course_3依赖于通过Course_1和Course_2。
现在让我们通过向Script 10.3添加以下内容来用我们贝叶斯网络的图形表示可视化这些结果:
#plot Bayesian network derived from dataset
bn.plot(model)
这产生了图 10.9所示的输出,它显示了三门课程之间的依赖关系。注意图 10.6中的方向性与我们在数据集中模拟的依赖关系相匹配:

图 10.9 – 模拟的三门课程之间相互依赖的通过依赖关系图
注意,虽然穷举搜索可以找到正确的因果关系路径,但对于大多数现实世界的问题来说,它是不切实际的,因为它的运行时间限制在包含更多变量的数据集上。即使对于我们的完整数据集,使用穷举搜索计算贝叶斯网络的运行时间也是不切实际的。然而,贪婪爬山算法足够好,可以解析我们的数据并找到数据集中可能存在的关系。在现实世界中,挖掘路径通常只是理解系统的一个第一步。识别主要组件通常足以用于下一步,我们将在下一节讨论。
结构方程模型
一旦我们有了关于路径哪些部分可能导致感兴趣的结果的想法,我们就可以形成关于这些部分之间逻辑步骤的假设。例如,在我们的课程示例中,我们可能知道大多数学生在Course_1之前选择Course_2,在Course_2之前选择Course_3。这导致了一个假设,即Course_1影响Course_2和Course_3的表现,而Course_2影响Course_3的表现。所有三门课程都被假设会影响许可考试的表现。这给我们提供了图 10.10中显示的假设路径:

图 10.10 – 导致最终许可考试表现的假设路径
图 10.10显示了导致许可考试的事件序列。先前课程的表现会影响未来课程的表现,并最终影响许可步骤。过程中的失败会增加未来失败的可能性,而过程中的成功会增加未来成功的可能性。
现在我们有了假设的路径,我们可以收集来自另一年的学生通过这条路径的数据来测试我们的假设。因为我们正在测试几个关系,我们希望有一个相对较大的样本量。也许每年有 500 名学生参加许可考试。我们可能需要两年关于学生路径到该许可考试的新数据或历史数据,以足够的统计能力来发现存在的效应。
由于随机误差会影响回归模型拟合和统计结果,运行六个逻辑回归模型并不理想;我们可能会在我们的回归模型集中发现假阳性。然而,存在一个方便的框架来模拟多个回归模型对感兴趣因果关系路径的拟合:结构方程模型(SEMs)。SEMs 提供了一个框架,用于在回归框架内拟合因果关系路径数据,包括那些完全测量的变量和潜在变量——这些变量是从测量变量之间的关系中推断出来的,但并未直接在数据中测量。
虽然结构方程模型(SEMs)超出了本书的范围,但存在许多用于拟合模型的框架,其中一些与我们之前在贝叶斯网络模型拟合中看到的相同估计算法和拟合优度统计量被用于拟合 SEMs。与 Python 相比,R 和 Mplus 更常用于拟合 SEMs,但 Python 包含用于拟合 SEMs 的semopy包。请注意,与另外两种软件系统相比,SEMs 的类型有限,并且截至 2023 年,并非所有估计算法或拟合优度统计量都存在于 Python 中。然而,如果您对此感兴趣,我鼓励您探索 SEMs 作为路径挖掘的下一步,如果您想进一步了解路径挖掘领域,本章末尾提供了参考文献。
摘要
在本章中,我们通过社会科学示例介绍了因果路径和条件概率理论,构建了一个基于网络的挖掘工具,称为贝叶斯网络。然后,我们从教育路径模拟数据以在 Python 中实现贝叶斯网络。这些工具为收集更多数据提供了起点,这些数据可以通过称为结构方程模型(SEMs)的一类模型进行分析,以确认从贝叶斯网络构建的假设。在下一章中,我们将从因果路径转向分析分析学的另一个细分领域:计算语言学,我们将研究语言及其在长时间内的关系。
参考文献
Gladwin, T. E., Figner, B., Crone, E. A., & Wiers, R. W. (2011). Addiction, adolescence, and the integration of control and motivation. 《发展认知神经科学》,1(4),364-376。
Heckerman, D. (2008). A tutorial on learning with Bayesian networks. 《贝叶斯网络创新:理论与应用》,33-82。
Hoffman, K. I. (1993). The USMLE, the NBME subject examinations, and assessment of individual academic achievement. 《学术医学》,68(10),740-7。
Hoyle, R. H. (Ed.). (1995). 《结构方程建模:概念、问题和应用》。Sage。
Igolkina, A. A. & Meshcheryakov, G. (2020). semopy: A Python package for structural equation modeling. 《结构方程建模:多学科杂志》,27(6),952-963。
Kaufman, K. A., LaSalle-Ricci, V. H., Glass, C. R., & Arnkoff, D. B. (2007). 《通过法律考试:心理、教育和人口统计学成功预测》。《法律教育杂志》,57,205。
Mak, K. K., Jeong, J., Lee, H. K., & Lee, K. (2018). Mediating effect of internet addiction on the association between resilience and depression among Korean University students: a structural equation modeling approach. 《精神病学调查》,15(10),962。
Meca, A., Sabet, R. F., Farrelly, C. M., Benitez, C. G., Schwartz, S. J., Gonzales-Backen, M., ... & Lizzi, K. M. (2017). Personal and cultural identity development in recently immigrated Hispanic adolescents: Links with psychosocial functioning. 《文化多样性与少数民族心理学》,23(3),348。
Ross, S. M. (2014). 概率模型导论. 学术出版社.
Scutari, M. (2009). 使用 bnlearn R 包学习贝叶斯网络. arXiv 预印本 arXiv:0908.3817.
Turner, M. E., & Stevens, C. D. (1959). 因果路径的回归分析. 生物学统计, 15(2), 236-258.
Violato, C., & Hecker, K. G. (2007). 如何在医学教育研究中使用结构方程模型:简明指南. 医学教学与学习, 19(4), 362-371.
Wise, R. A., & Koob, G. F. (2014). 药物成瘾的发展和维持. 精神药理学, 39(2), 254-262.
Wu, W., Garcia, K., Chandrahas, S., Siddiqui, A., Baronia, R., & Ibrahim, Y. (2021). USMLE step 1 成绩的预测因素. 西南呼吸与重症护理年鉴, 9(39), 63-72.
第十二章:语言家族的映射 – 本体论方法
在本章中,我们将探讨一个被称为语言学的科学领域。语言学是研究语言,包括词汇使用模式、语法演变以及语言的社会结构。我们将探讨本体论,它通过定义的关系将诸如词汇等概念相互关联,并构建语言家族,其中同一家族内的语言在时间和地理上相互关联。
网络科学为我们提供了总结和比较本体论和语言家族的工具,以研究假设的相似性和差异性。我们将在本章末尾量化假设语言家族的差异,尽管该方法可以应用于本体论或任何其他从语言学研究中派生的基于网络的结构的分析。
在本章中,我们将涵盖以下主题:
-
什么是本体论?
-
语言家族
-
语言家族的映射
到本章结束时,您将了解一些在语言学相关分析中使用的基本工具,并能够比较不同的网络,以理解它们之间的关键差异。因为这些工具具有良好的可扩展性,您将能够处理甚至非常大的本体论。
技术要求
您需要 Jupyter Notebook 来运行本章中的实践示例。
本章的代码可在以下链接找到:github.com/PacktPublishing/Modern-Graph-Theory-Algorithms-with-Python
什么是本体论?
在本节中,我们将了解本体论以及它们如何作为网络表示和存储。虽然本章侧重于语言学本体论,但存在许多其他类型的本体论,包括基因本体论,简要回顾以激发本节内容。
本体论简介
如本章引言中所述,本体论是一组通过某种属性相互关联的思想。通常,它们用于组织特定学科内的知识。让我们通过一个例子使其更加具体。由于遗传学中的例子在本体论研究中更为广泛使用,我们将在处理语言学之前,先通过一个生物学例子来建立直觉。
假设我们有五种基因,它们位于一个调节途径中,该途径控制着动物毒液中酶或多肽的产生。通常,环境条件和地理因素在毒液中活性化合物的比例中起着作用,即使在同一物种中也是如此,这是通过调节毒液腺中的基因转录来实现的。在我们开始收集这些基因及其对毒液产生的影响的信息之前,我们仅仅有一组基因,如图图 11.1所示:

图 11.1 – 参与调节动物毒液产生过程的五种基因的集合
为了更好地理解图 11.1中的基因,我们可能需要进行一个环境实验,通过改变条件来开启和关闭基因,并阐明它们之间的相互关系——存在于这个调控途径中的依赖关系。这些相互依赖关系可以通过将每个基因顶点与一条边连接来表示。假设我们进行了几个实验,并发现了以下关系:

图 11.2 – 表示调控毒液生产基因之间关系的本体
图 11.2显示,所有其他四个基因都位于基因 1的下游,这表明这个基因对于动物毒液中的关键化合物的调控至关重要。基因 1的突变可能导致功能丧失(并可能危及动物)。将这个本体作为网络视觉表示,使我们能够轻松地定位我们正在研究的系统中的关键信息。
然而,许多生物的基因调控途径比这个例子要大得多,在实践中难以可视化——尤其是整个基因本体,其中生物的全部基因集合被映射并通过功能途径连接。这意味着我们需要使用网络分析工具来研究提议的基因调控途径之间的差异,或者比较具有相同功能的生物之间的基因调控途径。例如,在我们的毒液例子中,我们可能对绘制一种海蛇的完整基因本体感兴趣,海蛇是眼镜蛇科的一员,并将其完整基因本体与另一种眼镜蛇科物种(如太攀蛇或黑曼巴)进行比较。这些物种可能有超过 12,000 个基因,从而产生一个非常大的本体比较问题。
让我们回到语言学的焦点,看看语言相关的本体是如何构建的,以及如何用来研究方言、皮钦语或社会经济群体之间的语言差异,或者简单地理解一种语言的结构和功能。
考虑英语中的两个单词:go和went。这两个单词都是动词。它们在句子的主语方面具有相同的语义意义。然而,一个表示现在时态,另一个表示过去时态。所有这些信息帮助我们理解这些单词在英语中的功能。我们可以将这些关系映射到每个单词的网络结构中,如图11.3总结:

图 11.3 – 显示单词“go”和“went”语言特性的两个网络
图 11**.3 总结了我们两个单词的语言特性:go 和 went。想象一下为英语中的每一个单词创建这样的网络。我们将拥有非常多的网络,它们将语言特性映射到单词上,这很容易导致重要网络丢失。我们还会使用大量的计算能力来搜索图集合中感兴趣的字词或特性。让我们进一步探讨本体创建。
将信息表示为本体
要创建本体,我们需要定义感兴趣的概念/单词/术语及其可能共享的特性。在我们的图 11.3*示例中,我们有一组具有感兴趣的语言特性的单词。一旦我们定义了这两组(图 11.3中的单词和语言特性),我们就可以在这两组之间创建映射(图 11**.3中显示的线条)。我们的单词示例是一个非常小的示例。很多时候,这些集合可以包括每个集合中成千上万的条目。
为了处理这些更大的信息集以及其中项目之间可能存在的潜在关系,我们需要一种系统的方式来存储这两组信息及其关系。我们还需要很多人来创建这个非常大的本体,最好有一种方式让所有参与创建本体的工作人员共享信息。这正是数据库发挥作用的地方。
本体网络语言(OWL)数据库系统组织知识网络,如图 11**.3*所示。每个单词、术语或概念在数据库中占据一行,该行映射到本体中与该单词/术语/概念匹配的任何感兴趣的特性,从而创建一种数据库的数据库,用于存储单词/术语/概念数据及其与本体中关键特性的关系。从这个数据库中,我们可以搜索信息,可视化感兴趣的关系,并挖掘整个本体以寻找主题。
任何类型的知识都可以在 OWL 数据库中组织。例如,我们可以使用 OWL 数据库来组织关于动物分类学或进化遗传学的知识,以便根据遗传分析结果快速搜索游蛇科物种之间的关系。我们还可以组织医学术语,为医生提供一个易于使用的查找系统,以便他们在遇到超出其专业领域的症状或疾病时,有助于患者的诊断。我们甚至可以组织关于长篇小说中人物关系的知识,为像《战争与和平》这样的书籍提供学习指南。
现在我们已经了解了本体及其存储系统的基本知识,让我们将注意力转回到语言学上,在那里我们可能希望研究语言家族之间的语言演变。
语言家族
语言家族是由具有共同祖先的语言组成的群体,这些语言通常在相关的地理区域内演变。例如,罗曼语族包括在南部欧洲地区从通俗拉丁语(晚期拉丁语)演变而来的语言。尼罗-撒哈拉语族在努比亚王国时期在尼罗河三角洲演变。大约有 150 个语言家族合并成了今天存在的几个主要语言家族,还有几个孤立语言(例如澳大利亚的蒂维语)没有与其他语言的关系。孤立语言没有与其他语言相关的遗传祖先。Campbell 提出了七个主要语言家族(每个大陆一个),尽管其他研究人员将主要语言家族分类到其他语言群体中。
语言漂移和关系
当不同遗传祖先语言的群体在地理上足够孤立,以至于祖先语言可以在地区上演变时,语言家族就出现了。随着语言的演变,词汇可能会变化。发音可能会变化。语法可能会发展。在许多英语皮钦语(包括英语在内的两种或更多语言的混合)中,英语与当地语言混合,创造了一种混合语言,它保留了英语的一些语法和表达方式,同时结合了当地语言。在尼日利亚的英语皮钦语中,英语与当地语言,如伊博语、豪萨语或约鲁巴语混合。例如,“How are you?”变成了“How na?”,而“Please come join me for a meal”变成了“Abeg come chop food”。
随着时间的推移,皮钦语可以演变到成为完全独立的语言(英语的一个分支,就像中古英语从古英语演变一样,其他语言影响了古英语)或者仍然保持为母语言的皮钦语(在这种情况下是英语)。当语言演变时,它成为母语言的子分支。在英语的情况下,它在商业和学校系统中的广泛使用表明,许多子语言将在未来一段时间内发展成为具有独特词汇和语法的独立语言。鉴于尼日利亚的皮钦语及其广泛的使用,尼日利亚英语子语言可能是下一个世纪或更长时间内最有可能发展的子语言。
一些驱动因素倾向于促进语言向儿童语言或皮钦语(pidgin)的演变。不同国家或地区之间的贸易,这些地区在语言上不重叠,需要沟通手段。皮钦语通常在市场等地方发展,那里许多讲不同语言的人必须相互沟通以买卖商品。在交易过程中可能会反复使用一些常见的词汇和短语(例如货币价值或数量)。为了方便两种不同语言之间的理解,可能会省略一些棘手的语法或冠词。
帝国扩张是语言演化的另一个驱动力。罗马帝国将拉丁语传播到欧洲的大部分地区,几个世纪以来影响了语言,尤其是那些靠近罗马的语言。西班牙和葡萄牙是两个有趣的案例,罗马对拉丁语的影响和摩尔人对阿拉伯语的影响都影响了当地方言。随着时间的推移,随着罗马帝国权力的衰落和其他语言和文化影响将使用拉丁语进行商业、学校和宗教活动的地区分开,罗曼语族,包括西班牙语和葡萄牙语,从拉丁语中演变出来。事实上,罗马帝国对这些语言的发展影响如此直接,以至于术语罗曼语族指的是罗马帝国!
今天存在的多数英语皮钦语的存在归因于英国殖民主义,正如大不列颠、美国和澳大利亚等地英语的不同方言一样。根据英语作为商业通用语的时间长短,我们可能在未来的几个世纪中看到许多从英语演变而来的儿童语言。
系统发育树可以用来通过展示亲缘和子代关系,在视觉上总结思想、语言或物种随时间演化的关系。这使得研究演化结构变得更容易,因为视觉提供了关于假定的演化路径和易于分析的信息和潜在统计差异的网络结构。一般本体结构没有层次结构,网络的一部分在意识形态上依赖于网络的前一部分。让我们通过尼罗-撒哈拉语言的假定的演化路径来看看这一点。
尼罗-撒哈拉语系
尼罗-撒哈拉语系包括南苏丹、埃塞俄比亚、苏丹、肯尼亚、坦桑尼亚、乌干达、乍得、布基纳法索、喀麦隆、马里、刚果民主共和国、贝宁、阿尔及利亚、尼日利亚、尼日尔、埃及和利比亚等地区使用的语言。此外,在几个其他国家也存在一些小的语言社区。这个语系中的一些常见语言包括马萨伊语、松加语、丁卡语、鲁奥语和卡努里语。大约有 7000 万人使用尼罗-撒哈拉语系的语言,某些地区和方言的使用者数量正在增加。
尼罗-撒哈拉语言的语言学研究至少可以追溯到 19 世纪,过去十年中许多论文都讨论了语言漂移以及母语与其子语的关系。在本节中,我们将检查一些提出的历史层级,然后在下一节中用 Python 代码分析这些层级之间的相似性和差异性。如果你对论文本身感兴趣,可以查阅章节末尾的参考文献,特别是 Dimmendaal 的论文,该论文总结了关于尼罗-撒哈拉语族中母语与子语关系的最近辩论。
Greenberg 在 1963 年提出了以下层次结构,对几个语言家族分支进行了分类。图 11.4 展示了这个层次结构,包括从更大的尼罗-撒哈拉语族的一个子分支中延伸出来的子分支:

图 11.4 – Greenberg 的尼罗-撒哈拉语族语言分类
图 11.4 展示了尼罗-撒哈拉语族语言家族中的一些子分类。这些子分类继续细分到个别语言,总计大约有 130 种语言在这个地区被使用,这些语言起源于尼罗河支流交汇的近邻地区,那里曾经是努比亚。
自 1963 年以来,许多论文进一步细分了这些子类,并添加了额外的子类,最终形成了我们将在本节讨论的 Dimmendaal 论文,偶尔会创造出非常复杂和深层的网络结构。语法、词汇、音韵(在这种情况下,辅音的发音)和术语通常决定了线条的绘制位置,但语言往往是流动的,可能会在一定程度上重叠,使得分类系统难以辨别。让我们转向尼罗-撒哈拉语族语言研究中较为近期的作品。
Dimmendaal 的最新工作提出了尼罗-撒哈拉语族子族的新层次结构,总结在 图 11.5 中:

图 11.5 – Dimmendaal 的尼罗-撒哈拉语族子族层次结构
注意
在 图 11.5 中,Dimmendaal 的分类首先按地区划分语言,然后按方言或地区划分。注意,一些语言子族似乎是一起出现的(例如 Fur 和 Kunama),而没有中间家族的存在。这比 图 11.4 中的 Greenberg 分类结构要复杂。
随着语言家族层次结构随着语言研究的系统化而演变,重要的是要注意出现的差异及其潜在原因。这为进一步的语言学研究提供了线索,并可能有助于未来语言家族层次结构的发展。
现在我们对尼罗-撒哈拉语族及其层次结构有了一些了解,让我们看看网络科学如何帮助我们理解可能重要的结构差异。
注意
我们的例子在规模上非常有限,这使得可视化结果以及为什么我们的分析可能会显示出差异变得容易。使用完整的 OWL 数据库或完整的语言层次结构会创建出更加细致和庞大的网络来研究。然而,无论网络大小或复杂度如何,进行此类研究的工具都是相同的。因此,我们即将开始的分析可以应用于更加复杂的语言数据结构,在这些结构中,仅仅可视化由不同研究小组或不同语言家族层次结构创建的 OWL 数据库之间的差异可能并不可行。
语言家族的映射
让我们回到我们两个尼罗-撒哈拉语族树的例子。为了检查结构上的差异,我们首先需要在 NetworkX 中创建这些树。对于 Dimmendaal 的家族树,我们将稍微打破树结构以显示一些子语族之间存在的相互关系。让我们通过使用 脚本 11.1 创建和绘制 Greenberg 树开始:
#load needed packages
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
#create the Greenberg Nilo-Saharan language family network
G = nx.Graph()
G.add_nodes_from([1, 11])
G.add_edges_from([(1,2),(1,3),(1,4),(1,5),(1,6),(1,7),(7,8),
(7,9),(7,10),(7,11)])
#plot the Greenberg Nilo-Saharan language family network
import matplotlib.pyplot as plt
G.nodes[1]['subfamily'] = 'Nilo_Saharan'
G.nodes[2]['subfamily'] = 'Koman'
G.nodes[3]['subfamily'] = 'Saharan'
G.nodes[4]['subfamily'] = 'Songhay'
G.nodes[5]['subfamily'] = 'Fur'
G.nodes[6]['subfamily'] = 'Maban'
G.nodes[7]['subfamily'] = 'Chari_Nile'
G.nodes[8]['subfamily'] = 'Central_Sudanic'
G.nodes[9]['subfamily'] = 'Kunama'
G.nodes[10]['subfamily'] = 'Berta'
G.nodes[11]['subfamily'] = 'Eastern_Sudanic'
labels = nx.get_node_attributes(G, 'subfamily')
nx.draw(G, labels=labels, font_weight='bold')
这个脚本生成了与 图 11.4 类似的表现。图 11.6 显示了 Greenberg 尼罗-撒哈拉语亚语族树的 NetworkX 图:

图 11.6 – Greenberg 的尼罗-撒哈拉语语族树图
现在我们可以看到 Greenberg 的尼罗-撒哈拉语亚语族树及其各个分支,让我们通过添加到 脚本 11.1 来创建和绘制 Dimmendaal 的尼罗-撒哈拉语亚语族树及其各个分支:
#create the Dimmendaal Nilo-Saharan language family network
G2 = nx.Graph()
G2.add_nodes_from([1, 9])
G2.add_edges_from([(1,2),(1,3),(2,4),(2,5),(2,6),(5,6),(2,7),
(2,8),(7,8),(2,9)])
#plot the Dimmendaal Nilo-Saharan language family network
G2.nodes[1]['subfamily'] = 'Nilo_Saharan'
G2.nodes[2]['subfamily'] = 'Northeastern'
G2.nodes[3]['subfamily'] = 'Central_Sudanic'
G2.nodes[4]['subfamily'] = 'Maban'
G2.nodes[5]['subfamily'] = 'Kunama'
G2.nodes[6]['subfamily'] = 'Fur'
G2.nodes[7]['subfamily'] = 'Saharan'
G2.nodes[8]['subfamily'] = 'Eastern_Sudanic'
G2.nodes[9]['subfamily'] = 'Kuliak'
labels2 = nx.get_node_attributes(G2, 'subfamily')
nx.draw(G2, labels=labels2, font_weight='bold')
这段脚本生成了 Dimmendaal 的尼罗-撒哈拉语亚语族树的图,如图 图 11.7 所示:

图 11.7 – Dimmendaal 的尼罗-撒哈拉语语族树图
注意 Dimmendaal 的尼罗-撒哈拉语亚语族树中 Kunama 和 Fur 以及撒哈拉和东苏丹之间的连接。这些代表了尼罗-撒哈拉语东北支中的相关子语族。从 图 11.6 和 11.7 中,我们可以看到类似的总体结构,其中存在许多浅层、未连接的分支。然而,Dimmendaal 的尼罗-撒哈拉语亚语族树在树中添加了一个额外的层次,并包括了没有共同祖先直接产生它们的子语族。
由于这些差异,我们预计两个语言亚语族树之间的某些中心性度量会有所变化。我们将从之前章节中定义的一些熟悉度量开始。脚本 11.2 分析了我们两个语言亚语族树之间平均介数中心性的差异:
#compare betweenness centrality of language families
gb=nx.betweenness_centrality(G)
print(np.mean(np.array(list(gb.values()))))
gb2=nx.betweenness_centrality(G2)
print(np.mean(np.array(list(gb2.values()))))
我们得到了平均介数中心性为 0.131(Greenberg 的)和 0.127(Dimmendaal 的),这表明在这些亚语族树之间桥接属性相似。让我们通过添加到 脚本 11.2 来计算平均度中心性以评估中心性属性:
#compare degree centrality of language families
gd=nx.degree_centrality(G)
print(np.mean(np.array(list(gd.values()))))
gd2=nx.degree_centrality(G2)
print(np.mean(np.array(list(gd2.values()))))
我们得到了平均度中心性为 0.182(Greenberg 的)和 0.278(Dimmendaal 的),这表明中心性属性在这些亚语族树之间有所变化。鉴于 Dimmendaal 的亚语族树结构中连接其他树层的额外深度层,我们预计会看到这种差异。
让我们把注意力转向一个特别适合现实世界语言数据(以及其他本体或系统发育网络数据集)的中心性度量。
子图中心性衡量每个顶点在网络中的子图中的参与程度,通过在网络的邻接矩阵的频谱中给予小子网络更高的权重,而给予大子网络较低的权重,并通过网络上的随机游走来估计子网络。这结合了频谱聚类(在第五章中看到)和度中心性的特性,以创建一个混合中心性度量。
我们可以通过向 Script 11.2 中添加内容来在我们的两个亚家族树上看到这一点:
#compare subgraph centrality of language families
gs=nx.subgraph_centrality(G)
print(np.mean(np.array(list(gs.values()))))
gs2=nx.subgraph_centrality(G2)
print(np.mean(np.array(list(gs2.values()))))
此脚本表明,平均子图中心性在这两个亚家族树之间有所不同,Greenberg 的平均子图中心性为 2.478,Dimmendaal 的平均子图中心性为 3.276。这表明在这些假设的亚家族树之间,频谱和度分布是不同的。
虽然这个例子只涉及两个小的本体结构,但当与许多本体一起工作或比较非常大的本体(在这种情况下不建议进行可视化)时,这些类型的分析可能是有帮助的。例如,我们可能希望比较许多不同论文中假设的完整的尼罗-撒哈拉语言树。这些树将包括数百个顶点,可能还有数十棵树。通过视觉跟踪这些差异将是一项相当大的挑战!
当我们考虑语言 OWL 数据库时,我们的分析规模进一步扩大,达到数十万个顶点,以便在 OWL 数据库之间进行比较。在这个规模下,无法通过视觉方式挖掘比较中的数据。网络科学提供了一种比较所提出的 OWL 数据库结构并聚焦于这些数据库之间存在的差异的方法,以找到这些结构之间的关键差异。此外,我们概述的许多工具都能很好地扩展到这种规模的数据分析,提供了一种高效的方法来找到这些关键差异。然而,理解词源理论中存在的差异超出了本书的范围,并且许多 OWL 数据库包含在专有系统中存储或本身就是专有的。
本章重点介绍了语言学领域。然而,其他学科中存在许多类型的本体和系统发育树。动物学和人类基因组学经常使用本体来研究基因、环境和基因表达之间的关系。这些本体往往很大,创建这些本体所需的知识整理可能导致不同本体在尝试捕捉相同知识时出现显著差异或知识空白。可扩展的中心性度量,如我们在简单可视化示例中概述的,可以确定这些复杂本体中的总体和个体分支差异,以确定感兴趣的区域和使用一个开源本体与另一个本体相比的潜在注意事项。
随着不同领域知识的增长,比较本体的方法论将进一步发展,网络科学将在不同学科中本体的管理、理解和应用中发挥重要作用。
摘要
在本章中,我们学习了如何在数据库和网络中表示语言数据。我们比较了两种尼罗-撒哈拉语言亚族网络,使用中心性指标,并引入子图中心性作为特别适合分析本体和系统发育树的中心性指标。最后,我们将本体的处理扩展到语言学领域之外,并讨论了如何使用本章中的工具将这些分析扩展到非常大的本体组,以比较其在实际应用中的适用性。
在下一章中,我们将学习关于图数据库的知识,它可以用来存储本章讨论的本体数据。
参考文献
Campbell, L. R. (2018). 世界上有多少个语系?
Dimmendaal, G. J. (2019). 尼罗-撒哈拉语言形态学的类型学视角。载于 牛津语言学研究百科全书。
Dimmendaal, G. J., Ahland, C., Jakobi, A., and Lojenga, C. K. (2019). 常被称为“尼罗-撒哈拉”语言的语文学特征和类型学。非洲语言手册,326-381。
Done, B., Khatri, P., Done, A., and Draghici, S. (2008). 预测新型人类基因本体注释的语义分析方法。IEEE/ACM 计算生物学与生物信息学杂志,7(1),91-99。
Ehret, C. (2006). 尼罗-撒哈拉背景下的乍得语。非洲语言学研究,35,56-66。
Estrada, E., and Rodriguez-Velazquez, J. A. (2005). 复杂网络中的子图中心性。物理评论 E,71(5),056103。
基因本体联合体。 (2008). 2008 年基因本体项目。核酸研究,36(增刊 1),D440-D444。
Greenberg, J. H. (1957). 语言学论文集。
Greenberg, Joseph H. 1963. 非洲的语言。印第安纳大学,印第安纳州,布卢明顿。
Jakobi, A., and Dimmendaal, G. J. (2022). Karko 和尼罗-撒哈拉中的数字标记。世界语言中的数字:比较手册,63-106。
McGuinness, D. L., and Van Harmelen, F. (2004). OWL 网络本体语言概述。W3C 建议书,10(10),2004。
Oladnabi, M., Omidi, S., Mehrpouya, M., Azadmehr, A., Kazemi-Lomedasht, F., and Yardehnavi, N. (2021). 毒理学和抗毒理学数据:当前和未来展望。生物技术与生物医学档案,5(1),026-031。
Souag, L. (2022). 西非语言如何变成北非语言,反之亦然。语言学类型学,26(2),283-312。
Subich, V. G. (2020). 非洲语言谱系的结构和类型学分析。欧亚大陆阿拉伯语研究,(12),103-117。
Suryamohan, K., Krishnankutty, S. P., Guillory, J., Jevit, M., Schröder, M. S., Wu, M., ... and Seshagiri, S. (2020). 印度眼镜蛇参考基因组与转录组使全面识别毒液毒素成为可能. 自然遗传学, 52(1), 106-117.
Urban, M. (2021). 语言孤立体的地理和开发. 皇家学会开放科学, 8(4), 202232.
Wardhaugh, R. (1972). 语言学导论.
尼日利亚皮钦语 - 20 个有用词汇和短语 (n.d.): www.britishcouncil.org/voices-magazine/nigerian-pidgin-words-phrases
第十三章:图数据库
在前几章中,我们将网络视为可以分析以从数据科学问题中提取见解的数据结构。在本章中,我们将考虑网络作为数据存储选项,以多关系方式链接许多信息。存在许多存储选项,但我们将关注一个与 Python 集成良好的开源选项——Neo4j。
我们在本章中将涵盖以下主题:
-
图数据库简介
-
在 Neo4j 中查询和修改数据
到本章结束时,你将了解图数据库在存储网络科学数据集方面的优势,能够可视化图数据库,并知道如何查询它们以快速检索相关信息。你将能够通过插入和删除来轻松修改表格。你将了解我们前几章中的工具如何帮助你高效查询以找到相关数据。让我们通过探索图数据库背后的原理开始吧。
图数据库简介
图数据库(以网络形式存储数据的数据库)相对于传统的关系型数据库具有许多优势。首先,图数据库可以捕获和遍历层次关系。虽然关系型数据库可以捕获分类法,但它们是在不同的列中捕获的,这些列并没有明确地链接。
此外,图数据库通过连接它们来明确捕获项目或项目组之间的复杂关系。这允许数据库内存在多向关系;例如,当邻居通过边连接时,查询最近邻要容易得多,并且不需要估计步骤来找到数据库中所有项目之间的欧几里得或曼哈顿距离。
此外,图数据库可以非常容易地捕获数据库中项目之间关系的方向性。在关系型数据库中,一个单一关系的方向性可能需要几个列的信息来捕获该关系。因此,对于可能具有单向关系的项目,图数据库提供了数据结构的紧凑表示。
最后,在图数据库中,可以使用网络算法来挖掘数据集,以发现数据库中未编程的隐含关系。这些算法可以通过在网络的不同部分寻找相似模式来探测相似关系,或者根据三角闭包推断不存在的关系。对于许多数据集——例如持续增长的组学数据集、演化的本体或知识不完整的其他非静态数据集——挖掘数据提供了新的研究途径。
现在我们已经了解了一些关于图数据库的优势,让我们深入了解图数据库和关系型数据库之间的具体差异。
什么是图数据库?
图数据库是基于网络科学的数据库。与关系型数据库中按列存储数据不同(如下一个图所示),图数据库将数据存储为 网络,其中原本占据一行的项目被表示为顶点,并通过存在的关系连接到其他顶点。列数据用于向顶点添加元数据或将它连接到其他顶点。图数据库查询依赖于网络科学算法来遍历图,模式发现算法,以及这两种方法的组合。因此,图数据库的查询可以变得相当复杂,而不会像 SQL 中的子查询那样导致长时间运行。效率是图数据库的一个重大优势。让我们看看与超市客户服务或产品相关的客户反馈示例,如图 图 12.1 所示:

图 12.1 – 关系型数据库设计的示例,其中行包含按列组织的信息项(经微软 Excel 授权使用)
图 12.1 展示了一个关系型数据库,其中包含许多作为列存在的数据行。然而,这些数据可能更好地用图数据库来表示,在图数据库中,项目通过列相关联,或者以可查询的方式将列用作元数据。或许,评论中附有日期,可以按时间将项目链接起来,并使用与投诉相关的部门作为元数据。
虽然可视化关系型数据库比较困难,但可视化图数据库则要直接得多。一些图数据库自带内置的可视化工具,可以放大感兴趣的区域或查询结果。一些允许开发者基于现有的可视化构建,以满足他们的需求。当鼠标悬停在边和顶点上时,大多数图数据库可视化工具将显示与顶点或边关联的元数据,为查询中提取的感兴趣关系提供上下文。Cytoscape 是最常用的网络可视化程序之一;最初,它是为了可视化蛋白质组数据集而构建的,其中蛋白质相互作用在生物体之间被记录。以下是 Cytoscape 与示例图的演示图像:js.cytoscape.org/.
Cytoscape 的一个优点是它能够处理保存的 igraph 网络,这样就可以在 Python 中分析非常大的网络,然后用 Cytoscape 进行可视化,其中网络大小不会像使用 igraph 绘图函数那样复杂化可视化。此外,Cytoscape 还提供了一个桌面版本,应该适用于基于 Java 的设备,以及一个网络界面版本,供那些无法访问桌面版本的人使用。如果你感兴趣,我们鼓励你下载 Cytoscape 并使用我们在这本书中使用的数据集或你感兴趣的数据集来测试其可视化功能。
现在我们已经了解了图数据库的结构和优势,让我们深入研究一些数据集,在这些数据集中,图数据库在组织信息和检索感兴趣的信息方面可能比关系数据库表现得更好。
你可以在图数据库中表示什么?
许多数据科学领域都可以从图数据库中受益。在我们深入一个开源图数据库的编码之前,我们将深入探讨这些用例中的几个。让我们从一个流行病学例子开始。
接触者追踪
当一个新疫情在一个地区开始时,流行病学家通常会使用一种称为接触者追踪的工具,收集每个病例的数据,以便将病例相互联系起来,希望找到疫情源头或零号病人。零号病人通常能提供关于疫情来源的线索——是动物宿主、实验室泄露还是环境灾难。然后,流行病学家可以确定有效的遏制政策,并监控潜在的源头,以防止未来的疫情爆发。
在持续时间较长的疫情中,病毒有足够的时间发生变异,接触者追踪使流行病学家能够研究疫情的病毒进化。在 COVID-19 大流行期间,我们看到了许多 COVID-19 的变异,这些变异有不同的死亡率率和不同的症状,其中一些对当前疫苗或先前菌株已响应的治疗方法反应不佳。早期识别新的变异及其地理来源为各国和大陆的快速响应提供了关键信息。
让我们考虑一个新出现的 HIV 疫情中的接触者追踪的例子。假设我们身处一个中等规模的城市,这里有许多社区和次级人口群体。在过去两个月里,几个检测中心和医院出现了病例,流行病学家担心该地区的优势菌株已经变异成了一种更致命的 HIV 菌株,威胁着整个城市。HIV 在人群中传播的两种主要方式是性接触和静脉注射毒品时共用针头;这个假设的疫情似乎主要局限于药物使用率高和有高风险性行为的年轻人群中。
当发现病例时,医疗保健提供者收集有关通过性接触或针头共享可能暴露于 HIV 的其他人的信息,以便个人或提供者可以告知那些暴露者他们面临 HIV 的风险。通过识别和追踪阳性病例,可以建立一个暴露网络。通常,收集并附加到这个网络上的元数据包括菌株基因组学、人口统计学因素、地理历史和暴露途径,以便快速识别传播的主要来源和根据已识别的病例特征最易受伤害的人群。
确定因果关系并不总是直接的。很多时候,当个人没有出现疾病症状或没有定期接受检测时,就会错过病例。这意味着在流行病后期发现的病例可能是感染源。图 12.2显示了接触追踪网络的一小部分,其中通过接触追踪在流行病后期发现的病例比出现症状的个人(病例#161)感染时间更早:

图 12.2 – 接触追踪网络的一个小部分
在图 12.2中,我们看到病例#161被识别(可能是通过检测中心或寻求医疗护理)。这个人的接触者揭示了从病例#165(由病例#173感染)那里感染的情况。接触追踪还揭示了另一个从病例#165(病例#169)感染的个人。如果没有接触追踪,至少会错过另外三个病例,导致治疗延误,并可能导致更多的暴露和病例。通常,通过菌株分析和关于通过性伴侣或针头共享的暴露时间的信息来确定因果关系。这些因素包含在病例元数据中。
在关系数据库中存储病例元数据和因果关系信息将非常困难,因为感染的方向性对于研究人群中的流行病演变以及联系尚未检测的潜在暴露者(因为病例接触可能重叠,在这种类型的流行病中通常如此)至关重要。图数据库允许高效地存储和检索这些信息,以实现接触追踪和制定保护该人群中 HIV 暴露风险者的公共卫生政策的最大效率。早期识别可以拯救人们免受痛苦,甚至可能避免死亡。
岛屿生态学研究
既然我们知道了图数据库如何提高社会科学数据的分析和结果,让我们考虑图数据库如何改善保护学研究。假设科学家在远离大陆人群的偏远地区发现了一个新岛屿。图 12.3显示了这个假设的岛屿:

图 12.3 – 一个长期与大陆隔离的岛屿的插图
在图 12**.3所示的岛屿上,我们希望记录该岛屿上生活的动植物,以及岛屿的食物链。我们将收集有关种群大小、捕食者-猎物关系以及这些种群和关系的潜在威胁(如气候变化)的信息。我们可能希望将物种链接到食物网中,以探索岛屿上温度、天气和海平面变化对食物来源的可持续性影响。我们可能还希望将岛屿划分为不同的生态系统,这些生态系统可能被高悬崖的峡谷所隔离,或者通过迁徙模式或栖息地重叠与岛屿上的其他生态系统相连。食物网和重叠的栖息地/迁徙模式在我们的数据集中创建了种群数据之间的关系,这些数据自然以网络形式存在。我们可以在网络中的顶点(物种或栖息地)或连接它们的边(例如关于迁徙模式的季节性信息,这些信息可能定期连接来自两个不同栖息地的物种)上添加元数据。
在这个保护示例中,我们可能会收集多个数据集。我们可能有来自不同地理区域的几个不同的食物网。我们还可能有关于栖息地重叠的数据集,这些数据集连接岛屿上的地理区域,这些区域与我们的食物网相连,例如关于种群大小估计、生态系统健康指标和季节性模式的元数据。
在关系型数据库中连接许多数据集,其中一些包含层次关系,相当棘手;然而,在使用图数据库时则非常简单。不同类型的边可以连接收集到的网络中的不同顶点,以连接每个网络以及每个网络中包含的元数据。这使得查询和探索那些未明确定义的潜在关系(可能由于时间限制或地形导航的难度而没有收集)对保护主义者来说更容易。
从这些数据和对其图数据库的探索中,我们可以推断并定义岛屿上的保护区,其中许多食物网相连或是有大量生物多样性的孤立区域。这保护了物种免受人类活动或气候变化威胁,并允许研究人员将有限的资金集中在对整体生态系统至关重要的监测区域上。此外,随着进一步的探险和保护工作收集新的数据,图数据库的设置允许研究人员测试在第一次探险中未直接观察到的生态系统或食物网之间的假设性联系。
现在我们对将受益于图数据库存储解决方案的数据集有了一定的了解,让我们将注意力转向 Neo4j,这是一个开源的图数据库选项。
在 Neo4j 中查询和修改数据
在我们开始使用 Neo4j 之前,我们需要在我们的机器上下载并安装软件。您可以点击此链接访问 Neo4j 桌面版下载页面:neo4j.com/download/.
你应该看到一个页面,其中你可以通过点击下载按钮来下载 Neo4j:

图 12.4 – Neo4j 下载网站
在点击图 12.4中的下载按钮后,你将提示遵循安装程序说明完成安装。安装程序完成后,你将看到一个图标,或者将从安装过程中直接在你的机器上启动 Neo4j。这应该会带你到一个看起来像这样的页面:

图 12.5 – Neo4j 的起始页面
图 12.5显示了 Windows 机器上的 Neo4j 免费桌面版本。
注意
已经有一个示例项目可供探索或查询。
我们将使用这些数据执行一些基本查询,但如果你希望在查询之前探索这个数据库,请点击Movie DBMS并点击启动按钮以在您的机器上运行数据库;探索完成后,请确保点击停止按钮再次缓存数据库。
Neo4j 使用的查询语言称为Match命令,其功能类似于 SQL 的SELECT命令,limit和as等操作也存在于 Cypher 中。然而,用于检索数据库中对象(顶点)之间方向关系(边)的操作也存在,以便查询可能存在的特定类型的关系。随着我们在 Neo4j 桌面应用程序上探索 Movie DBMS(数据库管理系统)数据库,我们将看到更多这方面的实际应用。
现在,让我们探索 Neo4j。
基本查询示例
当你打开你的 Neo4j 桌面应用程序时,你会看到一个Example Project文件夹。当你将鼠标悬停在屏幕右侧的Movie DBMS标签上时,你会看到一个启动按钮,该按钮启动与此数据库的连接(如图 12.6所示)。点击启动:

图 12.6 – 启动 Movie DBMS 数据库的启动按钮
如图 12.6所示,一旦通过点击about-movies.neo4j-browser-guide文件选项启动了 Movie DBMS 数据库,并运行了一些查询示例以熟悉 Cypher 的语法和结果。
当你点击about-movies.neo4j-browser-guide文件选项时,你会看到一个像图 12.7一样的页面。第一个页面显示了一个基本的查询,用于检索演员的数据。在这里,我们将演员更改为Brad Pitt并查询图中Brad Pitt的实例。当你将代码更改为图 12.7中所示的内容时,点击箭头以运行代码。请注意,你将在你编写的代码下方看到默认教程。我们不会在我们的 Neo4j 查询图像中显示此内容,但它将出现在你的屏幕上:

图 12.7 – 一个基本的 Cypher 查询,用于搜索布拉德·皮特
这个数据库不包含关于布拉德·皮特的任何信息。在Tom Hanks上运行建议的查询会产生以 JSON 形式的信息,因为此数据不包含图元素。当你查询数据库中的Tom Hanks时,你应该看到类似图 12.8的内容:

图 12.8 – 在电影数据库管理系统中查询 Tom Hanks 的结果
让我们翻到指南的下一页,向数据库中添加一个演员。我们将添加布拉德·皮特,因为我们的查询最初返回了空结果。图 12.9显示了如何将演员及其出生年份添加到数据库中。

图 12.9 – 创建布拉德·皮特条目的说明
当我们运行图 12.9中的代码时,Neo4j 显示给我们一个包含布拉德·皮特信息的顶点,如图图 12.10所示:

图 12.10 – 创建布拉德·皮特条目的结果
我们可以添加与Brad Pitt相关的电影,例如,`七年内》,如图 12.11*中的代码所示:

图 12.11 – 添加与布拉德·皮特相关的电影的 Cypher 代码
当我们运行这个 Cypher 代码时,我们会看到另一个图数据库顶点出现,如图图 12.12所示:

图 12.12 – 运行图 12.11 中的 Cypher 查询的结果
正如我们可以向我们的图数据库添加内容一样,我们也可以从数据库中删除单个记录。让我们删除我们刚刚为Brad Pitt创建的记录。图 12.13显示了删除Brad Pitt记录的过程。我敦促你在继续下一章的任务之前尝试删除`七年内》:

图 12.13 – 删除我们为布拉德·皮特创建的记录的 Cypher 代码
我们还可以使用带有CREATE和MATCH语句的MERGE语句在数据库中创建或更新记录,以创建新记录或更新现有记录(取决于数据库中存在的内容)。我们将使用图 12.14中显示的代码将布拉德·皮特的信息重新添加到数据库中:

图 12.14 – Cypher 代码的更新示例
当我们运行图 12.14中的代码时,我们会再次看到图 12.9,其中布拉德·皮特的信息已经添加到数据库中。现在我们了解了一些基本的 Cypher 命令,我们可以继续到下一节,学习更复杂的图数据库操作。
更复杂的查询示例
现在我们知道了如何执行基本查询,我们可以继续学习 Neo4j 中更复杂的操作,例如在项目之间添加关系。让我们通过 Cypher 查询将布拉德·皮特与 《七年的西藏》 通过他的角色海因里希·哈勒连接起来。
注意
在运行此查询之前,您需要使用 基本查询示例 部分的代码将电影和演员都添加到我们的数据库中。此查询如图 12.15 所示。

图 12.15 – 将布拉德·皮特与《七年的西藏》中的角色海因里希·哈勒连接起来的 Cypher 查询
运行此查询返回关于演员、电影以及我们刚刚在这两个数据集之间创建的关系的信息,如图 12.16 所示:

图 12.16 – 图 12.15 的 Cypher 查询结果,将布拉德·皮特与《七年的西藏》连接起来
Neo4j Cypher 指南的下一页展示了创建此关系的另一种方法。鼓励您修改该代码以添加另一个演员和电影作为练习。让我们将注意力转向 Cypher 的 WHERE 子句,它们在 SQL 中的功能非常相似。
我们将搜索以名字 Brad 开头的人名,这将检索布拉德·皮特的条目,以及任何其他名字也是 Brad 的演员。图 12.17 展示了此查询:

图 12.17 – Cypher 中 WHERE 查询的示例
当我们在 图 12.17 中运行 Cypher 代码时,我们应该在我们的数据库中看到两个 Brad Pitt 的实例,如图 12.18 所示:

图 12.18 – 图 12.17 的 WHERE Cypher 查询结果
我们还可以根据关系进行匹配,例如找到与演员相关的电影。让我们尝试一个 Cypher 查询来找到与布拉德·皮特相关的所有电影(在这里,只是 Seven Years in Tibet,因为我们添加了此关系)。图 12.19 展示了我们将使用的查询:

图 12.19 – 人与电影之间图关系的 Cypher 查询
当我们运行 图 12.19 中所示的 Cypher 查询时,我们看到 Brad Pitt 的实例与《七年的西藏》之间的连接以图形形式显示 (图 12.20):

图 12.20 – 图 12.19 的图关系查询结果
图 12**.20 展示了图数据库的基本优势。我们可以看到连接不同表(在此处,Person 表和 Movie 表)中不同项的关系,以及这种关系的性质。很容易看到与电影相连的演员,如果有更多电影存在,我们就可以轻松地通过基于图查询的查询结果来可视化我们的查询结果。
虽然这个电影数据库包含基本的表和关系,但我们可以想象在 图数据库中可以表示什么? 这一部分的例子中包含了许多更多表之间更加复杂的关系。在表和表中的项目上以图形形式可视化查询结果,提供了对查询中感兴趣的数据和关系的易于理解的摘要。这正是图数据库的力量所在。查询通常很快,即使是对于包含许多子查询的查询或在大表及其关系中进行搜索时也是如此,结果的可视化使用户能够深入探索表之间的关系(或为报告提供简洁的视觉表示)。
如果您想进一步探索 Neo4j,Neo4j 的 AuraDB 允许用户通过建立账户并使用 Python 中的 neo4j 包和 GraphDatabase.driver() 函数通过 API 连接到 Neo4j 来连接到数据库。
注意
对于任何大型数据库或您希望永久保存的数据库,您需要一个付费账户。
数据库创建完成后,您可以通过 Python 的 neo4j driver.execute_query() 语句查询 Neo4j 数据库,并将数据作为网络导入 igraph 以分析结果。这为您的分析项目提供了强大的图存储和图分析组合。如果您感兴趣,我们鼓励您进一步探索 Neo4j 并创建您自己的 igraph 和 Neo4j 的 AuraDB 账户之间的连接项目。
摘要
在本章中,我们探讨了图数据库的优势,熟悉了名为 Neo4j 的开源图数据库,并简要了解了 Neo4j 的查询语言,称为 Cypher。我们在 Neo4j 电影数据库中创建了、删除了和修改了记录。我们探讨了查询图数据库的优势以及图数据库中可能的独特查询结果可视化。如果您感兴趣,我鼓励您查阅 Cypher 和 Neo4j 资源,以深入了解图数据库的潜力。
在下一章中,我们将把本书中迄今为止学到的所有技能结合起来,解决一个现实世界问题,即预测刚果民主共和国各地区随时间和地理变化的埃博拉疫情严重程度。
参考文献
Adler, M. W. 和 Johnson, A. M. (1988). HIV 感染的接触追踪. 英国医学杂志(临床研究版),296(6634),1420。
Angles, R., Arenas, M., Barceló, P., Hogan, A., Reutter, J., and Vrgoč, D. (2017). 图数据库现代查询语言的基础. ACM 计算机调查 (CSUR), 50(5), 1–40.
Beas-Luna, R., Novak, M., Carr, M. H., Tinker, M. T., Black, A., Caselle, J. E., ... and Iles, A. (2014). 一个在线数据库,用于指导生态网络模型:kelpforest. ucsc. edu. PloS one, 9(10), e109356.
Hyman, J. M., Li, J., and Stanley, E. A. (2003). 建模随机筛查和接触追踪在减少 HIV 传播中的影响. 数学生物科学, 181(1), 17–54.
Mueller, W., Rudowicz-Nawrocka, J., Otrzasek, J., Idziaszek, P., and Weres, J. (2016). 空间数据和图数据库在识别牛群成员关系中的应用. 国际多学科科学地理会议:SGEM, 1, 835–841.
Pasquale, D. K., Doherty, I. A., Leone, P. A., Dennis, A. M., Samoff, E., Jones, C. S., ... and Miller, W. C. (2021). 失而复得:将网络分析应用于 HIV 公共卫生接触追踪. 应用网络科学, 6, 1–16.
Pokorný, J. (2015). 图数据库:其力量与局限性. 在 计算机信息系统与工业管理:第 14 届 IFIP TC 8 国际会议,CISIM 2015,波兰华沙,2015 年 9 月 24-26 日,论文集 14 (pp. 58-69). Springer 国际出版社.
Robinson, I., Webber, J., and Eifrem, E. (2015). 图数据库:连接数据的全新机遇. O’Reilly Media, Inc..
Shannon, P., Markiel, A., Ozier, O., Baliga, N. S., Wang, J. T., Ramage, D., ... and Ideker, T. (2003). Cytoscape:一个用于生物分子相互作用网络综合模型的软件环境. 基因组研究, 13 (11), 2498–2504.
Webber, J. (2012, October). Neo4j 程序化入门. 在 第三届系统、编程和应用:为人类服务的软件年度会议论文集 (pp. 217–218).
第十四章:综合运用
在前面的章节中,我们探讨了适合网络科学解决方案的不同数据问题,学习了众多网络中心性指标,并将机器学习(ML)模型应用于网络科学数据集。在本章中,我们将把迄今为止所学的内容结合起来,评估时空数据集上的流行病风险,该数据集在每个时间点都评估了中心性指标和爱博拉病例数。我们的例子将包括 2018-2020 年大型爱博拉疫情以及自 2020 年以来几次较小疫情影响的刚果民主共和国的一个地理区域收集的网络和其他数据。我们还将介绍一个用于模拟时间序列数据的统计模型,类似于回归模型。
具体来说,本章将涵盖以下内容:
-
问题简介
-
广义估计方程(GEEs)简介
-
数据转换
-
数据建模
到本章结束时,你将了解如何使用网络科学工具和统计模型从头到尾解决问题。你将能够用 Python 运行时间序列模型并从数学角度解释结果。最后,你将具备将本书所学应用于你在工作中遇到的数据科学问题的能力。
技术要求
本章中展示的实用示例代码可以在以下链接找到:github.com/PacktPublishing/Modern-Graph-Theory-Algorithms-with-Python
问题简介
爱博拉病毒是一种丝状病毒,是一种被脂质层包裹的单链核糖核酸(RNA)病毒。它于 1976 年首次被发现,是动物源性的——从感染动物宿主传播到人类群体。目前尚不清楚爱博拉病毒从哪种动物宿主传播给人类。然而,该病毒通过直接接触体液从人传人,使一线医疗工作者和家庭护理者面临感染和传播病毒的双重高风险。
爱博拉病毒抑制免疫反应,抑制凝血,促进肾脏和电解质功能障碍,并促进酸中毒。所有这些因素都导致低血容量,这在许多情况下会触发器官衰竭和死亡。它在非洲的几个地区是地方性的,包括刚果盆地,大多数疫情都起源于那里。在已知的疫情中,死亡率通常在 40-50%之间,通常是由于农村地区缺乏支持性护理,如输血和生命支持,这些地区经常出现最初病例。
在疫情爆发期间,个人防护装备对于避免医疗保健提供者之间以及被他们传播至关重要。然而,在许多农村地区,医疗用品的缺乏限制了医疗保健提供者自我保护的能力,这导致了疾病的早期传播。此外,隔离病例是必要的,以避免感染在诊所寻求护理的其他患者。图 13.1显示了一位身穿个人防护装备的医生在为隔离埃博拉患者而设立的诊所:

图 13.1 – 一位医生在临时诊所中穿着个人防护装备治疗埃博拉患者的插图
2013 年 12 月,埃博拉病毒最严重的爆发始于几内亚盖克杜省梅利安杜——一个病毒通过几内亚及其邻国塞拉利昂和利比里亚传播的小镇。最终,病例传播到意大利、马里、尼日利亚、塞内加尔、西班牙、英国和美国,这些国家中有几个报告了继发性病例(主要是医疗工作者)。到疫情结束时,近 30,000 人感染,超过 10,000 人死亡。病毒在 2016 年疫情结束时发生了多次突变,研究人员开发了一种疫苗来扑灭疫情并限制其在全球以及如几内亚的康科雷等大城市中的传播。繁殖数在利比里亚为 1.20,在塞拉利昂为 2.02,这导致了这三个主要受影响国家快速传播和高感染率。
2018 年,刚果民主共和国的埃博拉病毒爆发影响了伊图里省、北基伍省和南基伍省,病例集中在本尼、布滕博、卡图瓦、卡隆古塔、马巴洛科和曼迪马。到 2020 年,共确认和疑似病例超过 3,500 例,尽管当地和国际公共卫生工作者及时干预,并且有 2014 年西非埃博拉疫情期间开发的疫苗,但死亡人数超过 2,200 人。从 2018 年底到 2019 年中期,繁殖数一直超过 1,表明持续的感染潜力。事实上,大多数病例确实发生在这个时间段内。
由于城镇的隔离和公共卫生工作者的及时干预,及时干预将感染人数的可能数量限制在大约 16,000 人——而不是受影响省份的 1,600 万人——这限制了埃博拉病毒的传播。边界监控措施限制了病毒传播到邻近国家如布隆迪和卢旺达。然而,对国际援助工作者的不信任、与 M23 叛乱组织的持续冲突以及暴力事件蔓延到治疗区域,这些都使得当地和国际援助团体对疫情的应对复杂化。更好的应对协调和更好的处理安全威胁可能阻止了病毒的传播,并提高了生存率。
虽然本章将专注于模拟刚果民主共和国各地区埃博拉病毒传播所促进的网络模型,但我们将使用的方法可以扩展到与网络传播相关的任何类型的偏微分方程(PDE)模型。例如,对生态和保育感兴趣的读者可能会考虑使用网络科学方法来模拟影响叶海龙、巴哈马锯鲨或苏卡达陆龟种群的有毒物质的地理传播;他们还可能希望了解捕食者-猎物关系中逃避或延迟的情况。社会科学家可能会考虑一个地区内国家间政治意识形态的传播,或者在社会媒体运动中,人口层面的行为变化可能涉及延迟,变化发生在较长时间内或需要达到阈值才能看到效果。生物医学研究人员可能会考虑细胞分化和形态发生背景下的化学梯度模型,通过大脑皮层的癫痫传播,甚至大脑区域肿瘤生长的动力学。农民可能希望考虑限制蝗虫或其他危害农作物的害虫传播的空间模型,这些害虫可能面临有限的屏障资源。
现在,让我们回到我们的埃博拉病毒例子,并深入探讨疫情发生的背景。
爱博拉病毒在刚果民主共和国蔓延 – 2018-2020 年疫情
尽管公共卫生工作者做出了快速反应,但 2018 年的埃博拉疫情包括指数级增长的波次。许多受影响地区包括人口超过 10 万的城市,在疫情爆发前和爆发后,对医疗设施的军事袭击威胁了医疗基础设施和患者的及时护理。由于持续的冲突,许多主要城市以外的农村地区的风险人群犹豫不决地接受疫苗或遵循公共卫生建议。错误信息泛滥,延误了一些患者的治疗,并允许埃博拉病毒传播到护理人员。所有这些因素都促进了埃博拉病毒在受影响地区城市间的传播。
然而,伊图里、北基伍和南基伍的大部分地区包括茂密的雨林、野生动物保护区和稀疏的人口,这限制了城市之间的旅行,而城市之间的旅行通常是跨区域流行病传播的典型推动力(见图13**.2)。事实上,大部分传播发生在由交通连接的大城市之间。这可能会减轻与 2014 年西非疫情相比的影响,后者包括许多交通路线的城市:

图 13.2 – 刚果盆地保护区示意图
不幸的是,由于埃博拉动物宿主栖息的茂密森林地区中的城市,刚果民主共和国东北部的地理环境增加了该地区爆发疫情的可能性。这增加了该地区未来埃博拉疫情爆发的可能性。因此,研究一些促进流行病传播和脆弱性随时间变化的因素非常重要,这样一旦发现新的疫情,就能迅速有效地做出反应。这限制了暴露人数,随着越来越多的人接种疫苗和治疗,可能降低死亡率。
地理和物流
正如我们在前面的子节中看到的,区域地理和城市间的运输物流在流行病的潜在传播中起着重要作用。在一个流行病中,一个与其它地区几乎没有或没有人口混合的孤立地区表明该流行病是受控制的。然而,一个交通枢纽(例如每天有众多国际航班的城市)在爆发期间对公共健康构成的风险要大得多。事实上,这正是 COVID-19 迅速传播的原因;短的潜伏期加上来自国际枢纽的许多旅客前往其他国际枢纽,导致新国家和大陆的病例激增,直到边境关闭以阻止疾病的传播。
在我们的分析中,我们将考虑 2018 年埃博拉疫情影响最严重的几个地区,包括基于区域间运输路线的网络连通性指标,每年病例数,暴力事件数量(可能造成地区人口流动),以及 2017-2021 年的灾害事件数量(再次,区域流动风险)。我们假设从区域连通性中得出的网络指标将影响爆发期间的埃博拉病例数量。
在我们开始构建我们的数据集之前,让我们首先建立我们分析所需的工具——特别是,纵向回归建模。
GEEs 简介
回归模型附带许多假设,这些假设需要放松以适应许多现实世界的问题。例如,线性回归假设结果呈正态分布。在许多问题中,我们可能希望处理二元结果数据(是/否,存活/死亡,复发/未复发……),计数数据(一段时间内的事件数量,如本章的结果),或制造产品的故障率(故障结果的可能性)。
最常见的输出分布之一来自二项分布,其中在整个人群中收集了二元数据。例如,我们可能有一个来自胶质母细胞瘤研究的患者样本,我们比较了不同治疗组的患者 6 个月生存率。每个患者要么存活要么死亡(二元结果);按组汇总,这些结果形成二项分布,可以通过统计方法进行比较,以确定是否存在针对胶质母细胞瘤患者的最佳治疗方案。
广义线性回归通过使用连接函数将结果转换为正态分布的结果,扩展了线性回归到上述结果等,使用基于几何的映射;大多数类型的输出都适合这个框架,因为它们属于一个称为指数族的结果家族。指数族中的分布可以使用几何工具相互映射。
然而,广义线性回归伴随着许多与线性回归共有的假设:变量的线性独立性、预测变量与结果之间的线性关系,以及预测变量各水平上误差的恒定性(技术上称为同方差性)等。其中一些假设——即预测变量的独立性——对于时间序列或空间数据并不成立。在某一时间点测量的预测变量很可能依赖于先前时间点测量的那些变量的值。在我们的例子中,公共卫生工作者和医生能够及早识别疫情并阻止其蔓延的能力在后续病例率和资源需求中起着重要作用(如图13.3所示):

图 13.3 – 医生和流行病学家追踪疫情来源的示意图
GEEs(广义估计方程)是一种解决方案,它将广义线性模型数学上转换为涉及多个时间点或数据集中聚类数据的模型。本质上,我们可以使用依赖相关性矩阵来建模时间(或聚类)之间的依赖关系。GEEs 保留了一个连接函数,允许它们在指数族内建模结果,例如我们跨地区的年度埃博拉病例数。
与其他针对时间序列或聚类数据的广义线性模型扩展方法相比,这种方法的一个优点是 GEEs 更容易计算。许多其他扩展,如广义线性混合模型,需要多级建模,涉及各级之间的依赖关系。这会在模型中创建额外的参数和依赖关系(这些依赖关系会创建条件分布)。GEEs 不涉及条件分布计算。这使得我们即使在模型中包含简单的时间序列或聚类组件时也能节省计算成本。
对于具有更高级数学背景的读者,我们将在下一节花一些时间深入探讨广义线性模型和 GEE 的数学。对于数学不太熟悉的读者可以跳过数学形式化,直接进入“我们的问题和 GEE 公式化”部分的数据构建部分。然而,了解回归方程背后的数学对于使用它们是有帮助的,并且鼓励有兴趣使用 GEE 的读者查阅章节末尾的参考文献,以获取更详细的数学解释。
GEE 的数学
在线性回归中,当结果呈正态分布且观测值和预测值彼此独立时,我们通过矩阵代数的估计来估计每个预测变量的效应大小。对于每个观测值(表示为向量),结果已知,而对于每个观测值,预测变量也已知(表示为与每个预测变量相关联的向量矩阵)。结果向量等于效应大小向量乘以预测矩阵加上一个误差项,以捕捉测量中的随机误差。在实践中,使用矩阵运算解决这个问题是困难的,因此使用一个迭代估计效应大小的算法来解决这个问题。
广义线性回归通过引入一个应用于结果向量的链接函数来扩展这种方法,将方程转换为线性形式,通过应用算法找到效应大小系数。然而,为了重新缩放这些效应大小,使它们与链接函数应用之前原始结果的比例相匹配,我们需要反转链接函数的操作来适当地缩放效应大小。例如,在逻辑回归中,一个常见的链接函数涉及对数变换。对效应大小进行指数化重新缩放这些效应大小,使它们与结果的规模相匹配,而不是结果的对数。
在实践中,线性回归和广义线性回归模型使用最大似然估计(MLE)来拟合,这是一个迭代调整效应大小向量估计的算法。该算法通过迭代重采样根据假设的结果概率分布和观测到的预测变量分布进行拟合。这允许对效应大小的估计进行统计分析。
关于 GEEs,我们样本中个体随时间变化的输出和预测因子的聚类性质,为我们的样本中的每个个体引入了相关结构,以及基于结果的预测因子的样本效应大小。我们定义了一个关于个体内相关矩阵结构的最佳猜测,称为自回归结构,该结构可以从数据中估计、未指定或定义为将时间或空间上的观察值联系在一起的具体结构。在实践中,如果相关结构未知,则最好未指定或从数据中估计。在定义自回归结构后,我们估计协方差矩阵以纠正自回归规格中的任何假设错误。
然后一个算法估计个体内和个体间的效应大小。通常,用于拟合模型的算法依赖于计算 GEE 的线性代数公式的导数,而不是最大似然估计量的计算;基于导数的方法通常在计算上优于 MLE 方法。此外,基于导数的方法产生的模型输出类似于广义线性回归模型,尽管并非所有整体模型拟合统计量都可以估计。
对广义线性回归和广义估计方程(GEEs)的线性代数公式感兴趣的朋友们,可以参考本章末尾的参考文献,以获取这些模型及其用于寻找预测效应大小的估计量的详细解释。Nelder(1972)的文本很好地概述了广义线性模型及其计算理论。Hanley 等人(2003)的文本提供了 GEEs 的线性代数概述,以及一个简单案例研究,读者可以轻松计算出估计值。建议那些希望理解 GEEs 背后的数学原理的朋友们,在尝试解决如 GEEs 之类的从广义线性模型派生出的模型之前,先从广义线性模型的数学和计算方法学开始。
现在,让我们回到我们数据集的构建。
我们的问题和 GEE 公式
在我们关于刚果民主共和国时间和地理上埃博拉风险的公式中,我们将查看以下城市中每年埃博拉病例的数量作为我们的结果:
-
Mandima
-
Mabalako
-
Kangulata
-
Katwa
-
Butembo
-
Bunia
-
Beni
我们将按省份对这些城市进行聚类,包括伊图里省的 Mandima 和 Bunia,以及北基伍省的 Mandima、Mabalako、Kangulata、Katwa、Butembo 和 Beni。接下来,我们将构建城市之间的交通选择网络,并获取每个城市的介数和中心度。这将为我们提供每年网络中桥接性和枢纽性的估计值。
我们还将包括其他统计数据,包括那一年涉及我们城市的暴力事件数量以及影响我们城市的自然灾害数量。
对于一些埃博拉病例,我们将合并ebola-epidemic-health-zone-figures.csv 人道数据交换(HDX)数据集(data.humdata.org/dataset/ebola-cases-and-deaths-drc-north-kivu),以包括我们分析感兴趣的城市。为了获得必要的交通,我们将在城市之间搜索可行的路线(骑自行车、乘坐公共交通或开车)。鉴于这是当前数据,我们还将搜索 2017-2021 年期间的变化,包括 COVID-19 限制。我们将使用ReliefWeb查找提及自然灾害的事件(reliefweb.int/disasters?list=Democratic%20Republic%20of%20the%20Congo%20Disasters&advanced-search=%28C75%29)。合并另一个 HDX 数据集将提供关于每个地区的暴力事件信息(data.humdata.org/dataset/ucdp-data-for-democratic-republic-of-the-congo)。虽然这可能不会包括我们时间范围内该地区所有信息,但我们应捕捉到主要冲突或灾害。
现在我们已经拥有了数据源,让我们来探索数据并执行所需的转换,以便将数据转换为适合作为我们的 GEE 模型输入的格式。
数据转换
在我们组装数据集时,我们注意到一些关于数据质量的问题值得提及。在我们感兴趣的时期内,该地区发生的自然灾害非常少,并且这些灾害分布在一个广阔的地域。这个因素不太可能影响埃博拉传播,但我们将保留这个变量在我们的数据集中。
暴力事件的来源似乎缺少信息,因为已知在卡图瓦对援助工作者和埃博拉治疗场所的攻击并未包含在数据中。这表明数据源可能不完整,可能无法捕捉到影响埃博拉传播的实际世界分析所需级别的暴力事件。然而,为了演示这种方法,它捕捉到的信息足以在分析中可能具有潜在的兴趣。在类似这样的项目中,数据质量可能会存在问题,因为在许多发展中国家很难找到好的数据源。
对交通路线的搜索也存在疑问,提供了一些关于直接路线的见解,但不如理想的详细。我们认为,如果开车、乘坐公共汽车或步行旅行时间少于 10 小时,城市之间的任何路线都是可行的。大多数城市都产生了可用的数据;然而,一些城市没有显示可行的路线,在我们的旅行网络中产生了孤立的顶点。多年来在路由方面没有出现重大差异(没有列出创建新道路或公交路线的项目),因此我们的网络属性在多年内不会发生变化。
爱博拉病例源数据可能显示了一些错误,因为某些地点的累积病例有时随着时间的推移而降低。鉴于我们希望将结果建模为计数数据,我们倾向于保留每年正或零病例总数。在这样的大流行中确定病例可能很困难,因为实验室确认困难,并且当送到另一个城市进行分析时通常耗时。
因此,我们这个项目的数据收集突显了从零开始构建数据集的一些现实世界挑战,特别是在数据收集可能不完整或不存在于开源网站上的领域。通常,检查许多潜在来源并合并见解或选择最佳来源是有利的。在我们的情况下,我们选择了最完整的数据源来获取我们的数据集。
Python 数据处理
从我们的来源中,我们组装了一个包含年份、城市、地区、冲突、灾害和爱博拉病例数据的.csv文件。然而,我们需要从我们的交通网络中计算中介中心性和度中心性,并将其添加到我们的数据集中,以捕捉每个城市的交通网络属性。
让我们从计算我们交通数据集中每个城市的中心性度量开始,这样我们就可以将这些值附加到我们的.csv文件中。我们将使用Script 13.1来计算这些度量:
#install igraph and pycairo
!pip install igraph
!pip install pycairo
#import igraph, pandas, and numpy
import igraph as ig
from igraph import Graph
import numpy as np
import pandas as pd
import os
#import adjacency matrix
File ="C:/users/njfar/OneDrive/Desktop/DRC_Transport.csv"
pwd = os.getcwd()
os.chdir(os.path.dirname(File))
mydata =
pd.read_csv(os.path.basename(File),encoding='latin1',header=None)
#create and plot graph
g_transport=Graph.Adjacency(mydata)
ig.plot(
g_transport,bbox=(200,200),
vertex_label = ["Beni","Bunia","Butembo","Kalunguta","Katwa",
"Mabalako","Mandima"]
)
#calculate betweenness and degree centrality
bet=Graph.betweenness(g_transport)
deg=Graph.degree(g_transport)
#create vector to add to dataset
degree=deg+deg+deg+deg+deg
betweenness=bet+bet+bet+bet+bet
此脚本应该会生成一个显示两个孤立顶点和几个通过加权路径连接的顶点的图,路径的值为1、2或3,如图图 13.4所示:

图 13.4 – 爱博拉网络城市的图
从图 13.4中,我们可以看到 Kalunguta 和 Mandima 没有连接到其他城市,而其他城市似乎紧密连接到一个高流量区域。为了更全面地检查旅行,我们也可能考虑地区之间的旅行量;在我们的背景下,这些数据似乎不存在。
现在我们有了我们城市之间的桥梁性和中心度向量,这些向量捕捉了我们城市的桥梁性和枢纽性,我们可以将这些值附加到我们创建的数据集中,以便为使用 GEE 分析准备数据集。
GEE 输入
现在我们已经推导出了我们的网络度量,让我们导入我们的收集数据集,并通过添加到Script 13.1来将网络度量作为额外的列:
#import Ebola dataset
File ="C:/users/njfar/OneDrive/Desktop/Ebola_Data.csv"
pwd = os.getcwd()
os.chdir(os.path.dirname(File))
data = pd.read_csv(os.path.basename(File),encoding='latin1')
#add degree and betweenness to Ebola dataset
degree=np.array(degree)
betweenness=np.array(betweenness)
data['Betweenness']=betweenness
data['Degree']=degree
现在我们已经组装了完整的数据集,我们准备使用我们的 GEE 模型来分析它。
数据建模
对于我们的模型,我们将假设我们的结果具有泊松分布。虽然我们的数据集中零值不多,但考虑使用零膨胀泊松分布或负二项分布而不是泊松分布可能是有意义的。然而,为了建模的简便性,我们将我们的分布设置为泊松分布。
我们将使用数据推导出的自相关结构,因为对于城镇间时间上的相关性的最佳猜测并不明显。在实践中,通常从数据中推导出这种结构比在结构事先不太清楚的情况下进行猜测要好。
让我们开始使用 Python 建模这个 GEE。
在 Python 中运行 GEE
让我们首先导入我们的 GEE 模型,并使用Script 13.2定义分布族和协方差结构:
#load packages
import statsmodels.api as sm
import statsmodels.formula.api as smf
#define GEE parameters
family=sm.families.Poisson() #count data
#data-derived covariance structure
cov_str=sm.cov_struct.Exchangeable()
现在我们已经定义了我们的模型,我们可以通过将相关预测变量添加到Script 13.2中来拟合我们的数据:
#create GEE model predicting Ebola cases
Model = smf.gee(
"Ebola_Cases~Province+ViolentIncidents+Disasters+Degree+Betweenness",
"Town",
data,
cov_struct=cov_str,
family=family
)
results=model.fit()
由于数据集规模较小,这个模型应该拟合得很快。较大的模型可能需要一段时间才能运行,尤其是那些具有大量簇和许多时间点的模型。然而,这个模型将比其他纵向模型(如广义线性混合模型)运行得更快,因为它没有层次结构或似然函数推导。
我们现在可以通过将相关内容添加到Script 13.2中来检查我们的模型参数和拟合统计量,以查看哪些因素可以预测我们数据中的爱博拉病例:
#examine resulting model
results.summary()
这应该会给出类似于表 13.1的摘要:
| GEE 回归结果 |
|---|
| 因变量: |
| 模型: |
| 方法: |
| 家族: |
| 依赖结构: |
| 日期: |
| 协方差类型: |
| --- |
| 截距 |
| 省份[T.North_Kivu] |
| 暴力事件 |
| 灾难 |
| 度数 |
| 介数 |
| 偏度: |
| --- |
| 偏度: |
表 13.1 – GEE 模型拟合统计量
表 13.1 显示,我们的大多数预测因子与每个城镇的埃博拉病例数量之间没有关系。灾害似乎与数量呈负相关(z-值为 -10.467,在 p<0.001 的水平上显著)。这可能关系到该地区为应对灾害而定位的相关资源,这些资源可以重新用于应对埃博拉疫情。请注意,暴力事件在统计上几乎达到显著性水平(z-值为 1.415,p-值为 0.157),表明与病例数量可能存在潜在的积极关系。在一个更大的样本和更好的暴力事件数据下,暴力事件很可能会成为埃博拉病例的预测因子,正如我们所假设的那样。北基伍的位置似乎有另一个几乎显著的关联(p-值为 0.111),表明它是一个重要的监测地点。其他潜在预测因子的 z-值接近 0,表明它们可能并不重要,即使在更大的样本量下也不太可能发挥作用。
我们认为我们的网络指标都不是埃博拉病例的显著预测因子。运输可能没有在疫情病例数量中发挥重要作用;考虑到一些地区的相对孤立,这在逻辑上是合理的。如果可以获得城市间的年度旅行量,它们可能更能预测随时间变化的埃博拉病例。然而,据我们所知,我们分析中考虑的城镇并没有这样的数据。
摘要
在本章中,我们将前几章中探讨的许多工具结合起来,以应对公共卫生领域的一个重大问题:埃博拉疫情。我们构建并分析了受埃博拉疫情影响的地区时空数据的属性。然后,我们使用 Python 将这些信息输入到一种纵向统计模型 GEE 中,以了解哪些因素可能导致了疫情随时间和地理空间的传播。
到目前为止,我们在本书中概述了许多工具,并已将它们应用于最终项目。接下来,我们将考虑网络科学中新兴的工具,这些工具为未来的项目提供了希望,包括超图和量子网络科学算法。
参考文献
Ballinger, G. A. (2004). 使用广义估计方程进行纵向数据分析。组织研究方法, 7(2), 127-150.
Bolker, B. M., Brooks, M. E., Clark, C. J., Geange, S. W., Poulsen, J. R., Stevens, M. H. H., & White, J. S. S. (2009). 广义线性混合模型:生态学和进化的实用指南。生态学与进化趋势, 24(3), 127-135.
Breslow, N. E. (1996). 广义线性模型:检查假设和加强结论。应用统计学, 8(1), 23-41.
Gatherer, D. (2014). 西非 2014 年埃博拉病毒疾病疫情。普通病毒学杂志, 95(8), 1619-1624.
Groseth, A., Feldmann, H., & Strong, J. E. (2007). 埃博拉病毒的生态学。微生物学趋势, 15(9), 408-416.
Guetiya Wadoum, R. E., Sevalie, S., Minutolo, A., Clarke, A., Russo, G., Colizzi, V., ... & Montesano, C. (2021). 2018-2020 年刚果民主共和国埃博拉疫情:通过非洲国家间协调实现更好的应对。风险管理与健康政策, 4923-4930.
Hanley, J. A., Negassa, A., Edwardes, M. D. D., & Forrester, J. E. (2003). 使用广义估计方程对相关数据进行统计分析:入门。美国流行病学杂志, 157(4), 364-375.
Holmes, E. C., Dudas, G., Rambaut, A., & Andersen, K. G. (2016). 埃博拉病毒的进化:2013-2016 年大流行的见解。自然, 538(7624), 193-200.
Jacob, S. T., Crozier, I., Fischer, W. A., Hewlett, A., Kraft, C. S., Vega, M. A. D. L., ... & Kuhn, J. H. (2020). 埃博拉病毒病。自然综述疾病原初, 6(1), 13.
Liang, K. Y., & Zeger, S. L. (1986). 使用广义线性模型进行纵向数据分析。生物计量学, 73(1), 13-22.
McKinney, W., Perktold, J., & Seabold, S. (2011). 使用 statsmodels 在 Python 中进行时间序列分析。Jarrodmillman Com, 96-102.
Nelder, J. A., & Wedderburn, R. W. (1972). 广义线性模型。皇家统计学会 A 系列:社会统计学, 135(3), 370-384.
Vossler, H., Akilimali, P., Pan, Y., KhudaBukhsh, W. R., Kenah, E., & Rempała, G. A. (2022). 分析 2018-2020 年刚果民主共和国埃博拉疫情的个人层面数据。科学报告, 12(1), 5534.
WHO Ebola Response Team. (2014). 西非埃博拉病毒病:疫情前 9 个月及未来预测。新英格兰医学杂志, 371(16), 1481-1495.
第十五章:新的领域
在前面的章节中,我们概述了网络科学在分析项目中的许多工具和应用。在本章中,我们将展望正在开发的新工具,这些工具在网络科学中有许多有希望的应用,包括量子图算法、深度学习/大型语言模型架构优化和多级图,这些图对于组织元数据和理解遗传数据非常有用。
虽然前面的章节包含了编码示例,但本章将侧重于思想和未来发展的可能性。网络科学是一个不断发展的领域,我们很可能现在无法想象的工具将在下一个十年内变得司空见惯。让我们深入研究一些新的应用,看看网络科学如何继续为许多不同领域的知识做出贡献。
具体来说,我们将涵盖以下主题:
-
量子网络科学算法
-
作为图的神经网络架构
-
层次网络
-
超图
量子网络科学算法
量子计算是网络科学算法开发的一个新且充满希望的途径。量子计算利用了量子层次物理的许多有利特性来提高计算能力并解决难题。尽管量子计算有许多不同的类型,但我们将专注于量子位系统,其中比特被它们的量子版本所取代。
量子位在计算框架中相对于比特提供了许多优势。0或1配置,量子位可以在被测量之前同时以1和0存在,测量后坍缩到比特的常规状态。这允许进行大规模并行搜索解决方案。
除了可以同时以1和0存在之外,叠加态还允许存在分数值,在概率意义上,量子位部分是1,部分是0。正因为这种分数状态,才有可能设计出作用于概率函数而不是单个比特状态的门。这种灵活性使得电路设计能够增强算法,并且这种计算方法在图像分类中已经显示出优势。图 14.1展示了量子位和比特之间的差异:

图 14.1 – 量子位与比特的可视化
许多类型的机器学习算法已经被翻译成可以在量子计算机上使用,以加快解的收敛速度或扩展算法以处理更大的问题。量子机器学习是一个活跃的研究领域,网络科学算法是量子机器学习研究中的一个较大领域。让我们更详细地探讨两个量子网络科学算法。
图着色算法
图着色算法是网络科学算法的一个分支,旨在找到图的色数。色数是着色网络顶点所需的最少颜色数,使得没有颜色相邻。在现实世界的应用中,色数对于确定通信系统中分配的信道数量或在并行处理中安排作业非常重要。着色网络顶点所需的最少颜色数代表完成上述任务所需的最少信道数或所需的最少作业数。图 14.2显示了具有四个顶点、四个边和色数为二的简单网络:

图 14.2 – 具有四个顶点、四个边和色数为二的简单网络
虽然图 14.2的色数容易确定,但计算网络色数通常被认为是非常困难的,即NP-hard,这意味着它不能在多项式时间内求解。具有高复杂度的算法意味着对于足够大或足够密集的网络,计算非常困难或目前无法实现。这在解决通信和作业调度问题时带来了问题,因为呼叫量或作业量非常大。
幸运的是,量子图着色算法允许算法在经典机器上运行得更快,从而为大型图提供更快的解决方案,甚至可能为非常大的图提供可计算的解决方案。然而,当前的量子硬件系统限制了可以运行量子图着色算法的图的大小,因为问题必须映射到物理系统。随着量子硬件支持越来越大的网络,色数计算将适用于更多现实世界的问题。
最大流/最小割
在第四章中,我们探讨了运输物流和最大流/最小割算法。回想一下,这个算法在分割网络流量方面很有用,并且可以用来规划交通网格上的道路关闭,例如图 14.3中显示的网格:

图 14.3 – 与五个商店(在第四章中考虑)相关的交通网格
寻找最优割以避免对每个这些五个商店(如图 14.3所示)的服务延迟是一个难以计算的难题,而计算效率高的解决方案为这些类型分析的可扩展性提供了良好的方法。
最大流/最小割算法的另一个常见用途是图像分割,其中确定图像的前景和背景。图像增强通常依赖于区分图像中不同的焦点部分。图像处理也需要一个前景/背景区分步骤。
就像计算色数一样,在处理经典系统时,在大或密集图上计算最大流/最小割最优解可能具有挑战性。这个算法的量子版本存在,并且比经典版本更容易优化解决方案。然而,硬件尺寸目前限制了量子最大流/最小割算法在大问题上的应用。
存在许多其他量子版本的网络算法,它们在小问题上取得了强有力的成果,代表着在硬件方面采用新方法扩展网络算法的稳固未来方向。随着硬件的发展,网络科学可能会受益,目前无法像其他网络科学算法那样扩展的网络科学算法将找到解决困难问题的途径。迄今为止,网络科学算法代表了量子机器学习研究的主要部分,鉴于它们的成功,网络科学和量子计算可能会继续相互影响。
让我们把注意力转向深度学习架构,这些架构可以在经典计算和量子计算中表述。
作为图的神经网络架构
在第一章中,我们提到了深度学习模型,特别是在生成式人工智能的背景下。深度学习模型出现在许多分析领域,包括自然语言处理、图像分类和时间序列预测。让我们更详细地探讨这些应用。
在大数据时代,自然语言处理无处不在。调查通常采用自由文本收集方法。客户提供产品文本评论。社会科学家在观察人群时做笔记(被称为民族志研究)。博主发布定期的内容以传播思想。法律、医疗和教育笔记可能包含需要解决的有偏见的内容,以保护人们免受限制未来机会和福祉的制度偏见。
所有这些数据在输入分类模型或探索性数据工具之前都需要进行解析。大多数执行此操作的工具依赖于能够连接句子或段落中分离的信息的深度学习模型,这些模型被称为循环神经网络。Python 中的许多常用包都依赖于预训练的循环神经网络,其中训练步骤已经在大型数据集上完成并保存为模型。更新预训练模型通常涉及根据新数据调整神经网络权重和/或连接,这些新数据可能来自特定的领域,如化学或法律。图 14.4显示了简单的循环神经网络架构。在实践中,循环神经网络可以有更多的隐藏层和节点,它们之间有连接:

图 14.4 – 一个简单的循环神经网络图,其中隐藏层以前向和反向的方式相互提供反馈
当今分析中的另一个关键任务是图像分类。社交媒体允许用户上传大量图像,涵盖各种主题,需要用主题信息进行标记,并在内容不安全时进行标记。陷阱相机和无人机允许对保护区内的野生动物和可能的偷猎者进行监控,这些图像需要进行分析以保护野生动物并分配有限的资源。农民现在可以使用机器人成像技术监测作物,然后将图像与疾病分类模型匹配,以早期识别作物中的疾病或损害,这些疾病或损害会危害当地食品来源或损害当地经济。图 14.5显示了三张图像,这些图像可用于南非克鲁格国家公园图像分类器的训练集中,以识别不同类型的动物:

图 14.5 – 在克鲁格国家公园拍摄的三个图像,这些图像可用于图像分类器的训练样本
从图 14.5中,请注意,从陷阱相机或调查中获得的图像可能不包括整个动物的图像,图像中可能包含多个动物,有树枝或其他杂乱物体遮挡图像,或者截断图像中的整个动物。这些都对图像分类造成问题,可能会增加样本大小需求或分类器架构复杂性。让我们在深度学习中探讨一些解决这些问题的潜在方案。
许多图像分类模型使用一种称为卷积神经网络(CNNs)的深度学习架构。CNNs 包含许多处理层和一些池化层,其中先前层中导出的特征被总结并输入到后续层中。这专注于训练过程中找到的最相关特征。正如在自然语言处理中一样,存在许多预训练模型,可以通过新数据更新来修改神经网络权重和连接。
现在我们对深度学习模型有了一些了解,让我们深入了解一些在深度学习模型中常见的架构以及这些架构如何表示为网络。
深度学习层和连接
尽管存在许多深度学习算法,但它们都包含由边连接的多个处理层,这些层由顶点组成。随着算法将层和连接拟合以优化其在训练和测试数据上的性能,深度学习架构的网络结构也随之演变。这意味着网络科学及其相关工具,如研究单纯复形时发现的那些工具,可以用于指导拟合过程或评估算法在特定基准上的表现。虽然这是一种相对较新的深度学习算法方法,但这种方法已经提高了模型拟合度,减少了获得良好拟合所需的样本量,并加快了训练速度。
在图像生成中,使用称为持久同伦的算法对过滤单纯复形特征的分类在通过深度学习算法(称为生成对抗网络)生成逼真的景观地形特征和医学特征(如血管分支)方面发挥了重要作用。我们在第一章中简要概述了这些生成器的基础,即图像生成器。网络拟合所测量的损失函数中的基于网络的度量组合促使算法生成更逼真的图像。
在医学背景下,人工图像集非常重要。构建图像分类器依赖于大量样本,而对于罕见疾病或小型医疗系统来说,这些样本可能不存在。通过图像生成进行数据增强使我们能够创建更大的样本量,并(希望!)生成现实图像,这些图像可以用于构建其他应用,例如图像分类器。这反过来又允许研究人员通过研究疾病不同阶段的细胞结构形态变化,或通过将患者样本与算法训练的增强先前患者数据进行匹配,尽可能快地识别侵袭性疾病,从而深入了解疾病的病因。
分析架构
从网络结构的角度来看,深层学习架构的另一个视角是通过使用网络科学工具分析它们来探索好的架构。大型语言模型(LLMs)是涉及数十亿到数万亿参数的巨大深度学习算法,它们需要在层及其连接中进行估计。它们在大量文本数据上训练,并且需要大量的计算资源来拟合模型。较大的模型通常比较小的模型表现更好,这需要更多的数据和计算能力。这并不理想,因为计算资源受硬件限制,并且对环境有重大影响。
网络科学为寻找好的、小型 LLM 架构提供了潜在途径,这些架构需要较少的训练数据和计算资源来拟合。当为代表性不足的语言构建模型时,这些架构对资源匮乏国家的开发者来说更容易获得,并且它们为可持续的 LLM 增长提供了途径。
将这种网络科学方法与训练数据相结合,也可以减少构建有效大型语言模型(LLM)所需的训练样本量。可以从 LLM 内部所需的每个结构或领域中抽取具有相似语言结构或内容的相关文档。这提供了可以更有效地使用较少资源进行质量检查的全面数据。更好的训练数据可以增强模型拟合,减少训练时间,并减少拟合良好模型所需的计算资源。现在,我们已对神经网络架构有了些许了解,让我们转向一种在其结构中整合层次和分层信息的网络类型。
层次网络
在第十一章中,我们在语言和遗传背景下遇到了本体和系统发育。层次网络建立在本体和系统发育的直觉之上;层次网络是树状网络,可以包括从树的顶部流向底部的多个源和汇。基因调控网络通常遵循这种层次网络结构,而不是严格的树状结构,其中网络中不存在多个源和汇,或者本体结构,其中父节点通常不存在。图 14.6展示了层次网络的一个示例:

图 14.6 – 一个层次网络示例,其中网络的第二层包含第三层顶点的父节点
研究基因调控可以为众多研究领域提供洞察,包括器官系统或物种内的进化途径、与基因失调相关的病理学,以及细胞功能的辨别。基因调控并不像理解基因途径本身那样简单。环境条件可以改变与 DNA 或 RNA 相关的蛋白质结构,使 DNA/RNA 对参与基因转录的蛋白质更易或更难接近。这反过来通常进一步改变这些蛋白质的结构,通过 DNA/RNA 的可及性上调或下调转录速率。
基因组学和表观基因组学(将遗传分析与环境条件相结合)的最近进展包括测量基因表达和基因周围蛋白质结构(这些结构反映了局部环境条件)的工具。通过在不同条件和不同遗传突变线路上测量这些表达水平,可以辨别生物体内的调控途径。
在考虑蛇毒表观基因组学中层次网络的一个例子之前,让我们从更理论的角度来探讨网络数据中的高级结构。
高级结构和网络数据
如果我们回顾一下第十一章,语言家族以一个源头开始——一个随着时间的推移演变为其他语言的初始语言。这为语言家族提供了一个由时间(通常还有地理)定义的层次结构。不同时期内出现不同的级别,从原始语言到该语言的现代派生语言。
在基因调控途径中,多个基因可以影响调控途径中后续步骤所涉及的基因,从而形成一个比树状结构更复杂的网络结构。然而,顺序仍然很重要,这导致了层次网络的出现。在生物研究中,这种结构可能很难通过实验室实验来辨别,因为结构不是一对一的,偶尔效果也不是线性的。然而,最近的技术进步允许研究人员通过改变环境或敲除途径中的基因,更容易地辨别这些途径。
现在我们对层次网络有了一些了解,让我们考察一个现实世界的用例,这些用例揭示了进化途径以及不同蛇毒生物特性的差异。有毒物种对许多环境的健康至关重要。近年来,对它们毒液的研究导致了人类疾病(包括非成瘾性止痛药、心脏病治疗和可以治疗耐药菌株的新抗生素)的药物突破。了解有毒物种之间的差异使研究人员和临床医生能够开发出更好的蛇咬受害者治疗方法,使医学研究人员能够研究可能对人类疾病药物治疗的药物有用的毒液特性,并使保护生物多样性成为可能。
使用基因家族的例子
有毒的蛇类通过控制的方式(攻击猎物)或非控制的方式(当蛇受到威胁时的防御性咬伤)消耗毒液。最终,毒液储存耗尽,蛇必须产生更多的毒液以生存。毒液主要由蛋白质和多肽组成;鉴于这一点,快速产生毒液会对内质网(ER),一个主要参与细胞内蛋白质生产的细胞器产生压力。这表明参与 ER 调节的基因家族可能在毒液调节和产生中发挥作用。
最近对草原响尾蛇的功能基因组学研究揭示了两个与毒液调节密切相关且独特的通路:
-
与激酶通路相关的细胞外通路
-
与内质网相关的蛋白质通路
这是有道理的,因为信号需要对外部条件(毒液浓度降低)和内部条件(过度工作的内质网)做出反应;在毒液浓度和细胞健康之间取得平衡,从启动和停止信号的角度来看,对于调节产生多少毒液是有意义的。有趣的是,这些通路在物种之间普遍存在,并且认为类似的通路可能参与了普遍的毒液调节。
让我们检查一个通路内遗传保守性的系统发育树。您可以在参考文献部分引用的 Perry 2022 论文中找到这张图片(图 6**C)。我们将在以下章节中讨论这张图片及其对进化途径的影响。
这棵树表明,在这个通路中研究的增强子区域对于有毒蛇种是保守的,在进化途径中发生了一些进一步的突变,从而产生了不同类型的毒液,这些毒液在受毒的猎物或捕食者体内具有不同的作用方式。
层次化网络使我们能够在多个级别上组织信息,例如佩里 2022 年论文中的图 6**C这样的可视化允许我们检查与层次化网络的组织原则相关的其他相关信息(如时间)。然而,层次化网络可能对于某些可视化来说不够灵活,在下一节中,我们将探讨一个更加灵活的可视化工具。
超图
网络科学中另一个令人兴奋的研究领域涉及超图,它是网络的扩展,其中多向关系可以包括多个顶点。以这种方式,边概念被扩展的方式与在第六章中“扩展网络度量用于时间序列分析”部分对单纯复形的边概念扩展方式相似。事实上,单纯复形的抽象是一种超图。
超图通常用于可视化数据库图和规划信息检索系统,在这些系统中,经常存在多对多的关系。一些分布式计算系统甚至提供超图算法来帮助进行这些大规模检索任务。
通过超图进行可视化在生物信息学中也得到了广泛的应用,其中蛋白质、生物途径、基因表达数据集和代谢过程之间存在多向关系。在复杂系统中,用视觉方式展示关系通常比展示矩阵或关系列表更容易。与包含许多重叠线条或复杂表格的图表相比,这种表示方式也更加紧凑。
让我们深入探讨超图可视化的细节,然后转向一个超图在生物信息学中简化数据可视化的真实世界示例。
显示信息
在科学领域,清晰简洁的沟通非常重要,尤其是在讨论可能对读者来说非常陌生的复杂或微妙概念时。与冗长、术语繁多的段落相比,准确简洁的信息图表为读者提供了材料的替代表示形式。这使得材料更容易被更广泛的受众接受。对于机器学习中的新算法或生物信息学中的新测量工具,一个很少被采用的好工具与一个被用来解决实际问题的工具之间的区别,往往是一个市场营销的问题。能够邀请读者深入材料的坚实沟通将导致受众更大、更多样化。
让我们考虑四种不同的方式来向观众传达生物网络复杂关系。第一种方式是通过文本。也许有五个途径在途径的某些阶段重叠。途径 1 沿着自己的途径直到与 途径 2 和 途径 3 合并,这两个途径最初重叠,但在与 途径 1 合并后分叉。途径 4 独立出现,然后与 途径 2 连接。途径 5 独立出现,然后连接到 途径 3。当你阅读文本时,你能在脑海中想象出这些途径吗?通过文本来可视化所有这些途径是困难的。
我们也可以通过关系表来展示这一点。对于五个途径,当使用途径表,例如 表 14.1 时,可视化并不糟糕。然而,考虑一下对于复杂的代谢过程或包含数十或数百个途径的基因网络,这样的表格会是什么样子。通过表格来可视化这些途径并不理想:
| 途径 1 | 途径 2 | 途径 3 | 途径 4 | 途径 5 | |
|---|---|---|---|---|---|
| 途径 1 | X | X | X | X | |
| 途径 2 | X | X | |||
| 途径 3 | X | X | |||
| 途径 4 | X | X | |||
| 途径 5 | X | X |
表 14.1 – 显示生物体内五个代谢途径之间途径重叠的表格
现在让我们考虑一个网络,其中每个途径用一个顶点表示,每个通过代谢途径的连接用一个边表示。虽然途径数量有限,不会产生一个特别混乱的图,但这种表示方法不会扩展,尤其是当途径边随着顶点数量的增加而扩展时。当达到十个途径时,使用这种方法很难辨别哪些边连接哪些顶点。图 14.7 展示了代谢途径的例子,以网络的形式可视化:

图 14.7 – 代谢途径中关系的网络表示
最后,让我们考虑这些途径及其重叠的超图表示。这种方法看起来有点像显示集合重叠的维恩图,不同的颜色或纹理将关系解析为相关项目的集合。如果数据包含时间成分,我们甚至可以为代谢途径的每个分支点创建演化的超图表示。当途径数量增加时,这更容易向读者传达,将这个演化的网络视为项目集合,使得在变化和属性方面更容易进行计算。图 14.8 展示了一个包含时间成分的超图表示:

图 14.8 – 随时间变化的代谢途径的超图表示
图 14.8 体现了路径合并信息和路径运行至完成的时间维度。这比文本或表格表示更容易理解,并且比简单的网络图更容易扩展。超图是有效的可视化工具,对于复杂问题具有很好的扩展性。
元数据
经常情况下,网络中包含关于边或顶点的元数据,这些数据通常存储在表中。正如我们在本节前面提到的,超图在处理复杂数据库时是很有用的工具。实际上,超图数据库已经存在,并且在 OWL 数据库的数据管理、语言主题模型、文档存储等方面可以非常有帮助。与图数据库相比,超图数据库的灵活性包括能够轻松捕捉和表示数据表、文档或文档集之间的多向连接和交互。
在回到我们的生物信息学例子时,超图数据库非常适合管理与基因、蛋白质、代谢途径或其他相互关联的过程集相关的生物信息学数据。层可以表示途径重叠的不同方面、不同时间段或具有重叠代谢或调节途径的不同生物体。
考虑前一小节中的毒液例子。一个超图数据库可以包含与有毒生物体中产生的毒液相关的所有已知基因途径。系统发育关系、分布地理、抗毒血清类别和其他类型的元数据可以用来将基因途径分组连接起来,以促进对特定基因或调节功能在生境、物种以及与人类种群相互作用中的研究。随着新论文的发表定期更新此类知识将加速该领域的研究,并以一种便于研究人员访问的方式将不同知识分支联系起来。
考虑到超图数据库的实用性,我们预计在未来几年内,网络科学这一领域将会有更多的发展。
摘要
在本章中,我们通过将网络算法与量子计算框架相结合,推动了网络科学的极限,增强了我们对现代数据科学中无处不在的深度学习算法扩展性的理解,并探讨了在分子生物学和遗传学中至关重要的特殊类型网络。网络科学在数据科学中扮演着重要角色,为常见问题提供可扩展性和新颖的解决方案。随着网络科学领域的发展,数据科学及其从业者将继续受益。我们希望这本书能为任何与数据工作的人提供装备和灵感,通过使用数据来推动知识的边界并解决世界上的难题。加入我们吧!
参考文献
Berkolaiko, G.,& Kuchment, P. (2013). 量子图论导论 (No. 186). 美国数学学会。
Biamonte, J., Wittek, P., Pancotti, N., Rebentrost, P., Wiebe, N., & Lloyd, S. (2017). 量子机器学习. 自然, 549(7671), 195-202.
Cerezo, M., Verdon, G., Huang, H. Y., Cincio, L., & Coles, P. J. (2022). 量子机器学习中的挑战与机遇. 自然计算科学, 2(9), 567-576.
Cui, S. X., Freedman, M. H., Sattath, O., Stong, R., & Minton, G. (2016). 量子最大流/最小割. 数学物理杂志, 57(6).
Ekanayake, E. M. U. S. B., Daundasekara, W. B., & Perera, S. P. C. (2022). 网络中最大流的新方法以及运输问题的最优解. 现代应用科学, 16(1), 30.
Feng, S., Heath, E., Jefferson, B., Joslyn, C., Kvinge, H., Mitchell, H. D., ... & Purvine, E. (2021). 生物网络的高阶图模型以识别对病原体病毒反应至关重要的基因. 生物信息学杂志, 22(1), 1-21.
Iordanov, B. (2010). Hypergraphdb:一种通用图数据库. 在 Web-Age Information Management: WAIM 2010 国际研讨会:IWGD 2010, XMLDM 2010, WCMT 2010, 九寨沟,中国,2010 年 7 月 15-17 日修订选集 11 (pp. 25-36). Springer Berlin Heidelberg.
James, D. F., Kwiat, P. G., Munro, W. J., & White, A. G. (2001). 量子比特的测量. 物理评论 A, 64(5), 052312.
Karlebach, G., & Shamir, R. (2008). 基因调控网络的建模和分析. 分子细胞生物学评论, 9(10), 770-780.
Leighton, F. T. (1979). 用于大型调度问题的图着色算法. 国家标准局研究杂志, 84(6), 489.
Perry, B. W., Gopalan, S. S., Pasquesi, G. I., Schield, D. R., Westfall, A. K., Smith, C. F., ... & Castoe, T. A. (2022). 蛇毒基因表达由新型调控架构和多条脊椎动物途径的整合所协调. 基因组研究, 32(6), 1058-1073.
Titiloye, O., & Crispin, A. (2011). 图着色问题的量子退火. 离散优化, 8(2), 376-384.
Vidya, V., Achar, R. R., Himathi, M. U., Akshita, N., Kameshwar, V. H., Byrappa, K., & Ramadas, D. (2021). 毒肽——疼痛管理中的全面转化视角. 当前毒理学研究, 2, 329-340.
Wittek, P. (2014). 量子机器学习:量子计算对数据挖掘的意义. Academic Press.
第十六章:索引
由于本电子书版本没有固定的页码,以下页码仅作为参考,基于本书的印刷版。
A
A* 算法 77-79
与 Dijkstra 算法相比 77
激活函数 174
Adam 优化器 175
邻接矩阵 88
非洲数学科学研究所 (AIMS) 37, 45
AIMS 喀麦隆学生网络流行病模型 58-63
代数连通性 89
弧 7
自回归积分移动平均模型 (ARIMA 模型) 103
自回归结构 235
B
巴拉巴西-艾伯特模型 12
贝叶斯推断准则 (BIC) 190
贝叶斯网络 185
贝叶斯定理 183-185
BERT 模型 95
介数中心性 54, 105, 147, 238
生物网络 26-28
bnlearn 分析 189-193
桥梁 54
布基纳法索市场数据集 122, 123
C
因果途径 185
Čech 复合体 116
中心性测量 101
中心性度量 54, 105, 106, 146, 147
应用,跨时间切片 107-115
概率链式法则 186
Christofides 算法 79
色数 246
气候变化知识门户 (CCKP) 71
共表达 27
共表达网络 27
条件概率 183
连接网络 89
连通性 89
联系追踪 145, 213
对比语言-图像预训练(CLIP) 18
卷积神经网络(CNNs) 86, 174, 250
卷积层 175
课程排序
分析,以找到最佳学生毕业路径 187
鳄鱼网络 148-153
Cypher 218
D
数据,在 Neo4j 中
基本查询示例 218-222
复杂查询示例 222-226
查询和修改 216-218
数据建模 240
GEE,在 Python 中运行 240-242
数据集 188, 189
数据源 22, 28-30
生物网络 26-28
社会互动数据 22, 23
空间数据 23, 24
时间数据 25, 26
数据转换 237
中心性度量,计算 238, 239
GEE 输入 239, 240
深度学习(DL)算法 28, 171
度中心性 105, 146, 238
顶点的度 88
人口统计学因素 46, 47
人口统计学 46
脱氧核糖核酸(DNA) 26
微分方程 53
Dijkstra 算法 71, 74
与 A*算法的比较 77
有向无环图(DAG) 185
有向图 7
断开网络 89
DL,在网络上 172, 173
GNN 173-175
GNN,示例分类空手道网络数据集 176-178
动态网络 141-144
E
埃博拉病毒 230
埃博拉病毒疫情 231
地理和物流 233
在刚果民主共和国 232
偏心率 147
生态数据 84
方法,用于捕捉植物分布和疾病 86-88
方法,用于追踪地理上动物种群 84, 85
生态笔记
光谱聚类 94-96
生态种群
使用光谱图工具进行聚类 89-94
基于边的中心性 105
教育路径示例 186
成功的前因 187
课程序列 187
教育成果 186
特征向量中心性 105
内质网 (ER) 253
表观遗传学 27
表观基因组学 252
Erdös-Renyi 网络 11
民族志研究 249
欧几里得 211
指数族 233
F
前馈神经网络 18
Fiedler 值 89
病毒丝状病毒 230
Forman-Ricci 曲率中心性 106, 147
法语非洲
音乐传播 50-58
友谊人口数据集 166
友谊网络 138-140, 164-166
在 171 上进行光谱聚类
友谊关系数据集 164
G
广义估计方程 (GEEs) 233-235
埃博拉风险公式 236, 237
数学 235
广义线性回归 233
生成对抗网络 251
基因组学 28, 252
地理因素 48, 49
全球定位系统 (GPS) 71
图着色算法 246
图数据库 211-213
联系追踪 213-215
岛屿生态学研究 215, 216
图神经网络 (GNN) 19, 173-175
示例,分类拳击网络数据集 176-179
图论 4-6
定义 6
图论术语
与网络科学术语 7
H
赫罗网络 153-158
层次化网络 252
示例,使用基因家族 253, 254
高阶结构 253
网络数据 253
霍尔特-温特斯模型 103
同质性
在网络中 49, 50
聚点 54
人类数据交换 (HDX) 数据集 236
超图 254
信息,显示 255-257
元数据 257
I
igraph
数据,整理成网络 31-37
图像分类 249
K
拳击网络数据集
对象分类,以 GNN 为例 176-179
卡茨中心性 105
L
语言家族 197, 201
语言漂移和关系 201, 202
映射 205-209
尼罗-撒哈拉语言 202-204
语言孤立体 201
拉普拉斯矩阵 88
大型语言模型 (LLMs) 18, 251
隐变量 194
学习率 175
线性回归 102, 235
语言学 197
语言学数据 30
局部莫兰统计 32
M
机器学习 (ML) 163
在网络上 167
曼哈顿距离 211
最大流最小割算法 80-82, 247, 248
最大似然估计 (MLE) 235
最小割集 89
在网络上 ML
基于学生因素的聚类 167, 168
基于学生因素和网络度量的聚类 169, 170
基于友谊网络的谱聚类 171
N
自然语言处理 249
Neo4j 211
网络直径 147
网络度量
扩展,用于时间序列分析 115-119
网络半径 147
网络
在 Python 中创建 8-11
同质性 49, 50
在 167 上 ML
类型 17
网络科学 4-6
用例 18, 19
网络科学术语
与图论术语相对比 7
NetworkX
社交网络示例 37-41
神经网络架构,作为图 249, 250
架构,分析 251
深度学习层和连接 251
神经网络 (NNs) 174
尼罗-撒哈拉语系 202-204
节点 4
NP-hard 247
O
概念学 197-200
信息,表示为 200, 201
本体网语言 (OWL) 200
最佳学生毕业路径
课程排序,分析以找到 187
P
PageRank 中心性 105
偏微分方程 (PDE) 53, 231
路径挖掘 181
路径,到药物成瘾 182
持久同伦 251
系统发育树 202
皮钦语 201
泊松分布 240
预训练的 Transformer 模型 94
Python
网络,创建,8-11
Q
量子计算 245
量子网络科学算法 245, 246
图着色算法 246
最大流最小割算法 247, 248
量子比特系统 245
R
随机森林模型 102
随机图 11-13
现实世界社交网络
示例 13-16
循环神经网络 249
区域连通性 90
ReLU 函数 174
拟繁殖数 (R0) 53
核糖核酸 (RNA) 26
罗曼语族 202
S
无标度网络 12
学校因素数据集 166
基于的聚类 167, 168
半监督学习 (SSL) 算法 171
半监督学习 94
SGD 175
最短路径
应用 71-79
简单有向图 7
简单无向图 7
单纯复形 115
过滤 116
单点故障 (SPOFs) 182
单调谱分析 (SSA) 103
社会互动数据 22, 23
社交网络示例
与 NetworkX 37-41 相关
空间数据 21, 23, 24
空间数据分析 23
空间加权 90
空间时间数据 21, 26, 122
分析 126-135
布基纳法索市场数据集 122, 123
店铺销售数据 123-126
频谱聚类 83, 208
在文本笔记上 94-96
频谱图工具 88, 89
用于聚类生态种群 89-93
股票市场应用 103, 104
结构方程模型 (SEMs) 193, 194
子图中心性 208
叠加 245
监督学习 (SL) 166
供应链物流 66
调查数据 23
易感者-感染者-康复者 (SIR) 模型 145, 146
易感者-感染者-康复者-易感者 (SIRS) 模型 53
易感者-感染者-康复者 (SIR) 模型 53
易感者-感染者-易感者 (SIS) 模型 53
T
时间数据 21, 25, 26, 101-103
时间序列分析
网络度量,扩展至 115-119
时间序列数据 102
时间序列预测 249
交货时间(TTD) 68
转折点 104
变换器模型 18
运输问题 66
燃料成本 68, 69
导航危险 70
商店之间的路径 66-68
交货商品时间 69, 70
旅行商问题 79, 80
三元闭合 140, 141
U
无向图 7
无监督学习 102
无监督学习(UL)方法 164
V
向量 235
顶点 4
基于顶点的中心性度量 105
Vietoris-Rips 复合体 116
W
Watts-Strogatz 模型 12
权重 175
野生动物交互数据集 148
鳄鱼网络 148-153
赫伦网络 153-158
窗口化 107
Z
传播性疾病 230

订阅我们的在线数字图书馆,全面访问超过 7000 本书籍和视频,以及领先的工具来帮助你规划个人发展和职业发展。更多信息,请访问我们的网站。
第十七章:为什么订阅?
-
使用来自 4000 多名行业专业人士的实用电子书和视频,节省学习时间,多花时间编码
-
通过为你量身定制的技能计划提高你的学习效果
-
每月免费获得一本电子书或视频
-
完全可搜索,便于轻松访问关键信息
-
复制粘贴、打印和收藏内容
你知道 Packt 为每本书都提供电子书版本,包括 PDF 和 ePub 文件吗?你可以在packtpub.com升级到电子书版本,并且作为印刷书客户,你有权获得电子书副本的折扣。如需了解更多详情,请联系我们 customercare@packtpub.com。
在www.packtpub.com,你还可以阅读一系列免费的技术文章,订阅各种免费通讯,并享受 Packt 书籍和电子书的独家折扣和优惠。
你可能还会喜欢的其他书籍
如果你喜欢这本书,你可能对 Packt 的这些其他书籍也感兴趣:
动手实践图神经网络 使用 Python
Maxime Labonne
ISBN: 978-1-80461-752-6
-
理解图神经网络的根本概念
-
使用 Python 和 PyTorch Geometric 实现图神经网络
-
使用数百万个样本对节点、图和边进行分类
-
预测和生成逼真的图拓扑结构
-
结合异构源以提高性能
-
使用拓扑信息预测未来事件
-
将图神经网络应用于解决现实世界问题
图 机器学习
Claudio Stamile, Aldo Marzullo, Enrico Deusebio
ISBN: 978-1-80020-449-2
-
编写 Python 脚本来从图中提取特征
-
区分主要的图表示学习技术
-
学习如何从社交网络、金融交易系统、文本分析等中提取数据
-
实现主要的无监督和监督图嵌入技术
-
掌握浅层嵌入方法、图神经网络、图正则化方法等
-
无缝部署和扩展你的应用程序
Packt 正在寻找像你这样的作者
如果你对成为 Packt 的作者感兴趣,请访问authors.packtpub.com并今天申请。我们已与成千上万的开发者和技术专业人士合作,就像你一样,帮助他们将见解分享给全球技术社区。你可以提交一般申请,申请我们正在招募作者的特定热门话题,或者提交你自己的想法。
分享你的想法
您已经完成了《使用 Python 的现代图论算法》,我们很乐意听听您的想法!如果您从亚马逊购买了本书,请点击此处直接转到本书的亚马逊评论页面并分享您的反馈或在该购买网站上留下评论。
您的评论对我们和科技社区非常重要,并将帮助我们确保我们提供高质量的内容。
免费下载本书的 PDF 副本
感谢您购买本书!
您喜欢在路上阅读,但无法携带您的印刷书籍到处走吗?
您购买的电子书是否与您选择的设备不兼容?
别担心,现在每购买一本 Packt 书籍,您都可以免费获得该书的 DRM 免费 PDF 版本。
在任何地方、任何设备上阅读。直接从您最喜欢的技术书籍中搜索、复制和粘贴代码到您的应用程序中。
优惠不止于此,您还可以获得独家折扣、时事通讯和每日收件箱中的精彩免费内容。
按照以下简单步骤获取好处:
- 扫描二维码或访问以下链接

packt.link/free-ebook/9781805127895
-
提交您的购买证明
-
就这样!我们将直接将您的免费 PDF 和其他好处发送到您的电子邮件
目录
-
使用 Python 的现代图论算法
-
序言
-
贡献者
-
关于作者
-
关于审稿人
-
前言
-
本书面向的对象
-
本书涵盖的内容
-
充分利用本书
-
下载示例代码文件
-
使用的约定
-
联系我们
-
分享您的想法
-
免费下载本书的 PDF 副本
-
-
第一部分:带示例的图和网络简介
-
第一章:什么是网络?
-
技术要求
-
图论和网络简介
-
形式定义
-
在 Python 中创建网络
-
随机图
-
-
现实世界社交网络的例子
-
其他类型的网络
-
网络科学的先进用例
-
摘要
-
参考文献
-
-
第二章:使用 NetworkX 和 igraph 将数据整理成网络
-
技术要求
-
不同数据源导论
-
社交互动数据
-
空间数据
-
时间数据
-
生物网络
-
其他类型的数据
-
-
使用 igraph 将数据整理成网络
-
使用 NetworkX 的社交网络示例
-
总结
-
参考文献
-
-
第二部分:空间数据应用
-
第三章:人口数据
-
技术要求
-
人口学导论
-
人口因素
-
地理因素
-
网络中的同质性
-
-
法语非洲音乐传播
-
AIMS 喀麦隆学生网络流行病模型
-
总结
-
参考文献
-
-
第四章:交通数据
-
技术要求
-
运输问题导论
-
商店之间的路径
-
燃料成本
-
送货时间
-
导航危险
-
-
最短路径应用
-
旅行商问题
-
最大流最小割算法
-
总结
-
参考文献
-
-
第五章:生态数据
-
技术要求
-
生态数据导论
-
探索跨地理区域追踪动物种群的方法
-
探索捕捉植物分布和疾病的方法
-
-
谱图工具
-
使用谱图工具聚类生态种群
- 文本笔记上的谱聚类
-
总结
-
参考文献
-
-
第三部分:时间数据应用
-
第六章:股市数据
-
技术要求
-
时间数据简介
- 股票市场应用
-
中心性度量简介
-
跨时间切片的中心性度量应用
-
扩展网络度量以进行时间序列分析
-
摘要
-
参考文献
-
-
第七章:商品价格/销售数据
-
技术要求
-
时空数据简介
-
布基纳法索市场数据集
-
存储销售数据
-
-
分析我们的时空数据集
-
摘要
-
参考文献
-
-
第八章:动态社会网络
-
技术要求
-
随时间变化的社会网络
-
友谊网络
-
三角闭合
-
-
深入探讨网络上的传播
-
动态网络简介
-
SIR 模型,第二部分
-
影响传播的因素
-
-
具有动态野生动物交互数据集的示例
-
鳄鱼网络
-
赫伦网络
-
-
摘要
-
参考文献
-
-
第四部分:高级应用
-
第九章:网络机器学习
-
技术要求
-
友谊网络和友谊关系数据集简介
-
友谊网络简介
-
友谊人口统计和学校因素数据集
-
-
网络上的机器学习
-
基于学生因素的聚类
-
基于学生因素和网络度量的聚类
-
在友谊网络上的谱聚类
-
-
网络上的深度学习
-
GNN 简介
-
示例 GNN 对 Karate 网络数据集进行分类
-
-
摘要
-
参考文献
-
-
第十章:路径挖掘
-
技术要求
-
贝叶斯网络和因果关系路径简介
-
贝叶斯定理
-
因果关系路径
-
贝叶斯网络
-
-
教育路径示例
-
教育成果
-
课程序列
-
成功的前因
-
-
分析课程序列以找到最佳学生毕业路径
-
数据集简介
-
bnlearn 分析
-
结构方程模型
-
-
总结
-
参考文献
-
-
第十一章:语言家族的映射 – 奥托伦方法
-
技术要求
-
什么是本体?
-
本体论简介
-
将信息表示为本体
-
-
语言家族
-
语言漂移和关系
-
尼罗-撒哈拉语言
-
-
映射语言家族
-
总结
-
参考文献
-
-
第十二章:图数据库
-
图数据库简介
-
什么是图数据库?
-
在图数据库中可以表示什么?
-
-
在 Neo4j 中查询和修改数据
-
基本查询示例
-
更复杂的查询示例
-
-
总结
-
参考文献
-
-
第十三章:整合一切
-
技术要求
-
问题简介
-
刚果民主共和国埃博拉疫情 - 2018-2020 爆发
-
地理和物流
-
-
GEE 简介
-
GEE 的数学
-
我们的问题和 GEE 公式
-
-
数据转换
-
Python 数据处理
-
GEE 输入
-
-
数据建模
- 在 Python 中运行 GEE
-
总结
-
参考文献
-
-
第十四章:新领域
-
量子网络科学算法
-
图着色算法
-
最大流/最小割
-
-
神经网络架构作为图
-
深度学习层和连接
-
分析架构
-
-
分层网络
-
高阶结构和网络数据
-
使用基因家族的示例
-
-
超图
-
显示信息
-
元数据
-
-
摘要
-
参考文献
-
-
索引
- 为什么订阅?
-
你可能喜欢的其他书籍
-
Packt 正在寻找像你这样的作者
-
分享你的想法
-
免费下载此书的 PDF 副本
-
标记
-
封面
-
目录
-
索引


浙公网安备 33010602011771号