Complex Network Analysis in Python简介:https://www.oreilly.com/library/view/complex-network-analysis/9781680505399/
代码下载:https://pragprog.com/titles/dzcnapy/complex-network-analysis-in-python/
文章目录
前言
1. 看待网络的艺术.
第一部分 基本的网络元素和工具.
2. 调查复杂网络分析的工具
3. 介绍NetworkX
创建一个图
import networkx as nx
#创建Undirected graphs
G = nx.Graph()
#创建Directed graphs
G = nx.DiGraph()
#创建Multigraphs
G = nx.MultiGraph()
#创建directed multigraphs
G = nx.MultiDiGraph()
NetworkX有三种增加nodes和edges的方式:one by one, from a list or another graph。
G = nx.Graph([("A", "eggs"),])
##增加nodes
G.add_node()
G.add_nodes_from([])
##增加edges
G.add_edge()
G.add_edges_from()
##删除nodes
G.remove_node()
G.remove_nodes_from([])
##删除edges
G.remove_edge()
G.remove_edges_from()
查看Edge和Node的列表。G.node和G.edge分别以字典的形式存储所有的节点和边。
##返回字典形式的nodes或edges
print(G.node)
print(G.edge)
##返回列表形式的nodes或edges
print(G.nodes())
print(G.edges())
print(G.nodes(data=True)) ##返回有额外属性字典的列表
print(G.edges(data=True))
从CSV文件中读取一个网络。
import networkx as nx
import matplotlib.pyplot as plt
import dzcnapy_plotlib as dzcnapy
import csv
with open("nutrients.csv") as infile:
csv_reader = csv.reader(infile)
G = nx.Graph(csv_reader)
print(G.nodes())
#output: ['A', 'carrots', 'eggs', 'fatty fish', 'green leafy vegs', 'liver', 'milk', 'tomatoes', 'B12', 'B6', 'asparagus', 'beans', 'kidneys', 'potatoes', 'C', 'pumpkins', 'Ca', 'broccoli', 'cheese', 'Cu', 'nuts', 'whole grains', 'D', 'mushrooms', 'E', 'seeds', 'Mn', 'legumes', 'wheat', 'Se', 'Zn', 'beef', 'riboflavin', 'niacin', 'folates', 'spinach', 'poultry', 'shellfish', 'thiamin', 'veg oils', 'yogurt']
##去除self-loop
loops = nx.selfloop_edges(G)
G.remove_edges_from(loops)
##将所有node names大写,并且
mapping = {node: node.title() for node in G if isinstance(node, str)}
nx.relabel_nodes(G, mapping, copy=False)
print(G.nodes())
##给边增加权重
G.add_weighted_edges_from([("Honey", "Zn", 0.01), ("Honey", "Sugar", 0.99)])
##改变已知节点和已知边的权重
nx.set_node_attributes(G, att_name, node_dict)
nx.set_edge_attributes(G, att_name, edge_dict)
##直接使用字典的方法改变属性
G.node["Zn"]["nutrient"] = True # Zinc is a nutrient
G.edge["Zn"]["Beef"]["weight"] = 0.95 # Zinc and beef are well connected
##删除属性
del G.node["Zn"]["nutrient"]
del G.edge["Zn"]["Beef"]["weight"]
使用Matplotlib可视化一个网络。网络的可视化包括两个节点:布局和渲染。
布局阶段:确定几何位置,Networks的布局算法包括:Random,Circular, Shell, Spectral(频谱的), Force-directed。
渲染阶段:NetworkX绘制节点、标签和边,使用默认或者特定的shapes, fonts, and colors。
dzcnapy.set_extent(pos, plot) ##该函数调整网络中节点的位置pos到可以绘制的plot中。
导出和导入网络:
nx.read___() ##接收一个存在的文件名或者打开的文件句柄,返回一个Graph对象。
nx.write___() ##接收一个Graph对象,以及一个存在的文件的名字或者打开的文件句柄。
4. 介绍Gephi
5. 案例研究:构建Wikipedia页面的网络
##去除重复
nx.contracted_nodes(F,u,v)
##删除loop中每个节点的属性
del n["contraction"]
##修剪网络
F.degree() ##返回一个字典,网络的nodes作为keys, degrees作为values.
nx.subgraph(F, core) ##收集F中所有核心nodes和连接它们的边,构建一个新的图G——F的子图。
##探索网络
G.in_degree() ##返回入度的字典。
G.out_degree() ##返回出度的字典。
第二部分 基于明确关系的网络
6. 理解社会网络
本章,你将学习社会网络的分类和它们的边。你将了解弱边和强边在信息传播和保存中的作用,以及中心性措施的重要性。最后,您将合成网络有一个大致的了解,并了解人们为什么需要它们。
7. 掌握先进的网络构造
复杂网络很少一次构建一个节点和一条边。相反,他们产生自矩阵数据、边列表、节点字典或概率分布,以及其它python或第三方数据结构。
邻接矩阵(Adjacency Matrix) A是一个NxN的矩阵,其中N是要定义的图的大小。行和列分别代表着source和target。
##遍历每个矩阵元素两次(通过行和通过列),提取所有非零元素。
G.add_edges_from(edges)
##使用NumPy将列表的列表转化为2D矩阵,给NetworkX网络类型的提示。
A_mtx = np.matrix(A)
G = nx.from_numpy_matrix(A_mtx, create_using = nx.DiGraph())
##逆向转化:将图转化为NumPy 2D矩阵
B_mtx = nx.to_numpy_matrix(G) # Produces a NumPy 2D matrix
##将matrix转化为列表的列表
B_lst = B_mtx.tolist()
迄今为止最通用的是NetworkX和Pandas之间的连接。如果你想要的采用回归、预测、分类等通用的数据科学方法进行复杂网络的分析,你必须要注意NetworkX和Pandas之间的连接。
##重新命图的节点,使得有合理的解释
nx.relabel_nodes(G, dict(enumerate(labels)), copy=False)
##将图转化为pandas dataframe结构
df = nx.to_pandas_dataframe(G)
##从pandas dataframe构建图
##nx.from_pandas_dataframe()的第一个参数是DataFrame, 每一行定义一条边(source, target, weight)
G = nx.from_pandas_dataframe(df, "from", "to", edge_attr=["weight"])
##通过pandas的方式处理节点属性
lincoln_ser = pd.DataFrame(node_data).set_index(0)[1]
df = lincoln_ser.apply(pd.Series)
关联矩阵(Incidence Matrix)J 是一个矩形 的NxM的矩阵,其中N是节点的数量,M是边的数量。J[i,j]的值为1,意味着节点i附属于边j。不同于邻接矩阵,关联矩阵允许并行边。但是关联矩阵也有弱点:权重网络不能表示,典型复杂网络的关联矩阵有更大的内存足迹相比相同的邻接矩阵。
J = nx.incidence_matrix(G, oriented=True).todense()
##函数nx.incidence_matrix(G)返回图G的关系矩阵,也称为稀疏矩阵。
##oriented=True用于区分开始和结束节点。
##oriented=True可以将稀疏矩阵转化为稠密矩阵。
处理使用矩阵,NumPy和Pandas在你的代码和NetworkX网络之间移动数据。你还可以使用边列表和节点字典。
边列表是一个3元组,包括开始节点、结束节点和边属性的字典。
##从现存网络中获取边列表, G.edges(data=True)和nx.to_edgelist()的返回值是相同的。
nx.to_edgelist()
##将边列表输入网络
nx.from_edgelist()
##判断两个图是否相等(数学图论中称为isomorphism)
print(nx.is_isomorphic(F, G))
##节点列表的字典:图中的所有节点是keys, 邻近节点的列表是values。
##使用nx.to_dict_of_lists()获取列表的字典
dict_list = nx.to_dict_of_lists(G)
##从字典列表重新构建图
F = nx.from_dict_of_lists(dict_list, create_using=G)
nx.is_isomorphic(F, G)
网络切片:去掉低权重的边。
slice_network(G, T, copy=True)
8. 度量网络
本章开始聚焦复杂网络分析,介绍一些复杂网络分析的工具集。你将学习如何度量网络节点的dyadic, triadic, global属性: distances, loops, clustering coefficient, assortativity以及一系列的centralities。你将学习如何识别最中心的节点,并描述它们的重要性。你将能够锁定局部密度和属性一致性不同的网络区域。
(1)从全局度量开始
##统计网络的节点数量或边数量。
len(G) ##Number of nodes;
len(G.node)
len(G.nodes()
nx.number_of_nodes(G)
len(G.edge())
len(G.edges()) ##Number of edges
nx.number_of_edges(G)
##网络密度:存在的边占所有可能的边的比例。
nx.density(G)
(2)探索邻居
邻居们反映了网络的局部属性。
##Networks有两种机制计算邻域。
##使用图的隐式字典表示。节点名是键,相邻的节点字典是值。
alters1 = G[ego]
print(alters1)
print(len(alters1))
##使用nx.all_neighbors()函数,该函数返回一个你可以转化为列表的生成对象。
alters2 = list(nx.all_neighbors(G, ego))
print(alters2)
print(len(alters2))
##获取以自我为中心的网络图
egonet = nx.ego_graph(G, ego)
##计算聚类系数:衡量以自我为中心的网络中三角形的流行程度。
nx.clustering(G, nodes=None)
##计算简单网络所有节点的平均聚类系数(无环路、无定向或平行边)。
acc = nx.average_clustering(nx.Graph(G))
(3)从路径的角度思考
Walk: edges的序列,使得一条边的结束总是另外一条边的开始,除了第一条边和最后一条边可能值连接一端。
Trail: 不使用同一条边两次的walk。在同一节点开始和结束的轨迹称为循环(即cycle)。
Path: 从不访问同一个节点两次的Trail。
#返回节点u和v之间所有最短路径的生成器
path_gen = nx.shortest_simple_paths(G, ego, "Agent Based Model")
#next()用于一次获取一条路径。
next(path_gen)
##只返回source和target之间的一条最短路径。
nx.shortest_path(G,source=None,target=None)
path = nx.shortest_path(G, ego, "Agent Based Model")
##节点偏心率:衡量节点离中心多远(或多近)。
ecc = nx.eccentricity(nx.Graph(G))
print(ecc[ego])
相关定义:
①diameter:网络的直径是最大偏心率。
②radius:网络半径是最小偏心率。
③center:网络的中心是所有节点的集合,其偏心率等于半径。
④periphery:网络的外围是一组偏心率等于直径的所有节点。
(4)选择适当的中心性(Centralities)
①度中心性(Degree Centrality):度中心性是局部的,只依赖于节点邻域。
②紧密与调和紧密中心性(Closeness and Harmonic Closeness Centrality)
Closeness Centrality:某个节点到达其他节点的难易程度,也就是到其他所有结点距离的平均值的倒数。
Harmonic Closeness Centrality: 到其他所有节点的倒数的平均值(mean reciprocal distance)。
③中介中心性(Betweenness Centrality):度量通过一个节点的所有可能测地线的比例。
④特征向量中心性(Eigenvector Centrality):数学上,节点的特征向量中心度是邻居的特征向量中心度之和除以λ——网络邻接矩阵的最大特征值。
注意:PageRank和HITS 都是基于类似于特征向量中心性的递归原理。
nx.pagerank() ##该函数将首先通过用一对有向边替换每个无向边来将其转换为有向图。
⑤HITS Hubs and Authorities
HITS(超链接诱导主题搜索)算法是PageRank的扩展版本。 G.reverse()
可反转图形。
dgr = nx.degree_centrality(G)
clo = nx.closeness_centrality(G)
har = nx.harmonic_centrality(G)
eig = nx.eigenvector_centrality(G)
bet = nx.betweenness_centrality(G)
pgr = nx.pagerank(G)
hits = nx.hits(G)
centralities.corr()计算中心之间的所有成对相关性,并返回一个8×8的对称的Dataframe。
np.tri()生成一个适当大小的左下角三角形单元矩阵,并通过逐个乘以Dataframe和掩码矩阵元素来屏蔽副本。
(5)通过协调性评估网络一致性
具有正相关属性的网络称为协同网络(assortative);在分类网络中,节点倾向于连接到具有相似属性值的节点 。这种趋势被称为分类混合。分离(负相关)网络与分类网络相反。
##nx.average_degree_connectivity(G),返回一个字典,特定节点的度为keys, 邻居节点的度为values。
my_degree, their_degree = zip(*nx.average_degree_connectivity(G).items())
##nx.attribute_mixing_matrix(),获取一个图形、一个属性名和一个可选的映射字典,并返回一个二维NumPy数组。
nx.attribute_mixing_matrix(G, "gender", mapping={"M": 0, "F": 1})
##nx.attribute_assortativity_coefficient(),返回协同系数,即属性的值在边之间的相关性。
nx.attribute_assortativity_coefficient(G, "gender")
9. 研究案例:Panama Papers
在本章中,您将学习如何将描述实体和officials之间联系的巨大CSV文件转换成社交网络。你会用两种方式来做:使用和不使用Pandas。您还将学习如何对结果网络做出简单的结论。
(1)构建Entities和Officers的网络
(2)绘制网络
(3)分析网络
(4)使用Pandas构建一个“Panama”网络
第三部分 基于共现的网络
10. 构建语义和产品网络
共生网络中的边是隐含的:它们不是给定的(并且往往甚至不明显);你必须从其他数据中推导、提取和计算它们,这与你建立社交网络的相对直观的方式有很大的不同。
在本章中,您将学习如何从看似奇怪的物质或非物质项目集合开始,检查它们之间的时间和空间联系,确定重要的关系,并将您的观察结果转换成网络图。就像社交网络图一样,这些图有各自属性的节点和边,但这次你将更进一步,探索它们复杂的内部结构。你将能够划分和征服一个复杂的网络:将其分解成组件、核心、冠状、社区和类似的结构元素;为提取的部分指定专有名称;理解它们的目的和重要性;再把它们放在一起。
我们先来看两个共现网络的例子:语义网络和产品网络。在接下来的章节中,我们将讨论复杂网络成分的定义、提取、命名和使用。
(1)语义网络
(2)产品网络
11. 挖掘网络结构
本章,你将学习如何将原始的复杂网络分解成各种大小、性状和类型的组成部分:isolates, connected components, cliques, communities, and k-cores, 仅举几例。您将理解网络分析工作流程中每种成分的功能和位置。最后,您将获得一些关于命名提取成分的建议,因为根据经验,您不能成功地使用没有名称的东西。换句话说,您将准备好分而治之和征服复杂网络。
(1)Locate Isolates
isolate: 不与其他任何节点连接的节点,任何网络最小的区分元素。
(2)Split Networks into Connected Components
Connected Components: 连接的组件是网络节点的子集,因此存在从该子集中的每个节点到同一子集中的任何其他节点的路径。
(3)Separate Cores, Shells, Coronas, and Crusts
社交网络由两组节点组成:核心节点(或多或少紧密相连的节点)和外围节点(与核心节点紧密相连,但与其他外围节点的连接很弱)。
传统的社会网络分析通过模糊定义的块模型(fuzzily defined blockmodeling)攻击核心-外周分解(core-periphery decomposition)。另一方面,我们将引入一个更严格的节点数学分类开始,分为四类:核心、外壳、冠状物和结壳。
Cores(核): k-core是原始网络的子图,使得子图中每个节点至少有k个邻居。
Crusts(外壳): k-crust是当我们去掉k-core时,原始网络剩下的部分。换句话说,Crust就是外围。
Corona(冕): k-corona是k-core的子图,其中每个node都恰好有k个邻居。
Shell(外壳): k-shell是在k-core中存在但是在(k+1)-core中不存在的nodes集合。
(4)Extract Cliques
clique(团): 确切的说,k-团是k个节点的子集,使得每个节点之间连接团中每个其他节点。因此团也被称为完全子图(complete subgraphs)。
cliques和connected components之间的主要区别在于,团中任意两个节点之间的路径长度必须为1;而在组件中,路径长度仅受图直径的限制。
A maximal clique(最大团):最大团是不能通过增加另一个节点而成为(k+1)团的k团。因为将任何其他节点包含在其中都会使完全连通性属性失效。
(5)Recognize Clique Communities
(6)Outline Modularity-Based Communities
复杂网络中最模糊、最灵活的节点组织形式是基于模块化的网络社区。它们有时也被称为集群(clusters)或群体(groups),不要与小团体社区(clique communities)混淆。
模块community使用louvain算法,优化网络模块。发现的社区表示为一个分区:一个字典,节点标签作为keys, 整数社区标识符作为值。该模块还计算分区相对于原始网络的模块化程度。
part = community.best_partition(G)
community.modularity(part, G)
##用合成节点替换大型网络的较小结构元素,并构建一个归纳图
induced = community.induced_graph(part, G)
induced.nodes()
induced.edges()
(7)Perform Blockmodeling
最大团块或社区图的构建是块建模(blockmodeling)的一个特例——根据一些有意义的等价定义进行分组,并用合成的“超节点”来替换它们。
(8)Name Extracted Blocks
从数据科学的角度来看,宏观层面的网络分析(communities、cliques和其他结构块的提取)是unsupervised machine learning的一个例子。无监督机器学习的目标是在没有“标签”的情况下推断网络的隐藏结构:节点和边缘属性(也许除了边缘权重)。
block的命名有三种思路:
①使用你的智能:查看单个节点标签并进行归纳。
②雇佣大量主题专家——或者某种专家。
③从数据中生成块标签。
12. 案例研究:进行文化领域分析
文化领域分析(CDA)是对群体中的人们如何思考以某种方式联系在一起的术语列表以及这种思考在群体之间如何不同的研究。
不管你的背景如何,你都将学习如何从一个流行的博客网站获取语义数据,并将其缓存在本地,以便进一步有效地访问。您将看到如何将自然语言单位转换为术语,并构建、分析和解释反映CBS电视节目《好妻子》粉丝兴趣的语义网络。希望你能把同样的方法扩展到其他节目、其他网站和其他标签库。
本案例研究的完整代码可在文件lj.py.中找到。
(1)Get Terms
(2)Build the Term Network
(3)Slice the Network
(4)Extract and Name Term Communities
(5)Interpret the Results
13. 案例研究:从产品到项目
产品网络分析的目标之一是识别共同购买或共同推荐产品的重要集合。我们可以将这些集合视为“客户项目”或“工具集”。您可以找到这些经常一起购买或推荐在营销、广告和类似商业领域一起使用的产品网络。
作为产品网络分析的例子,我们来看看丝芙兰销售的化妆品。在本案例研究中,您将学习如何在csv、itertools和collections库的帮助下,将包含化妆品共同购买数据的CSV数据文件转换为复杂的网络。您将计算复杂网络的属性分类度,并对其进行分块建模,以诱导图的形式构建其高级表示。最后,您将使用graphviz_layout()在不调用任何非Python软件的情况下生成网络图片。
(1)Read Data
(2)Analyze the Networks
(3)Name the Components
第四部分 释放相似性
14. 基于相似性的网络
复杂网络很少有清晰的结构来显示两个节点是否毫无疑问地连接在一起。节点也不总是同质的。然而,有时两个项目是相似的,作为一个复杂的网络分析师,您需要一个工具集来量化它们的相似性,并将相似性转换为网络中的边。
在本章中,您将学习(或更新您的知识)几种相似性度量:Hamming distance, Manhattan distance, Pearson correlation, cosine distance, and generalized similarity。您将熟悉几个基于相似性的真实世界网络。
(1)Understand Similarity
基于相似性的网络产生于网络节点所代表的对象的一个或多个属性的相似性。对象的类型和属性的数量只受到网络研究者的创造力的限制。
任何相似性的量化度量都有两个方面:度量什么,如何度量。
事件网络是基于相似性的网络,其中节点代表正式或非正式的社交事件(书友会、政治集会、学术会议、摇滚音乐会等),而边缘描述它们的相似性。
(2)Choose the Right Distance
所有的相似性度量都是数值的(通常介于-1到1之间或者0到1之间),所以你必须在计算相似度前量化任何定性的属性。一旦量化,属性可以被认为是多维坐标空间中对象的坐标,其中维数等于属性的数量。您可以将对象视为空间中的一个点,其位置由属性定义。两个物体之间的相似性和代表物体的点之间的距离是互补的;距离越大,相似性越小,反之亦然。
现在让我们来看看一些典型的距离和相似性度量。
①Hamming Distance(汉明距离)
两个对象之间的汉明距离是一个对象中存在但另一个对象中不存在的特征数除以最大特征数。相反,相似性是两个对象中共同存在或不存在的特征的数量(同样,除以特征的最大数量)。如果两个对象具有相同的一组特征,则它们比特征不同的两个对象更相似。
②Manhattan Distance(曼哈顿距离)
下图比较了曼哈顿距离和欧拉距离。
③Euclidean Distance(欧几里得距离)
在数学中,欧几里得距离或欧几里得度量是欧几里得空间中两点间“普通”(即直线)距离。使用这个距离,欧氏空间成为度量空间。相关联的范数称为欧几里得范数。较早的文献称之为毕达哥拉斯度量。
④Cosine Distance(余弦距离)
简单来说,余弦相似度,就是计算两个向量间的夹角的余弦值。
余弦距离就是用1减去这个获得的余弦相似度。
由上面的余弦距离可以知道,余弦距离的取值范围为[0,2] ,这就满足了非负性的性质。
⑤Pearson Correlation(皮尔逊相关系数)
余弦相似公式高估了相似性,不一定可取。皮尔逊相关性的计算公式与余弦相似度的计算公式类似,不同之处在于属性向量首先通过减去平均值mean(x)。
参考:如何理解皮尔逊相关系数(Pearson Correlation Coefficient)?
相关结论:
①Pearson相关性系数与Cosine Similarity在数据被标准化后等价。
②Pearson相关性系数和欧式距离方在标准化数据下等价。
③Cosine相似度和欧氏距离方在标准化数据下等价。
⑥Generalized Similarity(广义相似性)
广义相似性是一种度量二分网络中节点相似性的强有力的递归技术。我们需要学习更多关于二分网络的知识来欣赏它,广义相似度的计算将在第181页介绍。
15. 利用二分网络
二分网络,也称为双模网络,是一种表示属于两个或多个类别或部分(如学生和教授或航空公司和机场)的项目之间关系的机制。本书之前看到的很多网络都是二分的。
在本章中,您将学习如何检查网络是否是二分网络,将节点分配给相应的部分,并将加权或未加权的二分网络转换为加权的单分网络(后一种操作称为“投影”, projection)。
(1)Work with Bipartite Networks Directly
不同类型的中心性、路径、核心、派系、基于模块化的社区,以及二分网络的其他度量和结构元素可能类似地无法比较,甚至毫无意义。
##检查网络G是否为二分网络, nx.is_bipartite(G)。
from networkx.algorithms import bipartite ##很多二分函数来自nx.algorithm.bipartite。
N = pickle.load(open("nutrients.pickle", "rb"))
print(bipartite.is_bipartite(N))
##bipartite.sets()可以将二分网络的节点分成两部分,返回两个node sets。
bip1, bip2 = bipartite.sets(N)
print("C" in bip1, "C" in bip2)
##networkx.algorithms.bipartite提供了一系列函数可用于二分网络的分析。
bipartite.density()
bipartite.degrees()
bipartite.clustering()
bipartite.closeness_centrality()
bipartite.degree_centrality()
bipartite.betweenness_centrality()
(2)Project(投影) Bipartite Networks
你可以使用两种方式来投影一个二分网络:保留第1部分的节点并移除第2部分的节点,反之亦然。投影中幸存的节点被称为“底部”节点;被移除的节点被称为“顶部”节点。
投影操作通过将G投影到底部节点,将原始二分图G转换成诱导图F。图F只包含底部节点,F中的两个底部节点彼此相邻,当且仅当它们与G中同一个顶部节点相邻。
## bipartite.projected_graph((G,nodeset))函数将二分图G投影到节点nodeset上。
n_graph = bipartite.projected_graph(N, nutrients)
f_graph = bipartite.projected_graph(N, foods)
## bipartite.weighted_projected_graph(G,nodeset,ratio)函数为诱导的边分配强度,反映连接强度。
fw_graph = bipartite.weighted_projected_graph(N, foods, True)
(3)Compute Generalized Similarity
广义相似性(“Generalized similarity”)将两个底部节点视为相似的,如果它们跟相似的顶部节点邻接。但是谁来决定顶部节点的相似性呢?它是广义相似性本身的自反定义:如果两个顶部节点与相似的底部节点相邻,则它们是相似的。事实上,计算广义相似性的算法不关心一个节点是底部节点还是顶部节点。它将二分网络分成两部分,报告一类中每个节点相对于另一类中节点的相似性。
广义相似度是迭代计算的。该算法反复计算网络各部分节点的成对皮尔逊相关性,逐渐将原始欧氏坐标系转换为仿射坐标系。(仿射坐标轴之间的角度,一般是不对的。)代表相似项目的轴之间的角度变得更加尖锐;不同物品之间的角度变得更钝。
模块generalized
实现了Kovacs算法。你可以从Github或本书的网站上以generalized.py的形式下载该模块。
模块generalized
提供了一个函数generalized_similarity(G, min_eps=0.01,max_iter=50)
。该函数接收一个二分网络和两个循环终止提示,并返回一个四值元组: 两个单向加权相似网络;获得的精度;以及完成迭代的次数。
from generalized import generalized_similarity
bip1, bip2, eps, n_iter = generalized_similarity(N, min_eps=0.001, max_iter=100)
16. 案例研究:建立创伤类型网络
在本案例研究中,对象是精神创伤研究的对象(适当匿名),属性是其创伤类型。您将学习如何根据受试者的经验导出创伤类型(或其他属性)的网络。
(1)Embark on Psychological Trauma
(2)Read the Data, Build a Bipartite Network
(3)Build Four Weighted Networks
(4)Plot and Compare the Networks
第五部分 有向网络
17 有向网络
在本章中,您将学习如何识别项目之间的不对称关系,以及如何构建和处理有向网络。最后,您将能够检查有向网络是否是有向无环图,如果是,则通过执行拓扑排序来建立节点的部分顺序。
(1)Discover Asymmetric(不对称的) Relationships
(2)Explore Directed Networks
边缘的直接性极大地影响了几乎所有的网络度量和结构元素。让我们看看一些受影响的属性。
①Degree
有向图G中每个节点有三种度: G.in_degree()进入边的数量; G.out_degree()离开边的数量; G.degree()所有边的数量。
G.in_degree()
G.out_degree()
G.degree()
②Neighbors
有向图中一个node有两种形式的neighbors: G.successors()通过离开的边到达的; G.predecessors()通过输入的边到达的。
G.neighbors()是G.successors()的另一种名字。
final_destination = sorted(G.in_degree().items(), key=lambda x: x[1],reverse=True)[0][0]
coming_from = G.predecessors(final_destination)
going_to = G.successors(final_destination)
③Walks, Trails, and Paths
Walk: 网络中的一个行走仍然是一系列边,使得一条边的开始时另一条边的结束。然而,一条有向边只有一个终止和一个开始,而无向边可能从任何附带的节点开始。
④Centralities and Other Distances
有向图中每个节点有三条度: G.in_degree_centrality(), G.out_degree_centrality(), G.degree_centrality()。
Closeness, Betweenness和Eigenvector等其它类型的中心性,在有向和无向网络中计算方式相同,但是结果通常不同,因为不同的邻居和路径。后者同样适用于图的center, diameter, radius, eccentricity, 以及periphery等。
⑤Components
有向图有两种类型的components。
(3)Apply Topological Sort to Directed Acyclic Graphs
nx.is_directed_acyclic_graph(G) ##检查G是否为一个Directed Acyclic Graphs
nx.transitive_closure(G) ##计算G中的闭包T。
nx.topological_sort(G) ##返回一个随机选择的排名作为节点标签列表。
(4)Master “toposort”
有向网络分析与创意写作和电脑游戏开发有着意想不到的联系。
游戏开发者和创意作家经常需要一组形容词来描述一个特定的属性,范围从“非常差”到“非常好”定向网络分析(通过拓扑排序模块)使得用任何自然语言设计这样的量表成为可能。
参考:数据结构—拓扑排序详解
一个AOV网应该是一个有向无环图,即不应该带有回路,因为若带有回路,则回路上的所有活动都无法进行(对于数据流来说就是死循环)。在AOV网中,若不存在回路,则所有活动可排列成一个线性序列,使得每个活动的所有前驱活动都排在该活动的前面,我们把此序列叫做拓扑序列(Topological order),由AOV网构造拓扑序列的过程叫做拓扑排序(Topological sort)。AOV网的拓扑序列不是唯一的,满足上述定义的任一线性序列都称作它的拓扑序列。