机器学习与数据挖掘Python数据挖掘python自学

用Igraph创建关系网络&简单网络分析

2018-05-05  本文已影响163人  weston_Xiang

---------------------------------------------目录--------------------------------------------

一.Igraph简介

二.Igraph网络图创建与优化

三.网络图信息价值挖掘

四.小结

---------------------------------------------正文--------------------------------------------

一.Igraph简介

问题1:Igraph是什么,可以用来干什么?

Igraph是一个python工具包,它可以用于创建,操作和研究复杂网络系统。

问题2:为什么用Igraph?
实际运用过程中,很可能会遇到非常庞大的关系数据,当网络规模急剧扩大时,情况会变得纷繁复杂,处理网络结构的代价和开销也会随之增大,Igraph很多功能使用C语言开发,运算效率很高,十分适合解决大型复杂网络问题。另外,Igraph实现了一些复杂网络算法,如网络流、图同构、匹配算法以及社团结构等,分析的时候更加方便高效。

问题3:如何安装和使用Igraph包呢?
可以直接执行命令pip install python-igraph安装。
或者下载igraph安装包后,先解压安装包;再cd到安装包所在目录,如:cd C:\Users\user\Desktop\igraph;最后执行python setup.py install就可以啦。
安装完毕后,运行代码:import igraph,如果没报错,代表已经成功安装。

二.Igraph网络图创建与优化
以中国古代战国七雄为对象(点),不同国家若地理位置相邻,则认为存在地理联系(边),以此为基准,试着创建一个简单的抽象网络图(这里只探究两两相邻关系,不保证地理方位的正确性):

# 创建一个空对象
g = igraph.Graph()
# 添加网络中的点
vertex = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
g.add_vertices(vertex)
# 添加网络中的边
edges = [('a', 'c'), ('a', 'e'), ('a', 'b'), ('b', 'd'), ('b', 'g'), ('c', 'e'),
         ('d', 'f'), ('d', 'g'), ('e', 'f'), ('e', 'g'), ('f', 'g')]
g.add_edges(edges)
# -----------------------其它信息-----------------------------
# 国家名称
g.vs['label'] = ['齐', '楚', '燕', '韩', '赵', '魏', '秦']
# 国家大致相对面积(为方便显示没有采用真实面积)
g.vs['aera'] = [50, 100, 70, 40, 60, 40, 80]
# 统计日期
g['Date'] = '公元前279年'
# -----------------------简单作图-----------------------------
# 选择图的布局方式
layout = g.layout('kk')
# 用Igraph内置函数绘图
igraph.plot(g, layout)
战国势力地理关系图1.0

这张图不是很美观,那么如何去优化和完善它呢?比如说点的颜色、大小,边的长短、粗细等。可以通过调节igraph.plot()中的参数达到我们想要的效果:

# -----------------------设置参数-----------------------------
# 参数集合。visual_style是一个参数字典,可以动态添加想要个性化设定的参数
visual_style = {}
# 根据相对面积,设置点的大小
visual_style["vertex_size"] = g.vs['aera']
# 根据国家实力,设置点的颜色
visual_style["vertex_color"] = [color_map[power] for power in g.vs["power"]]
# 边的粗细(这里随机生成)
visual_style['edge_width'] = [2 + 5*np.random.rand() for i in np.arange(11)]
# 图尺寸
visual_style["bbox"] = (600, 480)
# 边缘距离
visual_style["margin"] = 50
# 布局方式
visual_style["layout"] = layout
# -----------------------画图-----------------------------
igraph.plot(g, **visual_style)
战国势力地理关系图1.1

PS:看懂以上代码,就了解了Igraph中基本的网络图的构建方法,以及可视化展示的常用参数设置方法。接下来,重点讲讲如何从这些网络图中找出一些有价值的信息。

三.网络图信息价值挖掘
那么,基于这张图,有哪些有价值的信息可以挖掘呢?
1.节点的度(degree)。
概念:某节点的度,只与该节点有直接联系的其它点的个数。在有向图中,度还可分为出度(out-defree)和进度(in-degree),它一定程度上表现了某节点周围的密集程度。
在本例中,度的实际含义是一个国家的邻国数量。

# 点的度
numbers = g.degree()
# 不同国家邻国数量
neighbors = dict(zip(g.vs['label'], numbers))
print(neighbors)

输出结果:

{'魏': 3, '燕': 2, '赵': 4, '楚': 3, '齐': 3, '韩': 3, '秦': 4}

2.中介中心性(betweenness)。
概念:一个结点担任其它两个结点之间最短路路劲的桥梁的次数,次数越多,该数越大。
在本例中指的是国家起到的枢纽作用大小。

# 计算中介中心性
betweenness = g.betweenness()
# 保留一位小数
betweenness = [round(i, 1) for i in betweenness]
# 与国家名对应
country_betweenness = dict(zip(g.vs['label'], betweenness))
print('不同国家的中介中心性(枢纽作用):\n', country_betweenness)

输出结果:

不同国家的中介中心性(枢纽作用):
 {'魏': 0.8, '燕': 0.0, '赵': 4.2, '楚': 1.8, '齐': 1.8, '韩': 0.5, '秦': 1.8}
中介中心性

3.另一个非常常见的操作是找两个点之间的最短路径。
概念:任选两个节点,连通这两个节点的最少边数,定义为这两个节点的最短路径长度。
当然,这里所指的最短路径,只用来表示不同国家间的抽象地理关系,和实际中的最短路径含义并不一致。

# 计算魏国和齐国的最短路径(如有多条路径,只取其中之一)
path = g.get_shortest_paths('c', 'd')[0]
seq = g.vs.select(path)
print('燕韩之间的最短路径: ', seq['label'])

输出文字结果:

燕韩之间的最短路径:  ['燕', '齐', '楚', '韩']

将最短路径用红色标记:

# --------------------------路径-----------------------------
path = seq['name']
# ---------------------给边设定颜色---------------------------
# 默认为黑色
edge_color = dict(zip(edges, ['black']*11))
# 最短路径里的边映射为红色。映射时需要考虑元组中对象顺序,这里按字母从小到大排序
for i in np.arange(np.size(path)-1):
    if path[i] < path[i+1]:
        edge_color[(path[i], path[i + 1])] = 'red'
    else:
        edge_color[(path[i + 1], path[i])] = 'red'
visual_style['edge_color'] = [edge_color[edge] for edge in edges]
# ------------------------画图------------------------------
m = igraph.plot(g, **visual_style)
燕韩最短路径标识

四.小结
理解网络图的角度很多,往往是对图网络进行某种程度的抽象统计或聚焦观察。以上只是举了一个通俗易懂的小例子,实现了网络图的创建和展示,并提供了几种分析图信息的方法,可以作为初步理解网络结构的工具。

上一篇下一篇

猜你喜欢

热点阅读