python子图之间的距离_python与图论的桥梁——igraph

04b92a8f0bc13c3b63a7df529c64fdd0.png

之前收集到一个关于纽约市全年出租车的数据集,于是想到,我们是不是可以用这个数据集来研究一下纽约市中各个社区之间的关联度?为了研究这个问题,就需要使用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结构。

例如:

821b028572667ea7c2252f4e86501e19.png
community structure

以及:

ed72bb35eb90ad8458d8ca35840a1cbc.png
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)

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

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

160fb14f8a16f52cd1e74f5ff3f02cf7.png
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

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

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

5707b2b661b8fbcfdc96bd930d8bc137.png

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566350.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jmeter web监听结果_jmeter使用总结

1 jmeter简介Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。 可以用于测试静态和动态资源,例如静态文件、CGI 脚本、Java 对象、数据库、FTP 服务器…

金蝶报表制作_BI报表不光好看,更好用,为什么很多人却还不知道?

要在短时间内对海量数据实现有效的数据整理清洗,快速理清数据情况,掌握数据信息,可太为难一般的数据分析报表了。但既然大数据时代给了这样的数据分析难题,自然也会给出一个有效的解决方法——BI报表。但很奇怪,明明BI…

恒驰机器人_2545台机器人,1分钟造1辆车,恒大许家印的智能造车工厂首次曝光...

车企「造车」的势头只增不减。前有奔驰造车,后有特斯拉、小鹏、蔚来等新势力造车。 在「造车」界最近迎来一位「新秀」。凭借中国最大房地产开发商的名号跨界造车。在「造车」这件事情上高举高打,从自建工厂到连发六款新车,以投入千亿的势头打…

零窗口探测怎么抓包_Linux服务器下的HTTP抓包分析

说到抓包分析,最简单的办法莫过于在客户端直接安装一个Wireshark或者Fiddler了,但是有时候由于客户端开发人员(可能是第三方)知识欠缺或者其它一些原因,无法顺利的在客户端进行抓包分析,这种情况下怎么办呢…

三维重建 几何方法 深度学习_基于深度学习的三维重建算法:MVSNet、RMVSNet、PointMVSNet、Cascade系列...

欢迎关注微信公众号“3D视觉学习笔记”,分享博士期间3D视觉学习收获MVSNet:香港科技大学的权龙教授团队的MVSNet(2018年ECCV)开启了用深度做多视图三维重建的先河。2019年,2020年又有多篇改进:RMVSNet(CVPR2019),Point…

easypoi list中的map导出_如何优雅的导出 Excel

作者:你在我家门口来源:https://juejin.im/post/5c6b6b126fb9a04a0c2f024f前言公司项目最近有一个需要:报表导出。整个系统下来,起码超过一百张报表需要导出。这个时候如何优雅的实现报表导出,释放生产力就显得很重要了…

c++ list容器获取第n给元素_Java总结之容器家族--Collection*

一、概述Collection是[收集品]的意思,这里称[容器],是java中的一个接口,位于java.util包下Collection下有三大接口:List(列表)、Set(集合)、Queue(队列)容器接口子类及方法二、List接口List:列表,顾名思义是一种表结构&#xff0c…

eclipemaven本地仓库依赖_只用一招,让你Maven依赖下载速度快如闪电

一、背景众所周知,Maven对于依赖的管理让我们程序员感觉爽的不要不要的,但是由于这货是国外出的,所以在我们从中央仓库下载依赖的时候,速度如蜗牛一般,让人不能忍,并且这也是大多数程序员都会遇到的问题。今…

和华为杯_2019全国大学生物联网设计竞赛(华为杯)拉开序幕

由教育部高等学校计算机类专业教学指导委员会主办,四川大学承办,华为协办,上海交通大学和机械工业出版社华章公司联合支持的2019年全国大学生物联网设计竞赛(华为杯)全国巡回技术讲座暨宣传活动5月9日在郑州大学拉开序幕。全国大学生物联网设…

e.printstacktrace()为什么没有输出信息_不输入内容,能不能直接输出内容?

这段时间,我确信了一件事。想要输出内容,不需要“先输入”。直接输出,是能做到的。网络上流行一种观点:先输入,再输出!我认为这是错的。人可以不输入知识,直接输出内容。人在世界上活了这些年。…

int mysql_「MYSQL」MYSQL中的int(11)到底代表什么意思?

一、前言在工作中经常要与mysql打交道,但是对mysql的各个字段类型一直都是一知半解,因此写本文总结记录一番。二、简介对于int类型的一些基础知识其实上图已经说的很明白了,在这里想讨论下常用的int(11)代表什么意思,很长时间以来…

mysql初级数据库_MYSQL初级数据库操作

MYSQL是个好东西啊,只是比较会折腾人,所以我先记录一下MySQL 数据备份的基础知识,省得以后又去东找西找Windows文件名、目录名不区分大小写,Linux区分大小写查看MySQL中的数据库这里有一个shop的数据库,information_sc…

java中的mod运算_Java中的运算符与控制语句

运算符与控制语句是Java语言中运用最为基础也是最为广泛的,所以今天就详细的介绍下运算符与控制语句。一、运算符1.算数运算符1).单目运算符: 、- 、 、-- A: 表示 a.正号(一般省略);b.加法运算&#xff1b…

mysql如何查看表拥有的键_如何查看表或列的所有外键?

白板的微信表:SELECT TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAMEFROMINFORMATION_SCHEMA.KEY_COLUMN_USAGEWHEREREFERENCED_TABLE_SCHEMA ANDREFERENCED_TABLE_NAME TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFER…

laravel 自带的用户登录视图路径_Laravel实现找回密码及密码重置,详细操作

Laravel实现找回密码及密码重置功能在php实现与在这里实现会有什么区别呢,下面我们来看看Laravel中的例子,在php中就不介绍了大家都懂的。忘记密码是应用中常见的场景之一,Laravel5也提供了对密码重置的支持,我们只需稍微做一下配…

yii不能没有提示验证错误信息_安装Mac系统时提示”应用程序副本不能验证 它在下载过程...”的解决方法...

在安装旧版本macOS系统时,比如macOS Mojave 10.14、macOS Sierra、OS X El Capitan、OS X Yosemite、OS X Mavericks等系统,会出现错误无法安装:“应用程序副本不能验证 它在下载过程中可能已遭破坏或篡改”,“This copy of the I…

mysql hugepage_因未配置Hugepage会话数添增悲剧案例

今天一朋友反馈他们的一个数据库hang住了,通过ssh也不能登录系统,他们没有办法重启系统解决问题,现在想让我帮忙找出问题原因分析awr得出询问朋友,他们的库一般session保持在200个左右,这次突然飙升到750以上,属于异常情况分析监听日志看到在截图的时间内,整体访问较频繁,某个i…

ip地址自动切换器_网络IP切换器IPProviders下载_IPProviders官方版下载1.1.22

IPProviders官方版是非常强大的ip切换器助手,可以进行ip地址更换,网关和dns更改。使用方法很简单,用户只需要提前设置好ip地址,需要切换的时候就可以任意切换了,让你可以随意切换更改自己的IP地址,非常方便…

mysql心得体会一百字_MYSQL CPU 100%实例详解

MYSQL CPU 100%实例详解2011/7/2 11:19:19作者:xy我要评论(0)自己的一台主机(Windows 2003 IIS PHP MYSQL )近来 MySQL 服务进程 (mysqld-nt.exe) CPU 占用率总为 100% 高居不下。此主机有10个左右的 database, 分别给十个网站调用。据朋友测试,导致 …

mysql联合索引like_MySQL全文索引、联合索引、like查询、json查询速度大比拼

查询背景有一个表tmp_test_course大概有10万条记录,然后有个json字段叫outline,存了一对多关系(保存了多个编码,例如jy1577683381775)我们需要在这10万条数据中检索特定类型的数据,目标总数据量:2931条SELECTCOUNT(*) …