首先,我们导入需要的包?
import numpy as np
import random
import networkx as nx
from IPython.display import Image
import matplotlib.pyplot as plt
图表示物件与物件之间关系的数学对象,是图论的基本研究对象。
举个例子,一个简单的图可能是这样哒。
节点(node)用红色标出,通过黑色的边(edge)组成。
# Load the graph
G_karate = nx.karate_club_graph()
# Find key-values for the graph
pos = nx.spring_layout(G_karate)
# Plot the graph
nx.draw(G_karate, cmap = plt.get_cmap('rainbow'), with_labels=True, pos=pos)
这个「空手道」图表示什么?Wayne W. Zachary 在 1970 到 1972 年这三年中研究的一个空手道俱乐部的社交网络。该网络包含了这个空手道俱乐部的 34 个成员****,成员对之间的连接表示他们在俱乐部之外也有联系。在研究期间,管理员 JohnA 与教练 Mr.Hi(化名)之间出现了冲突,导致俱乐部一分为二。一半成员围绕 Mr.Hi 形成了一个新的俱乐部,另一半则找了一个新教练或放弃了空手道。基于收集到的数据,除了其中一个成员,Zachary 正确分配了所有成员在分裂之后所进入的分组。
n=34
print(G_karate.degree())
degree_sequence = list(G_karate.degree())
计算边的数量,但也计算度序列的度量:
nb_nodes = n
nb_arr = len(G_karate.edges())
avg_degree = np.mean(np.array(degree_sequence)[:,1])
med_degree = np.median(np.array(degree_sequence)[:,1])
max_degree = max(np.array(degree_sequence)[:,1])
min_degree = np.min(np.array(degree_sequence)[:,1])
》# 最后,打印所有信息:
print("Number of nodes : " + str(nb_nodes))
print("Number of edges : " + str(nb_arr))
print("Maximum degree : " + str(max_degree))
print("Minimum degree : " + str(min_degree))
print("Average degree : " + str(avg_degree))
print("Median degree : " + str(med_degree))
平均而言,该图中的每个人都连接了 4.6 个人。
我们可以绘出这些度的直方图:
degree_freq = np.array(nx.degree_histogram(G_karate)).astype(‘float’)
plt.figure(figsize=(12, 8))
plt.stem(degree_freq)
plt.ylabel(“Frequence”)
plt.xlabel(“Degre”)
plt.show()
通过上图可以看出,度的直方图相当重要,上图可以用于确定我们图的种类。
存储图有三种方式,取决于你想用其做什么?
G_karate.edges()
同构图和异构图
两个图G和H是同构图,能够通过重新标记图G的顶点而产生图H。
如果G和H是同构,那么它们的阶是相同的,它们大小是相同的,它们的顶点度数也对应相同。
异构图是一个与同构图相对应的概念。
传统同构图,数据中只存在一种节点和边,因此,在构建图神经网络时,所有节点共享同样的模型参数并且拥有同样维度的特征空间。
异构图:可以存在不只一种的节点和边,因此,允许不同类型的节点拥有不同维度的特征和属性。
目前大多数图算法支持的类别主要有三个:
我们只介绍networkx中实现的最常见的基本算法。
图搜索算法主要有两种:
最短路径:
最短路径计算的是一对节点之间的最短的加权(如果图有加权的话)路径。
这可以用于确定最优的驾驶方向或社交网络上两个人之间的分离程度。
单源最短路径
单源最短路径(Single Source Shortest Path/SSSP)是找到给定节点与图中其它所有节点之间的最短路径。
这常用于IP网络的路由协议:
尽管能够提供相近的结果,但这比为每个节点对调用单源最短路径算法更快。该算法通常可用于确定交通网格的不同分区的流量负载。
最小权重生成树(minimum spanning tree)是图(一个树)的一个子图,其用权重和最小的边连接了图中的所有节点。
社群检测时根据指定的质量指标将节点划分为多个分组。
这通常可用于识别社交社群、客户行为或网页主题。 社区是指一组相连节点的集合。但是,目前关于社群还没有广泛公认的定义,只是社群内的节点应该要密集地相连。
Girvan Newman 算法是一个用于发现社群的常用算法。其通过逐步移除网络内的边来定义社区。我们将居间性称为「边居间性(edge betweenness)」。这是一个正比于穿过该边的节点对之间最短路径的数量的值。
该算法步骤如下:
在分层聚类中,我们构建聚类的层次结构,我们用树状图的形式表示聚类。
其思想是以不同的规模分析社群结构,我们通常自下而上构建树状图,从每个节点一个聚类开始,然后合并两个最近的节点。
要得到最大连接,在每个步骤,被最短距离分开的两个聚类被组合到一起。相似度距离可用以下示意图阐释:
慢慢的将各种图的概念和心得,全部将其搞定,全部学习完整都行啦的样子与打算。全部将其搞定都行啦的理由与样子。