python的networkx 算法_python图算法库Networkx笔记 - Node and Centrality - Go语言中文社区

python的networkx 算法_python图算法库Networkx笔记 - Node and Centrality


网络分析可以用来理解图上节点与节点之间的关系。本章节聚焦于图上的小规模,微观 结构。这类型的结构往往描述了一些特定的节点再整个图上的作用。这类分析往往可以帮助我们找到有影响力的个人,对于聚焦信息或者资源的节点。这类型的特质可以通过计算中心度来得到。中心度可以量化的衡量每个节点的性质。 本章节将会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]]

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_39678089/article/details/110684441
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-06-14 05:16:49
  • 阅读 ( 822 )
  • 分类:算法

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢