python子图之间的距离_python与图论的桥梁——igraph
之前收集到一個關于紐約市全年出租車的數據集,于是想到,我們是不是可以用這個數據集來研究一下紐約市中各個社區之間的關聯度?為了研究這個問題,就需要使用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 structure2.什么是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屬于的communityintersections.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的全部內容,希望文章能夠幫你解決所遇到的問題。