当前位置: 首页 > 后端技术 > Python

GraphEmbeddingOverview-Node,Edge,andGraphEmbeddingMethodsandPythonImplementation

时间:2023-03-26 00:04:16 Python

基于图的机器学习近年来取得了长足的进步。基于图的方法在数据科学中的许多常见问题中都有应用,例如链接预测、社区发现、节点分类等。根据您组织问题的方式和您拥有的数据,有很多方法可以解决它。本文将提供基于图形的嵌入算法的高级概述。最后,我们将介绍如何使用Python库(例如node2vec)在图上生成各种嵌入。基于图的机器学习人工智能有多个分支,从推荐系统、时间序列、自然语言处理、计算机视觉、图机器学习等。有多种方法可以解决基于图的机器学习的常见问题。包括社区发现、链接预测、节点分类等。图机器学习的一个主要问题是找到一种表示(或编码)图结构的方法,以便机器学习模型可以轻松地利用它[1]。解决机器学习中的这个问题通常需要学习与模型相关的结构化表格数据的某种表示,这以前是通过统计测量或核函数完成的。近年来,趋势已转向编码图形以生成用于训练机器学习模型的嵌入向量。机器学习模型的目标是训练机器学习和识别数据集中的大规模模式。在处理图形时,这一点会被放大,图形提供了其他形式的数据(如文本、音频或图像)所没有的不同且复杂的结构。基于图的机器学习可以检测和解释重复出现的潜在模式[2]。我们可能有兴趣确定与社交网络上的用户相关的人口统计信息。人口统计数据包括年龄、性别、种族等。Facebook或Twitter等公司的社交媒体网络范围从数百万到数十亿用户和数万亿方。在这个网络中肯定会有几种与用户人口统计相关的模式,这些模式不容易被人类或算法检测到,但模型应该能够学习它们。同样,我们可能想推荐一对目前还不是朋友的用户成为朋友。这为链接预测提供了素材,链接预测是基于图形的机器学习的另一个应用。什么是图嵌入?特征工程是指处理输入数据以形成一组特征的常用方法,这些特征提供原始数据集的紧凑且有意义的表示。特征工程阶段的结果将作为机器学习模型的输入。这是处理表格结构化数据集时必须具备的过程,但在处理图形数据时是一种难以执行的方法,因为需要找到一种方法来生成与所有图形数据关联的合适表示。有多种方法可以从图形中生成表示结构信息的特征。最常见和直接的方法是从图中提取统计数据。这可以包括识别分布、页面排名、中心性指标、jaccard分数等。然后通过核函数将所需的属性合并到模型中,但核函数的问题是生成结果的相关时间复杂度很高。最近的研究趋势已经转向寻找有意义的图形表示和生成图形的嵌入表示。这些嵌入学习保留网络原始结构的图形表示。我们可以将其视为一个映射函数,旨在将离散图转换为连续域。一旦学习了一个函数,就可以将其应用于图形,生成的映射可以用作机器学习算法[2]的特征集。图嵌入的类型图的分析可以分为3个粒度级别。节点级别、边级别和图级别(整个图)。每个级别都包含生成嵌入向量的不同过程,选择的过程应取决于所处理的问题和数据。下面显示的每个粒度级别的嵌入都有在视觉上彼此不同的图形。节点嵌入在节点级别,生成与图中每个节点关联的嵌入向量。这个嵌入向量可以保存图的表示和结构。本质上,彼此靠近的节点也应该具有彼此靠近的向量。这是流行的节点嵌入模型(如Node2Vec)的基本原则之一。边嵌入到边层中,生成与图中每条边关联的嵌入向量。链接预测问题是使用边嵌入的常见应用。链接预测是指预测一对节点是否由边连接的可能性。这些嵌入可以学习图提供的边属性。例如,在社交网络图中,您可以有一个多边图,其中节点可以根据年龄范围、性别等通过边连接。表示边的关联向量可以学习这些边属性。图嵌入图级嵌入并不常见;它们涉及生成表示每个图形的嵌入向量。例如具有多个子图的大图,每个对应的子图都有一个表示图结构的嵌入向量。分类问题是图嵌入非常有用的常见应用。这些类型的问题将涉及将图形分类为特定类别。Python实现使用python代码实现我们需要以下库Python=3.9networkx>=2.5pandas>=1.2.4numpy>=1.20.1node2vec>=0.4.4karateclub>=1.3.3matplotlib>=3.3.4if您没有安装node2vec包,请参阅其文档。安装karateclub包,也类似节点填入importrandomimportnetworkxasnximportmatplotlib.pyplotaspltfromnode2vecimportNode2Vecfromnode2vec.edgesimportHadamardEmbedderfromkarateclubimportGraph2Vecplt.style.use("seaborn")#生成杠铃网络G=nx.barbell_graph(m1=13,m2=7)#nodeembeddingsdefrun_n2v(G,dimensions=64,walk_length=80,num_walks=10,p=1,q=1,window=10):"""给定一个图G,此方法将运行使用传入的适当参数训练的Node2Vec算法。参数:G(图形):您要在其上运行node2vec的网络返回:此方法将返回一个模型示例:G=np.barbell_graph(m1=5,m2=3)mdl=run_n2v(G)"""mdl=Node2Vec(G,dimensions=dimensions,walk_length=walk_length,num_walks=num_walks,p=p,q=q)mdl=mdl.fit(window=window)returnmdlmdl=run_n2v(G)#可视化节点嵌入x_coord=[mdl.wv.get_vector(str(x))[0]forxinG.nodes()]y_coord=[mdl.wv.get_vector(str(x))[1]forxinG.nodes()]plt.clf()plt.scatter(x_coord,y_coord)plt.xlabel("维度1")plt.ylabel("Dimension2")plt.title("2DimensionalRepresentationofNode2VecAlgorithmonBarbellNetwork")plt.show()上图是杠铃图生成节点嵌入的可视化。计算nodeembedding的方法有很多,比如node2vec、Deepwalk、randomwalks等,这里使用node2vec。边缘嵌入edges_embs=HadamardEmbedder(keyed_vectors=mdl.wv)#可视化嵌入坐标=[edges_embs[(str(x[0]),str(x[1]))]forxinG.edges()]plt.clf()plt.scatter(coordinates[0],coordinates[1])plt.xlabel("Dimension1")plt.ylabel("Dimension2")plt.title("2DimensionalRepresentationofEdgeEmbeddingsonBarbellNetwork")plt.show()通过杠铃图查看边嵌入的可视化,HammardEmbedder的源代码可以在这里找到(https://github.com/eliorc/nod...)。图嵌入n_graphs=10Graphs=[nx.fast_gnp_random_graph(n=random.randint(5,15),p=random.uniform(0,1))forxinrange(n_graphs)]g_mdl=Graph2Vec(dimensions=2)g_mdl.fit(图形)g_emb=g_mdl.get_embedding()x_coord=[vec[0]forvecing_emb]y_coord=[vec[1]forvecing_emb]plt.clf()plt.scatter(x_coord,y_coord)plt.xlabel("Dimension1")plt.ylabel("Dimension2")plt.title("2DimensionalRepresentationofGraphEmbeddingsonRandomlyGeneratedNetworks")plt.show()这是随机生成图的图对于嵌入可视化,可以在这里找到graph2vec算法的源代码。(https://karateclub.readthedoc...)总结嵌入是一种将离散图映射到向量表示的函数。可以从图数据、节点嵌入、边嵌入和图嵌入生成各种形式的嵌入。所有三种类型的嵌入都提供了一种向量表示,将图的初始结构和特征映射到X维度上的数值。本文源码在这里:https://avoid.overfit.cn/post/8e8db820566e45cf97cd04b95d3781c0作者:Vatsal