---------------------------------------------目錄--------------------------------------------
一.Igraph簡(jiǎn)介
二.Igraph網(wǎng)絡(luò)圖創(chuàng)建與優(yōu)化
三.網(wǎng)絡(luò)圖信息價(jià)值挖掘
四.小結(jié)
---------------------------------------------正文--------------------------------------------
一.Igraph簡(jiǎn)介
問(wèn)題1:Igraph是什么,可以用來(lái)干什么笙纤?
Igraph是一個(gè)python工具包耗溜,它可以用于創(chuàng)建,操作和研究復(fù)雜網(wǎng)絡(luò)系統(tǒng)粪糙。
問(wèn)題2:為什么用Igraph强霎?
實(shí)際運(yùn)用過(guò)程中,很可能會(huì)遇到非常龐大的關(guān)系數(shù)據(jù)蓉冈,當(dāng)網(wǎng)絡(luò)規(guī)模急劇擴(kuò)大時(shí)城舞,情況會(huì)變得紛繁復(fù)雜,處理網(wǎng)絡(luò)結(jié)構(gòu)的代價(jià)和開(kāi)銷也會(huì)隨之增大寞酿,Igraph很多功能使用C語(yǔ)言開(kāi)發(fā)家夺,運(yùn)算效率很高,十分適合解決大型復(fù)雜網(wǎng)絡(luò)問(wèn)題伐弹。另外拉馋,Igraph實(shí)現(xiàn)了一些復(fù)雜網(wǎng)絡(luò)算法,如網(wǎng)絡(luò)流惨好、圖同構(gòu)煌茴、匹配算法以及社團(tuán)結(jié)構(gòu)等,分析的時(shí)候更加方便高效日川。
問(wèn)題3:如何安裝和使用Igraph包呢蔓腐?
可以直接執(zhí)行命令pip install python-igraph
安裝。
或者下載igraph安裝包后龄句,先解壓安裝包回论;再cd到安裝包所在目錄散罕,如:cd C:\Users\user\Desktop\igraph
;最后執(zhí)行python setup.py install
就可以啦傀蓉。
安裝完畢后欧漱,運(yùn)行代碼:import igraph
,如果沒(méi)報(bào)錯(cuò)葬燎,代表已經(jīng)成功安裝误甚。
二.Igraph網(wǎng)絡(luò)圖創(chuàng)建與優(yōu)化
以中國(guó)古代戰(zhàn)國(guó)七雄為對(duì)象(點(diǎn)),不同國(guó)家若地理位置相鄰萨蚕,則認(rèn)為存在地理聯(lián)系(邊)靶草,以此為基準(zhǔn),試著創(chuàng)建一個(gè)簡(jiǎn)單的抽象網(wǎng)絡(luò)圖(這里只探究?jī)蓛上噜応P(guān)系岳遥,不保證地理方位的正確性):
# 創(chuàng)建一個(gè)空對(duì)象
g = igraph.Graph()
# 添加網(wǎng)絡(luò)中的點(diǎn)
vertex = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
g.add_vertices(vertex)
# 添加網(wǎng)絡(luò)中的邊
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)
# -----------------------其它信息-----------------------------
# 國(guó)家名稱
g.vs['label'] = ['齊', '楚', '燕', '韓', '趙', '魏', '秦']
# 國(guó)家大致相對(duì)面積(為方便顯示沒(méi)有采用真實(shí)面積)
g.vs['aera'] = [50, 100, 70, 40, 60, 40, 80]
# 統(tǒng)計(jì)日期
g['Date'] = '公元前279年'
# -----------------------簡(jiǎn)單作圖-----------------------------
# 選擇圖的布局方式
layout = g.layout('kk')
# 用Igraph內(nèi)置函數(shù)繪圖
igraph.plot(g, layout)
這張圖不是很美觀奕翔,那么如何去優(yōu)化和完善它呢?比如說(shuō)點(diǎn)的顏色浩蓉、大小派继,邊的長(zhǎng)短、粗細(xì)等捻艳〖菘撸可以通過(guò)調(diào)節(jié)igraph.plot()中的參數(shù)達(dá)到我們想要的效果:
# -----------------------設(shè)置參數(shù)-----------------------------
# 參數(shù)集合。visual_style是一個(gè)參數(shù)字典认轨,可以動(dòng)態(tài)添加想要個(gè)性化設(shè)定的參數(shù)
visual_style = {}
# 根據(jù)相對(duì)面積绅络,設(shè)置點(diǎn)的大小
visual_style["vertex_size"] = g.vs['aera']
# 根據(jù)國(guó)家實(shí)力,設(shè)置點(diǎn)的顏色
visual_style["vertex_color"] = [color_map[power] for power in g.vs["power"]]
# 邊的粗細(xì)(這里隨機(jī)生成)
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)
PS:看懂以上代碼嘁字,就了解了Igraph中基本的網(wǎng)絡(luò)圖的構(gòu)建方法恩急,以及可視化展示的常用參數(shù)設(shè)置方法。接下來(lái)纪蜒,重點(diǎn)講講如何從這些網(wǎng)絡(luò)圖中找出一些有價(jià)值的信息衷恭。
三.網(wǎng)絡(luò)圖信息價(jià)值挖掘
那么,基于這張圖纯续,有哪些有價(jià)值的信息可以挖掘呢随珠?
1.節(jié)點(diǎn)的度(degree)。
概念:某節(jié)點(diǎn)的度猬错,只與該節(jié)點(diǎn)有直接聯(lián)系的其它點(diǎn)的個(gè)數(shù)窗看。在有向圖中,度還可分為出度(out-defree)和進(jìn)度(in-degree)倦炒,它一定程度上表現(xiàn)了某節(jié)點(diǎn)周圍的密集程度显沈。
在本例中,度的實(shí)際含義是一個(gè)國(guó)家的鄰國(guó)數(shù)量析校。
# 點(diǎn)的度
numbers = g.degree()
# 不同國(guó)家鄰國(guó)數(shù)量
neighbors = dict(zip(g.vs['label'], numbers))
print(neighbors)
輸出結(jié)果:
{'魏': 3, '燕': 2, '趙': 4, '楚': 3, '齊': 3, '韓': 3, '秦': 4}
2.中介中心性(betweenness)构罗。
概念:一個(gè)結(jié)點(diǎn)擔(dān)任其它兩個(gè)結(jié)點(diǎn)之間最短路路勁的橋梁的次數(shù),次數(shù)越多智玻,該數(shù)越大遂唧。
在本例中指的是國(guó)家起到的樞紐作用大小。
# 計(jì)算中介中心性
betweenness = g.betweenness()
# 保留一位小數(shù)
betweenness = [round(i, 1) for i in betweenness]
# 與國(guó)家名對(duì)應(yīng)
country_betweenness = dict(zip(g.vs['label'], betweenness))
print('不同國(guó)家的中介中心性(樞紐作用):\n', country_betweenness)
輸出結(jié)果:
不同國(guó)家的中介中心性(樞紐作用):
{'魏': 0.8, '燕': 0.0, '趙': 4.2, '楚': 1.8, '齊': 1.8, '韓': 0.5, '秦': 1.8}
3.另一個(gè)非常常見(jiàn)的操作是找兩個(gè)點(diǎn)之間的最短路徑吊奢。
概念:任選兩個(gè)節(jié)點(diǎn)盖彭,連通這兩個(gè)節(jié)點(diǎn)的最少邊數(shù),定義為這兩個(gè)節(jié)點(diǎn)的最短路徑長(zhǎng)度页滚。
當(dāng)然召边,這里所指的最短路徑,只用來(lái)表示不同國(guó)家間的抽象地理關(guān)系裹驰,和實(shí)際中的最短路徑含義并不一致隧熙。
# 計(jì)算魏國(guó)和齊國(guó)的最短路徑(如有多條路徑,只取其中之一)
path = g.get_shortest_paths('c', 'd')[0]
seq = g.vs.select(path)
print('燕韓之間的最短路徑: ', seq['label'])
輸出文字結(jié)果:
燕韓之間的最短路徑: ['燕', '齊', '楚', '韓']
將最短路徑用紅色標(biāo)記:
# --------------------------路徑-----------------------------
path = seq['name']
# ---------------------給邊設(shè)定顏色---------------------------
# 默認(rèn)為黑色
edge_color = dict(zip(edges, ['black']*11))
# 最短路徑里的邊映射為紅色幻林。映射時(shí)需要考慮元組中對(duì)象順序贞盯,這里按字母從小到大排序
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)
四.小結(jié)
理解網(wǎng)絡(luò)圖的角度很多,往往是對(duì)圖網(wǎng)絡(luò)進(jìn)行某種程度的抽象統(tǒng)計(jì)或聚焦觀察沪饺。以上只是舉了一個(gè)通俗易懂的小例子躏敢,實(shí)現(xiàn)了網(wǎng)絡(luò)圖的創(chuàng)建和展示,并提供了幾種分析圖信息的方法整葡,可以作為初步理解網(wǎng)絡(luò)結(jié)構(gòu)的工具件余。