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

作者: weston_Xiang | 来源:发表于2018-05-05 22:25 被阅读163次

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

    一.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)
    
    燕韩最短路径标识

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

    相关文章

      网友评论

        本文标题:用Igraph创建关系网络&简单网络分析

        本文链接:https://www.haomeiwen.com/subject/umysrftx.html