点击下方 卡片 ,关注“ 新机器视觉 ”公众号
视觉/图像重磅干货,第一时间送达
地址:https://zhuanlan.zhihu.com/p/413568865 在传统机器学习方法的pipeline中,我们需要手动地抽取一系列特征组合成特征向量 ,并将该特征向量 与标签 作为输入来训练机器学习模型,如随机森林、SVM、前馈神经网络等等。图网络数据作为一种特殊的数据结构,其既包含了节点自身的信息,又包含了网络拓扑结构信息,那么,针对图网络结构的数据有哪些传统有效的特征提取方法?本文将结合斯坦福大学CS224W课程第四讲内容,介绍传统的基于节点水平(Node-level)的图网络数据特征提取方法。 https://youtu.be/3IS7UhNMQ3U 基于节点水平的特征(Node-Level Features) 传统的节点水平的图网络特征可大致分为两类: (1)基于节点重要性的特征,衡量了某节点在网络中的重要程度,如:节点度,节点中心性度量; (2)基于结构的特征,能够捕捉节点周围领域的拓扑属性,如:节点度,聚类系数,图元度向量(GDV,graphlet degree vector) 接下来我们对节点度,中心性,聚类系数,以及GDV等概念进行详细介绍。 1. 节点度(Node Degree) 节点度,即对节点邻居个数的计数,或是与节点连接的边的条数。当图为有向图时,节点度又可分为入度(in-degree)与出度(out-degree)。值得注意的是,节点度捕捉到的信息默认了每一个邻居节点信息都是平等的。 2. 节点中心性(Node Centrality) 节点的中心性指标有多种,它们从不同角度衡量了节点在网络中的重要程度,其中最常用的几个中心性指标分别是:特征向量中心性,中介中心性,接近中心性。 特征向量中心性(eigenvector centrality) 特征向量中心性背后的思想是:若一个节点的邻居节点的重要性高,那么它的重要性也越高。特征向量中心性计算公式 可表示为: 经过一系列的变形,以上计算方法实际上等价于如下定义:设 为网络 的邻接矩阵,通过求解特征方程
我们可以得到特征向量 ,当 为最大特征值时,第 个节点的特征向量中心性即为向量 的第 个元素。 中介中心性(betweenness centrality) 中介中心性又称为最短路径中心性(shortest-path centrality),其思想是:若一个节点在各节点对之间的最短路径上出现次数越多,则其在网络中的重要性越高。用公式可表示为: 接近中心性(closeness centrality) 接近中心性背后的思想是:若一个节点到其他所有节点的最短路径长度越小,那么它在网络中的重要性越高,以公式可表示为: 3. 聚类系数(Clustering Coefficients) 聚类系数衡量了节点的邻居节点之间的连接性高低,若它的邻居节点之间相互连接的越多,则聚类系数越大。设聚类系数为 ,计算公式表示为: 下图以带有5个节点的网络为例,展示了三种不同网络结构下节点 的聚类系数: 4. 图元度向量(Graphlet Degree Vector) 图元度向量对事先指定的图元(graphlet)结构进行了计数统计,从而反映了网络的结构特征。在理解图元度向量之前,我们首先要理解图元的概念。 什么是图元? 官方给出的图元定义为“有根连通的非同构子图”。简单来说,图元就是若干个节点构成的所有可能的连通图结构,我们以课程中的示例图来进行解释。在下图中我们可以看到,当仅有两个节点时,可能的图元结构只有一种;当有三个节点时,图元结构有两种,可能是线型连接的,或是构成一个三角形(这里值得注意的是,当以不同的节点为根节点时,图元是不同的,例如 结构由于节点连接顺序不同代表了三种图元表示);以此类推,当考虑4个或5个节点时,构成的图元结构将会更多样。 什么是图元度向量? 指定图元,图元度向量统计了网络中以给定节点为根的图元个数。以下图为例,网络
中的 是我们要观察的根节点,a-d指定了4种不同的图元结构,以 为根节点对网络G中四种指定的图元结构进行计数统计,各图元出现的次数分别为2,1,0,2,由此我们可以得到节点 的图元度向量为 。 Python的第三方库networkx是一个非常实用的网络操作与分析工具,本部分将基于该库进行代码的实践。官方文档指路: https://networkx.org/documentation/stable/index.html 导入第三方库 import networkx as nximport matplotlib.pyplot as pltimport pandas as pd导入示例数据集 G = nx.karate_club_graph() print(nx.info(G)) nx.draw(G, pos=nx.spring_layout(G), with_labels=True) 节点度函数 G.degree(v) print("Node Degree" ) for v in G:
print(f"{v:4 } {G.degree(v):6 } " ) 节点中心性函数 特征向量中心性函数:nx.eigenvector_centrality(G) 中介中心性函数:nx.betweenness_centrality(G) 接近中心性函数:nx.closeness_centrality(G) print ("Node centraility" )eigen_dict = nx.eigenvector_centrality(G) betw_dict = nx.betweenness_centrality(G) close_dict = nx.closeness_centrality(G) centrality_df = pd.DataFrame( { 'eigenvector_centrality' : [eigen_dict[v] for v in G], 'betweenness_centrality' : [betw_dict[v] for v in G], 'closeness_centrality' : [close_dict[v] for v in G], } ) centrality_df 节点聚类系数函数 nx.clustering(G) print ("Node Clustering Coefficients" )nx.clustering(G)
运行代码会发现index为7的节点聚类系数为1,表明它的邻居节点应该呈两两之间全部相连接的状态,因此我们可以将7号节点的自我中心网络(ego-network)可视化检查看看是否符合: ego = nx.ego_graph(G, 7) nx.draw(ego, pos=nx.spring_layout(ego), with_labels=True) 注:图元度向量(GDV)暂未找到Python代码实现,故本文内容暂不对其进行代码展示 完整代码 见google colab notebook链接: https://colab.research.google.com/drive/1fpINHRhJmKNCJW7hVKbTZ_o1GR46Kxfq?usp=sharing 从本节的内容我们学习到了如何从网络中手动提取节点水平的特征,包含了节点度、中心性、聚类系数,以及图元度向量等概念。试想一下,如果仅考虑节点水平的特征,我们将遗漏掉网络中重要的链接信息,因此,在下一篇文章中,我们将学习网络中基于链接水平的特征提取方法。 —版权声明—
仅用于学术分享,版权属于原作者。
若有侵权,请联系微信号:yiyang-sy 删除或修改!