社会网络分析与挖掘---Python之networkx介绍

最近学习社会媒体挖掘,需要完成几个实验,Python的第三方模块networkx几乎都囊括了这些实现的接口,Python的好处就是开源,所以它的第三方模块的源码都可以看到,我看了实现的源码做了部分修改,算是完成了实验。下面对这个库做一些介绍。

1. introduction

networkX是一款Python的软件包,用于创造、操作复杂网络,以及学习复杂网络的结构、动力学及其功能。
有了networkX你就可以用标准或者不标准的数据格式加载或者存储网络,它可以产生许多种类的随机网络或经典网络,也可以分析网络结构,建立网络模型,设计新的网络算法,绘制网络等等。

2. install

对于已经装了pip的环境,安装第三方模块很简单,只需要pip install networkx即可。没有安装pip环境的机器可以先安装pip,Python3默认都是安装了pip的。

3. tutorial

Creating a graph

创建一个空图,不包含任何结点和边。

import networkx as nx
G = nx.Graph()

图是顶点集和确定的顶点之间的边集组成。在NetworkX中,顶点可以是任何可以哈希的对象,比如文本,图片,XML对象,其他的图对象,任意定制的节点对象,等等。(Python中的None对象不可以作为结点类型。)

Nodes

图的增长有几种方式,NetworkX包含了许多图的产生函数和一些读写图的工具。
一次添加一个顶点。

G.add_node(1)

也可以添加顶点的列表。

G.add_nodes_from([2, 3])

或者从nbunch中添加节点,nbunch是任何可迭代的节点容器(如list、set、graph、file等),nbunch本身不是图中的一个节点。

H = nx.path_graph(10)
G.add_nodes_from(H)

此时图G中就包含了图H中的10个节点。作为比较,我们可以使图H作为图G的一个节点.

G.add_node(H)

现在图G就包含了一个节点H,即该节点是一个图。可以看到这种灵活性是非常强大的,它允许图的图,文件的图,函数的图等等。因此我们应该好好思考如何构建我们的应用程序才能使我们的节点是有用的实体。当然我们可以在图中使用一个唯一的标识符或者使用一个不同的字典的键来标识节点信息。(如果该hash依赖于它的内容,则我们不应该改变节点对象)

Edges

图可以通过一次加一条边来增长。

 G.add_edge(1, 2)
 e = (2, 3)
 G.add_edge(*e)  # unpack edge tuple*

也可以一次加入一组边(边的列表)

G.add_edges_from([(1, 2), (1, 3)])

或者通过添加任何ebunch来添加边,一个ebunch是任何可迭代的边的元组,一个边的元组可以是两个节点之间的一个2元组(无权值的边)或者3元组(3元组还有一个元素是边的权值,比如(1,2,{‘weight’:100}))。下面将进一步讨论边的属性:

G.add_edges_from(H.edges)

我们可以用类似的方法拆除图:
G.remove_node(),G.remove_nodes_from(),G.remove_edge(),G.remove_edges_from()
比如:

G.remove_node(H)

如果你添加的节点和边是已经存在的,是不会报错的。比如,我们先将图G里的所有节点和边删除:

G.clear()

然后我们新的节点和边,NetworkX会自动忽略掉已经存在的边和节点的添加:

G.add_edges_from([(1,2),(1,3)])
G.add_node(1)
G.add_edge(1,2)
G.add_node("spam")       # adds node "spam"
G.add_nodes_from("spam")  # adds 4 nodes: 's', 'p', 'a', 'm'

此时图G一共有8个节点和2条边。
我们可以通过如下函数查看:

print G.number_of_nodes()
8
print G.number_of_edges()
3
What to use as nodes and edges

你可能已经注意到在NetworkX中节点和边并没有被指定一个对象,因此你就可以自由地指定节点和边的对象。最常见的对象是数值和字符串,但是一个节点可以是任意hash对象(除了None对象),一条边也可以关联任意的对象x,比如:
G.add_edge(a,b,object=x)。
举个关于边关联对象的例子,加入a和b是两个人,而他们两个人之间的联系(边),可以是一个概率,即边的对象是一个概率值,表示这两个人之间每天通电话的可能性。
可以看到这是十分强大而且有用的,但是如果你滥用该方法将会导致意想不到的后果,除非你对Python真的很熟悉。如果你不是很确定,你可以考虑使用conver_node_label_to_integers(),他可以将一个图的所有节点按顺序转化为整数对象赋给另一个图。

Accessing edges and neighbors

除了上面提到的那些访问节点和边的方法以外( eg:Graph.nodes(), Graph.edges(), Graph.neighbors()…),也可以利用下标表示来获取边和邻居结点。

>>> G[1]  # same as G.adj[1]
AtlasView({2: {}})
>>> G[1][2]
{}
>>> G.edges[1, 2]
{}

如果边已经存在时,也可以利用下标表示来设置边的属性。

>>> G.add_edge(1, 3)
>>> G[1][3]['color'] = "blue"
>>> G.edges[1, 2]['color'] = "red"

可以使用G.adjacency()或者G.adj.items()来快速访问每一条边,注意在无向图中adjacency迭代器可以看到边出现了2次。

>>> FG = nx.Graph()
>>> FG.add_weighted_edges_from([(1, 2, 0.125), (1, 3, 0.75), (2, 4, 1.2), (3, 4, 0.375)])
>>> for n, nbrs in FG.adj.items():
...    for nbr, eattr in nbrs.items():
...        wt = eattr['weight']
...        if wt < 0.5: print('(%d, %d, %.3f)' % (n, nbr, wt))
(1, 2, 0.125)
(2, 1, 0.125)
(
  • 27
    点赞
  • 282
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值