第1章 图的基础知识
一个图中最重要的元素是节点和关系。关系指边,也称为链接。
一些基本属性:
- 图的阶数是它的顶点数,图的大小是它的边数。
- 顶点v的邻域图,也称为ego图
了解其余类型的图,下面是一个构建二部图的示例:
# 创建二部图
import networkx as nx
import pandas as pd
import numpy as np
n_nodes = 10
n_edges = 12
bottom_nodes = [ith for ith in range(n_nodes) if ith%2==0]
top_nodes = [ith for ith in range(n_nodes) if ith%2==1]
iter_edges = zip(
np.random.choice(bottom_nodes, n_edges),
np.random.choice(top_nodes, n_edges)
) # 随机选取12个节点,构成节点对
print(iter_edges)
edges = pd.DataFrame([
{"source":a, "target":b} for a, b in iter_edges
])
print(edges)
# 创建图
B = nx.Graph()
B.add_nodes_from(bottom_nodes, bipartite=0)
B.add_nodes_from(top_nodes, bipartite=1)
B.add_edges_from([tuple(x) for x in edges.values])
from networkx.drawing.layout import bipartite_layout
pos = bipartite_layout(B, bottom_nodes)
nx.draw_networkx(B, pos=pos)
显示效果如下所示:
两种执行图数据结构简明表示的方法:邻接矩阵和边列表。
获取邻接矩阵:
# 获取邻接矩阵
nx.to_pandas_adjacency(G)
nx.to_numpy_matrix(G)
两种绘制图的工具:networkx、gephi
如何在不为每个节点指定坐标的情况下绘制图?
手动提供nodes_postion肯定不合理,networkx提供了一个不同的函数来根据不同的布局自动计算每个节点的位置。只需要将node_postion分配给要使用的布局的结构即可。
Gephi是一种开源网络分析和可视化软件。Gephi指南
度量指标:四大类
- 集成指标
- 距离
- 路径
- 最短路径
- 隔离指标
- 聚类系数,可以衡量有多少节点聚集在一起
- 传递性,可简单定义为观察到的闭合三元组数量与图中闭合三元组的最大可能数量之间的比率。
闭合三元组是指具有3个节点和两条边的完整子图。 - 模块度,量化网络在高度互连的节点聚合集中的划分。
- 中心性指标
- 度中心性
- 接近度中心性
- 中介中心性
- 弹性指标
- 同配性
用于量化节点连接到相似节点的趋势。有若干方法可以衡量这种相关性,最常用的是直连节点(链接两端的节点)的度之间的皮尔森相关系数(Pearson Corrlation Coefficient)
当度相似的节点存在相关性时,系数取正值,不同度的节点之间存在相关性时,系数取负值。取值为-1——1
- 同配性
简单的图的示例:
全连接的无向图:complete = nx.complete_graph(n=7)
团:更大的图中的n个节点的全连接子图通常称为大小为n的团
网络数据存储库:通常以矩阵市场交换格式MTX的文件格式提供。可以使用scipy轻松读取MTX的文件。
例如:ASTRO_PH协作网络,通过连接所有共同创作的作者构建的一个出版物,
可以使用nx导出为图交换XML格式,nx.write_gext(graph, "ca-AstroPh.getx")
还有斯坦福网络分析平台SNAP。
第2章 图机器学习概述
理解在图上执行的机器学习
- 监督学习
- 无监督学习
无监督学习的常见问题是发现相似样本的组(聚类),另外还有就是给出高维空间中数据的新表示方式
评估机器学习算法泛化能力的最常用方法是将数据集分为两部分:训练集和测试集。测试集可进一步分为验证集和测试集。验证集通常用于在训练期间评估模型的性能。
泛化的图嵌入问题
图的表示方式学习过程称为图表示学习或网络嵌入的良好表示。
Representation Learning 或Network Embedding旨在学习映射函数从离散图到连续域的任务,函数f将能够执行低维向量表示,使得图G的属性被保留。这些映射函数试图建立一个向量空间,使新空间中的几何关系反映原始图、节点或边的结构。
例如使用Graph2Vec进行嵌入:
import random
import matplotlib.pyplot as plt
from karateclub import Graph2Vec
n_graphs = 20
def generate_random():
n = random.randint(5, 20)
k = random.randint(5,n)
p = random.uniform(0,1)
return nx.watts_strogatz_graph(n, k, p)
Gs = [generate_random() for x in range(n_graphs)]
model = Graph2Vec(dimensions=2)
model.fit(Gs)
embeddings = model.get_embedding()
fig, ax = plt.subplots(figsize=(10,10))
for i,vec in enumerate(embeddings):
ax.scatter(vec[0], vec[1], s=1000)
ax.annotate(str(i), (vec[0], vec[1]), fontsize=16)
图嵌入机器学习算法的分类
编码器和解码器架构:
嵌入必须包含所有这些信息的压缩版本,并且可以用于下游机器学习任务。
嵌入算法的分类:
- Shallow Embedding Method。能够学习并仅返回已学习的输入数据的嵌入值。
- GAE,学习一个更通用的映射函数,能够为未见实例生成嵌入向量。仅适用于无监督任务。
- Neighborhood Aggregation Method,可用于在图级别提取嵌入,其中节点用某些属性进行标记。
- 图正则化方法,Graph Regularization Method,目标是利用特征的交互来进行正则化,通过考虑特征的相似性从特征构建图。
第3章 无监督图学习
自己寻找聚类、发现模式、检测异常。
大多数这些模型确实只使用了邻接矩阵和节点特征中的信息,而无须任何下游机器学习的知识。最常用的解决方案之一是学习保留图结构的嵌入,学习到的表示通常被优化,以便能用于重建成对节点的相似性。
无监督图机器学习相关的算法:
- Shallow Embedding
- Autoencoder
- GNN
自编码器由以下两部分组成:
编码器网络:处理输入并将其映射到编码之后的表示中以减少输入的维度
解码器网络:通过中间层的编码表示重构输入信号。
图神经网络
GNN依赖于这样一个事实,每个节点都可以通过其特征或邻域来描述。来自邻域的信息可以聚合用于计算更复杂和更高级的特征。
图数据的卷积操作主要有两种:
- 谱方法
- 非谱方法
空间图卷积网络,通过聚合来自空间近邻的信息直接在图上执行操作。GraphSAGE是实现空间卷积的算法之一。
第5章 使用图机器学习技术来解决问题
预测图中缺失的链接
链接预测也称为图完备。
解决链接预测问题的两大类方法:
- 基于相似性
- 基于索引的方法
- 基于社区的方法
- 基于嵌入
将链接预测问题作为有监督的分类任务来解决。
……