用Igraph創(chuàng)建關(guān)系網(wǎng)絡(luò)&簡單網(wǎng)絡(luò)分析

---------------------------------------------目錄--------------------------------------------

一.Igraph簡介

二.Igraph網(wǎng)絡(luò)圖創(chuàng)建與優(yōu)化

三.網(wǎng)絡(luò)圖信息價(jià)值挖掘

四.小結(jié)

---------------------------------------------正文--------------------------------------------

一.Igraph簡介

問題1:Igraph是什么,可以用來干什么?

Igraph是一個(gè)python工具包,它可以用于創(chuàng)建,操作和研究復(fù)雜網(wǎng)絡(luò)系統(tǒng)。

問題2:為什么用Igraph?
實(shí)際運(yùn)用過程中,很可能會(huì)遇到非常龐大的關(guān)系數(shù)據(jù),當(dāng)網(wǎng)絡(luò)規(guī)模急劇擴(kuò)大時(shí),情況會(huì)變得紛繁復(fù)雜,處理網(wǎng)絡(luò)結(jié)構(gòu)的代價(jià)和開銷也會(huì)隨之增大,Igraph很多功能使用C語言開發(fā),運(yùn)算效率很高,十分適合解決大型復(fù)雜網(wǎng)絡(luò)問題。另外,Igraph實(shí)現(xiàn)了一些復(fù)雜網(wǎng)絡(luò)算法,如網(wǎng)絡(luò)流、圖同構(gòu)、匹配算法以及社團(tuán)結(jié)構(gòu)等,分析的時(shí)候更加方便高效。

問題3:如何安裝和使用Igraph包呢?
可以直接執(zhí)行命令pip install python-igraph安裝。
或者下載igraph安裝包后,先解壓安裝包;再cd到安裝包所在目錄,如:cd C:\Users\user\Desktop\igraph;最后執(zhí)行python setup.py install就可以啦。
安裝完畢后,運(yùn)行代碼:import igraph,如果沒報(bào)錯(cuò),代表已經(jīng)成功安裝。

二.Igraph網(wǎng)絡(luò)圖創(chuàng)建與優(yōu)化
以中國古代戰(zhàn)國七雄為對(duì)象(點(diǎn)),不同國家若地理位置相鄰,則認(rèn)為存在地理聯(lián)系(邊),以此為基準(zhǔn),試著創(chuàng)建一個(gè)簡單的抽象網(wǎng)絡(luò)圖(這里只探究兩兩相鄰關(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)
# -----------------------其它信息-----------------------------
# 國家名稱
g.vs['label'] = ['齊', '楚', '燕', '韓', '趙', '魏', '秦']
# 國家大致相對(duì)面積(為方便顯示沒有采用真實(shí)面積)
g.vs['aera'] = [50, 100, 70, 40, 60, 40, 80]
# 統(tǒng)計(jì)日期
g['Date'] = '公元前279年'
# -----------------------簡單作圖-----------------------------
# 選擇圖的布局方式
layout = g.layout('kk')
# 用Igraph內(nèi)置函數(shù)繪圖
igraph.plot(g, layout)
戰(zhàn)國勢(shì)力地理關(guān)系圖1.0

這張圖不是很美觀,那么如何去優(yōu)化和完善它呢?比如說點(diǎn)的顏色、大小,邊的長短、粗細(xì)等。可以通過調(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ù)國家實(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)
戰(zhàn)國勢(shì)力地理關(guān)系圖1.1

PS:看懂以上代碼,就了解了Igraph中基本的網(wǎng)絡(luò)圖的構(gòu)建方法,以及可視化展示的常用參數(shù)設(shè)置方法。接下來,重點(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è)國家的鄰國數(shù)量。

# 點(diǎn)的度
numbers = g.degree()
# 不同國家鄰國數(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ù)越大。
在本例中指的是國家起到的樞紐作用大小。

# 計(jì)算中介中心性
betweenness = g.betweenness()
# 保留一位小數(shù)
betweenness = [round(i, 1) for i in betweenness]
# 與國家名對(duì)應(yīng)
country_betweenness = dict(zip(g.vs['label'], betweenness))
print('不同國家的中介中心性(樞紐作用):\n', country_betweenness)

輸出結(jié)果:

不同國家的中介中心性(樞紐作用):
 {'魏': 0.8, '燕': 0.0, '趙': 4.2, '楚': 1.8, '齊': 1.8, '韓': 0.5, '秦': 1.8}
中介中心性

3.另一個(gè)非常常見的操作是找兩個(gè)點(diǎn)之間的最短路徑。
概念:任選兩個(gè)節(jié)點(diǎn),連通這兩個(gè)節(jié)點(diǎn)的最少邊數(shù),定義為這兩個(gè)節(jié)點(diǎn)的最短路徑長度。
當(dāng)然,這里所指的最短路徑,只用來表示不同國家間的抽象地理關(guān)系,和實(shí)際中的最短路徑含義并不一致。

# 計(jì)算魏國和齊國的最短路徑(如有多條路徑,只取其中之一)
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)
燕韓最短路徑標(biāo)識(shí)

四.小結(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)的工具。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • feisky云計(jì)算、虛擬化與Linux技術(shù)筆記posts - 1014, comments - 298, trac...
    不排版閱讀 4,352評(píng)論 0 5
  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個(gè) Awesome - XXX 系列...
    小邁克閱讀 3,124評(píng)論 1 3
  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個(gè) Awesome - XXX 系列...
    aimaile閱讀 26,835評(píng)論 6 427
  • 英文原版:https://github.com/vinta/awesome-python中文版:https://g...
    會(huì)灰的大飛狼閱讀 3,697評(píng)論 1 56
  • 其實(shí),這本書的封面設(shè)計(jì)給我的感覺就很不好。流線型的金屬外殼,用鉚釘連接,一塊接一塊,白色細(xì)斜體的書名“孤獨(dú)深處”。...
    單海閱讀 995評(píng)論 0 1

友情鏈接更多精彩內(nèi)容