社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
网络分析可以用来理解图上节点与节点之间的关系。本章节聚焦于图上的小规模,微观 结构。这类型的结构往往描述了一些特定的节点再整个图上的作用。这类分析往往可以帮助我们找到有影响力的个人,对于聚焦信息或者资源的节点。这类型的特质可以通过计算中心度来得到。中心度可以量化的衡量每个节点的性质。 本章节将会cover以下几个图的性质:Centrality: 用中心度衡量节点的结构化特性。
Betweenness centrality: 衡量那些将2边节点连接起来的节点.
Eigenvector centrality: 找到哪些连接度非常高的节点
Closeness centrality:: 量化一个节点与图上其他节点的距离性
Local clustering: 检验一个节点的邻节点的互相连通性
Centrality - 找到最关键的节点
我们往往需要通过量化的方式来体现一个节点的特性,这个特性就可以使用中心度来体现。我们有非常多的方式来表达节点再图中的中压型,有一个最简单的方式就是degree centrality,也就是这个节点拥有的相邻节点数量。当然后文中也会介绍其他表现图的重要性的方式。每一种中心度都体现了一种不同重要性的方式,并且可以用于回答不同的具体问题。
Bridges,brokers,and bottlenecks - betweenness centrality
在一个图上,连接不同子图之间的节点叫做Broker,将图上距离较远的节点链接起来的边叫做Bridges.Bridge和Broker对于图算法来说很重要,因为他们将图上不同的部分链接了起来。
要解释这个问题,我们需要引入节点之间最短路劲的概念,可以用下图理解。
所以中介中心度的计算逻辑就是,一个节点被图上的最短路径经过的越多,他作为broker的角色做的越多,他的中介中心度就越大。
中心度计算在networkx中很容易,直接使用betweenness_centrality()就可以。这个方法会返回对应的NodeID以及对应的中心度值。如果normalized设置成True。那么原来的nodeid会除以node pair值。如果endpoints设置成True,那么终点节点也会被考虑到计算过程中。
import networkx as nx
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = (16,16)
%matplotlib inline
# Create empty affiliation network and list of people
B = nx.Graph()
people = set()
# Load data file into network
from pathlib import Path
data_dir = Path('.') / 'data'
with open(target,'r') as f:
# Parse header
events = next(f).strip().split(",")[1:]
# Parse rows
for row in f:
parts = row.strip().split(",")
person = parts[0]
people.add(person)
for j, value in enumerate(parts[1:]):
if value != "0":
B.add_edge(person, events[j], weight=int(value))
# Project into person-person co-affiliation network
from networkx import bipartite
G = bipartite.projected_graph(B, people)
找到中心度最高的10个个人:
betweenness = nx.betweenness_centrality(G,normalized=False)
sorted(betweenness.items(),key = lambda x:x[1],reverse=True)[0:10]
Local Clustering接下来是最后一种中心度的衡量方式,但是local clustering和前面几种不太一样。之前的重要性算法更注重节点本身在图上的重要性,而Local Clustering衡量的是单个节点的邻居节点是否相连。这种度量在社交关系的语境下其实就是询问,你朋友的朋友们本身是不是朋友。当图中有强clustering存在是,我们会认为这个社群的鲁棒性比较强,也就是拿掉一条边,其余的边仍然可以通过图上仅存的关系链接。 Clustering通过local clustering coefficient来衡量,计算方法是 计算一个节点的临边节点所有可能存在边的关系对中,真正存在有边的点。
在NetworkX中,一个节点与他的邻居节点拥有的triangles数量可以通过以下函数计算:
triangles = nx.triangles(G)
sorted(triangles.items(),key = lambda x:x[1],reverse=True)[0:10]
现在我们通过clustering()方法去计算local clustering coefficient:
clustering = nx.clustering(G)
[(x, clustering[x]) for x in sorted(people, key=lambda x:eigenvector[x], reverse=True)[0:10]]
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!