­

Network Science with Python With NetworkX

  • 2020 年 5 月 6 日
  • AI

第1章,什么是网络?概述了网络科学和社会网络分析的历史,并介绍了常见的网络类型,并指导您使用NetworkX编写第一个程序。

第2章,在NetworkX中使用网络,介绍简单,定向和加权的网络,以及如何在NetworkX中使用它们。

第3章,从数据到网络,介绍了用于加载网络数据和从头开始创建网络的功能。

第4章,附属网络,重点介绍具有两种类型的节点(例如组和组成员)的网络,并说明如何在NetworkX中使用这些网络,以及如何将它们转换为仅具有一种类型的联合网络。的节点。

第5章,小型节点和中心,展示了如何使用NetworkX通过查看各个节点及其连接的属性来分析网络结构。

第6章,描述网络概述,介绍了几种用于对整个网络的结构进行分类的度量,并说明了这些度量如何区分不同类型的实际网络。

第7章,在社区之间,讨论了中等规模的网络结构,包括社区检测,集团检测和k核。

第8章,社交网络和病毒式传播,着重介绍将网络科学应用于社交网络时出现的特殊注意事项,以及社交网络的属性如何影响诸如疾病或创新之类的传染病的传播。

第9章,仿真和分析,介绍了用于基于基本假设生成网络的几种模型,以及如何使用基于代理的模型来模拟网络系统的演进。

第10章“时空网络”涵盖与地理位置相关的网络数据以及随时间变化的数据的特殊注意事项。

第11章,可视化,介绍了NetworkX提供的几种可视化功能,以及如何使用它们有效地可视化网络信息。

第12章,总结,总结了整本书中汲取的教训,并提供了用于追求网络科学更高级主题的资源

很多基础知识没啥可介绍的,主要记录一些我觉得比较需要留意的或者是之前不了解的。感兴趣的可以去百度上搜这本书,资源挺多的。

关于edges可能需要关注的是:

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

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

在相似性网络中,连接的描述更少,更抽象。 边权重对应于两个节点的相似程度,通常不为0。 例如,可以通过拍摄前10名最喜欢的在线猫视频并使用对两个人都显示的视频比例来计算不同人之间的一种相似性。 在这种情况下,边权重与两个人是否有任何关系无关。 连接两个甚至从未见过的人,很有可能会获得很高的权重!

边也可以表示距离(或接近度),尤其是当节点表示空间位置时。 使用边权重表示距离时,可以通过将沿路径的所有边权重相加来计算整个行程的距离。 使用边权重表示距离有时可能会造成混淆,因为数量较大意味着连接较弱,并且不存在的边实际上是权重无限的边。 有时,使用接近度(例如距离的倒数)可能更直观,尽管这会使跨许多边的路径的工作变得复杂。 前面的示例涵盖了网络的许多常见应用,但绝不是全部。 每当一组事物之间可以具有任何类型的关系或连接时,就有可能使用网络捕获这些连接的结构。下面是一些代码示例,感觉还是直接上代码有用啊:(这些代码上github都有的)


无向图:

# Configure plotting in Jupyter
from matplotlib import pyplot as plt
%matplotlib inline
plt.rcParams.update({
    'figure.figsize': (7.5, 7.5),
    'axes.spines.right': False,
    'axes.spines.left': False,
    'axes.spines.top': False,
    'axes.spines.bottom': False})
# Seed random number generator
import random
from numpy import random as nprand
seed = hash("Network Science in Python") % 2**32
nprand.seed(seed)
random.seed(seed)
# Import networkx
import networkx as nx
G = nx.karate_club_graph()
karate_pos = nx.spring_layout(G, k=0.7)
plt.figure(figsize=(15,15))
nx.draw_networkx(G, karate_pos)
G = nx.karate_club_graph()
karate_pos = nx.spring_layout(G, k=0.3)
plt.figure(figsize=(15,15))
nx.draw_networkx(G, karate_pos)

分别得到关于无向graph的nodes、edges和领结矩阵adj的信息,networkx内部使用的是python的dict来实现图数据结构的,官网称之为dict-of-dict-of-dict。

对字典熟悉的人来说,使用networkx的这种图数据的构成机制会比较得心应手,像呼吸一样自然。

有向图:

有向图增加了两个额外的方法,successors表示A节点指向的其它节点,predecessors表示指向A节点的其它节点。

除此之外还有多边图,即node之间的边不止一条:

# The seven bridges of Königsberg
G = nx.MultiGraph()
G.add_edges_from([
    ("North Bank", "Kneiphof", {"bridge": "Krämerbrücke"}),
    ("North Bank", "Kneiphof", {"bridge": "Schmiedebrücke"}),
    ("North Bank", "Lomse",    {"bridge": "Holzbrücke"}),
    ("Lomse",      "Kneiphof", {"bridge": "Dombrücke"}),
    ("South Bank", "Kneiphof", {"bridge": "Grüne Brücke"}),
    ("South Bank", "Kneiphof", {"bridge": "Köttelbrücke"}),
    ("South Bank", "Lomse",    {"bridge": "Hohe Brücke"})
])

关于有向和无向的原始数据的形式应该如何存放后面会提到,其实是一样的,非常简单,并且非常容易结合到pandas和numpy中。

节点和边的属性,通过graph[node_name/edge_name]就可以赋值了,用起来贼简单,赋值也是以字典的形式,比如graph[1]={‘color’:’red’}意为为节点1赋予一个color的attribute,值为‘red’,如果是边则需要指定两个节点,比如节点1和节点2之间的边,则:graph[1,2,’color’]=’red’


下面介绍比较重要的,表格形式数据如何load 进networkx中:

这里的example文件实际上就是一个普通的表格文件,其内部结构如下:

实际上就是一个普通的表格数据,左右两列分别是有连接的节点,显然,这种简单的数据形式只能表示最简单的无向无权图。实际上通过pandas的dataframe我们也可以方便的转化为图数据的形式,具体的做法如下:

首先原始数据文件保存为标准的csv形式,否则pandas读取的时候会把原始的注释数据都加载进来;然后正常读取即可

path='example_pd.edgelist'
dataframe=pd.read_csv(path,sep=' ',header=None)
dataframe

然后我们通过:

将dataframe转换为图数据的形式:

# Read edge list
G = nx.from_pandas_edgelist(
    dataframe,source='source',target='target',edge_attr=None,
    create_using=nx.Graph)
# Draw network
nx.draw_networkx(G, pos, arrowsize=20)
plt.gca().margins(0.15, 0.15)

官网上也给了一个非常简单易懂的例子:

实际上这是非常灵活的,我们需要指定dataframe中的两列为相互存在连接关系的节点,一列用于指定节点之间的边的权重,其它的列可以用作属性列也可以不用,这样我们可以通过dataframe非常方便迅速的构建起用于图算法的图数据形式。这种方式用于构建有向图是很方便的,默认左边是源节点右边是目标节点,即方向是按照左到右的顺序排列的,我们在参数source和target中更换列名即可,如果是无向图更简单,都不用care source和target的顺序。

如果是有权图,则原始数据需要是这种形式的:

同样,按照dataframe的方式很好构建出来,这里就不废话了。主要麻烦的地方在于如何构建起这种形式的dataframe,其实也不复杂,我们通过join的功能就可以很easy的构建出这种形式的数据了,当然,对于中小型数据来说,这种方式是可行的,对于大型的数据来说,还是用图数据库更加高效一些。

除此之外,还可以通过领接矩阵的方式来构建图:

除了pandas之外,networkx还支持以不同的数据形式导入图的数据,包括:

具体的官方文档已经给了非常容易上手的解释了:

Converting to and from other data formatsnetworkx.github.io

这里不赘述了;


数据格式转换的问题处理完毕了,接下来就是一些basic的图算法的应用了,根据api来调用,非常简单,如果networkx底层的性能做优化就太好了;

考虑到还有不少图算法没有研究透彻,所以打算后面单独总结一下,以networkx的内置图算法为主。igraph和graphx后面慢慢整进来吧,graphx+neo4j的模式学起来还得多费点时间真是烦死了