之前收集到一个关于纽约市全年出租车的数据集,于是想到,我们是不是可以用这个数据集来研究一下纽约市中各个社区之间的关联度?为了研究这个问题,就需要使用python来建立一些图论模型。

igraph是python/R等语言中常用的建立图模型的模块。接下来首先对igraph模块做一个简要介绍,然后对纽约市的出租车数据进行建模。

一、igraph

首先我们导入所需的包

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from igraph import *
import datetime

创建图:

g = Graph()

print一下:

print(g)
#输出结果如下
#IGRAPH U--- 0 0 --

添加顶点:

g.add_vertices(3)
print(g)
#输出结果如下
#IGRAPH U--- 3 0 --

添加边:

g.add_edges([(0,1), (1,2)])

IGRAPH U--- 3 2 --
+ edges:
0--1 1--2

如果我们想要删去某两个节点间的边:

g.get_eid(2,1)#获取边的序号
#1
g.delete_edges(1)#删除边
print(g)
"""
IGRAPH U--- 3 1 --
+ edges:
0--1
"""

我们还可以给边定义一些属性

如:

g.vs["name"] = ["Alice"]
g.vs["age"] = [25]
g.vs["gender"] = ["f"]
g.es["is_formal"] = [False]

此时的图如下:

"""
IGRAPH UN-- 3 1 --
+ attr: age (v), gender (v), name (v), is_formal (e)
+ edges (vertex names):
Alice--Alice
"""

二、Community Detection(社区发现)

1.什么是community(社区)

community是一个图中的一个子图,它包含比图的其余部分或更紧密地彼此紧密链接的节点,如果子图内部的边数大于这些子图之间的边数,则图具有community结构。

例如:

community structure

以及:

community structure

2.什么是modularity(模块度)

Newman 在2003年的论文 “Finding and evaluating community structure in networks” 中首次提出了modularity的定义,它被用来度量自己的社团检测算法的好坏。

Consider a particular division of a network into k communities. Let us define a k×k symmetric matrix e whose element is the fraction of all edges in the network that link vertices in community i to vertices in community j [49].

假设社团划分把一个网络划分为

个社团,定义一个
的矩阵
,
表示连接社团
和社团
的边的数目占总边数的比例。

特别的,

表示的是社团
和社团
之间的边占总边数的比例,也就是社团
内部的边占总边数的比例。

以下便是模块度的计算公式:

如果用

表示社团
内部的边数,则
。然后把
代入,就可以得到计算modularity最常用的公式

3.multilevel community detection algorithm

为了快速进行社区发现,我们需要一些求解该问题的算法。这其中,时间复杂度最低的便是Blondel发明的multilevel算法。

该算法有两个主要步骤:

步骤一:

不断地遍历网络图中的节点,通过比较节点给每个邻居社区带来的模块度的变化,将单个节点加入到能够使modulaity模块度有最大增量的社区中。
(比如节点

分别加入到社区
中,使得三个社区的模块度增量为
, 则节点
最终应该加入到社区
中)

步骤二:

对第一阶段进行处理,将属于同一社区的顶点合并为一个大的超点重新构造网络图,即一个社区作为图的一个新的节点。此时两个超点之间边的权重是两个超点内所有原始顶点之间相连的边权重之和,即两个社区之间的边权重之和。

重复以上步骤,直至不能改变网络图为止。

三、实例

通过纽约的出租车数据进行纽约市的社区发现。

首先读取数据

intersections=pd.read_csv("intersections.csv",header=None)
intersection_to_zone=pd.read_csv("intersection_to_zone.csv")
taxi_id=pd.read_csv("taxi_id.csv",header=None)

观察数据

taxi_id.tail(5)

每一趟出租车的数据
intersection_to_zone.tail(5)

每个intersection属于的community
intersections.head(5)

intersection的经纬信息

建立图模型,并遍历taxi数据,探究早晨7-9点的纽约哪些社区的关系较为紧密

g1=Graph()
g1.add_vertices(63)
for index, row in taxi_id.iterrows():beginTime = datetime.datetime.fromtimestamp(row["1"])endTime = datetime.datetime.fromtimestamp(row["2"])start_place=row["3"]end_place=row["4"]print(beginTime)try:start_zone=dic[start_place]end_zone=dic[end_place]except KeyError:continueif (beginTime.hour==7 or beginTime.hour==8) and (endTime.hour==7 or endTime.hour==8):#print(start_zone,end_zone)g1.add_edges([(to_vid[start_zone],to_vid[end_zone])])

使用Blondel的算法进行社区发现

result1=g1.community_multilevel()

观察结果

print(result1)

Clustering with 63 elements and 3 clusters
[0] 0, 1, 2, 7, 13, 14, 15, 18, 19, 20, 23, 26, 31, 32, 35, 41, 42, 43, 44,45, 48, 49, 50, 51, 59, 60
[1] 8, 9, 10, 16, 17, 36, 37, 38, 39, 47, 58
[2] 3, 4, 5, 6, 11, 12, 21, 22, 24, 25, 27, 28, 29, 30, 33, 34, 40, 46, 52,53, 54, 55, 56, 57, 61, 62

可以看到,该算法将纽约划分为了三个主要部分。

同时,结合纽约的地理信息

可见纽约的五个区分布在三块分离的岛屿上,而出租车数据的分析结果也与这一点吻合的很好。

看完文章别忘了送上点赞~

欢迎关注我的个人公众号-leo的学习之旅

公众号内会分享个人整理/学习的数据科学/深度学习知识~

python子图之间的距离_python与图论的桥梁——igraph相关推荐

  1. python 表示图论_python与图论的桥梁——igraph

    之前收集到一个关于纽约市全年出租车的数据集,于是想到,我们是不是可以用这个数据集来研究一下纽约市中各个社区之间的关联度?为了研究这个问题,就需要使用python来建立一些图论模型. igraph是py ...

  2. python计算两个点之间的距离_python实现两个经纬度点之间的距离和方位角的方法...

    最近做有关GPS轨迹上有关的东西,花费心思较多,对两个常用的函数总结一下,求距离和求方位角,比较精确,欢迎交流! 1. 求两个经纬点的方位角,P0(latA, lonA), P1(latB, lonB ...

  3. python 二维两点距离_python 各类距离公式实现

    所列的距离公式列表和代码如下: 闵可夫斯基距离(Minkowski Distance) 欧氏距离(Euclidean Distance) 曼哈顿距离(Manhattan Distance) 切比雪夫距 ...

  4. 用计算python两点之间的距离math_自学生信Python(第二天)|计算出两点之间的距离...

    计算出两点之间的距离 日常旁白:本人是一枚生物学的学生,由于对生物信息学特别感兴趣,于是想自学生物信息学(新手莫怪).了解到生物信息学要有编程基础,尤其是要会一门编程语言,例如:R语言.Python. ...

  5. python与图论的桥梁——igraph

    之前收集到一个关于纽约市全年出租车的数据集,于是想到,我们是不是可以用这个数据集来研究一下纽约市中各个社区之间的关联度?为了研究这个问题,就需要使用python来建立一些图论模型. igraph是py ...

  6. python中求两点之间的距离_python – 列表中两点之间的距离公式

    我需要创建一个列表,找到最接近的两个点,然后打印出来.如何比较列表中的每个点? 没有任何需要绘制或任何东西,只是比较点,找到列表中最接近的两个. import math # 'math' needed ...

  7. python求点到曲线距离_Python。如何从点和偏移距离的x,y列表中获取偏移样条曲线的x,y坐标...

    在特殊情况下,坡度为无穷大/零,但基本方法是使用插值计算某个点的坡度,然后找到垂直坡度,然后计算该距离处的点.在 我修改了来自here的示例,以添加第二个图.它与data file you provi ...

  8. python 求平面两点距离_Python求平面内点到直线距离的实现

    近期遇到个问题,需要计算平面内点到直线的距离,发现数学知识都还给老师了,度娘后找到计算方法,特此记录. 点到直线的计算公式: 通过公式推导,得到信息: A:直线斜率 B:固定值-1 C:直线截距b 转 ...

  9. python类之间相互调用_python相互调用

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python调用perl则不需要系统环境:windows7python版本:2. ...

最新文章

  1. java输出机票问题_java编程,机票例题纠正改错,谢谢
  2. 大年初一,今年的春晚你看了吗?
  3. springboot 单例_如何实现一个单例及优化
  4. php怎么取request,PHP-如何在Guzzle中获取Request对象?
  5. C语言-字符串处理函数strcpy
  6. 航拍高手、吉他十级,6500+Star 开源项目作者,后浪程序员给力!
  7. 在odoo服务器文件夹,在windows10上安装odoo12开发环境的方法
  8. X509Certificate类解析证书的差异,算是.Net的BUG吗?
  9. 联机(脱机)手写汉字识别
  10. 什么是局域网?什么是广域网?CCNP是什么证书?电信能提供长途数据线路吗?
  11. idea运行web项目光标乱跳
  12. java程序设计课后答案 刘慧宁_【单选题】建筑立面图中,室外地坪轮廓线应用( )。...
  13. Debian下的搜狗拼音安装个人心得
  14. RSA算法详解与举例
  15. “双花”问题及解决之道
  16. 程序员成为“备胎”的5年,我一直在等...(外包——字节跳动)
  17. echarts地图下钻与回钻
  18. BlockChain初识
  19. Sql Server 生成 Word 文档 表结构
  20. 编程练习:既是完全平方数又有两位数字相同的三位数

热门文章

  1. Java,AXIS,webService 调用 完整实例 xml 入参出参
  2. roads 用户体验标准_全球领先技术加持,联发科 天玑1000+刷新5G用户体验新标准...
  3. SVN提交时出现locked错误解决办法
  4. 谈谈对ThreadLocal的理解?(基于jdk1.8)
  5. String、StringBuilder、StringBuffer的区别
  6. Vue 封装的过渡与动画
  7. 实验楼 linux内核原理与分析,《Linux内核原理与分析》第一周作业 20189210
  8. Spring Boot————ApplicationListener实现逃课事件监听
  9. Docker必备知识整理
  10. linux系统atom安装教程,Ubuntu/Linux Mint上安装Atom文本编辑器