這個(gè)圖聚類 Python 開源工具火了:可對社群結(jié)構(gòu)進(jìn)行可視化、檢測
最近,又有一款Python可視化工具火了。
這一次,功能是針對圖聚類問題的社群結(jié)構(gòu)進(jìn)行檢測、可視化。
該項(xiàng)目的帖子在reddit上一經(jīng)發(fā)布,就被頂?shù)搅恕皺C(jī)器學(xué)習(xí)板塊”的榜首。
一起來看看它究竟都能用來做什么吧~
功能亮點(diǎn)
這款工具叫做communities, 是一個(gè)Python庫,用于圖聚類問題的社群結(jié)構(gòu)檢測。
它支持多種算法,包括:
-
Louvain算法; -
Girvan-Newman算法; -
層次聚類算法; -
光譜聚類算法; -
Bron-Kerbosch算法。
更贊的是,communities還可以實(shí)現(xiàn)這些算法的可視化。
具體了解一下~
導(dǎo)入算法并插入矩陣
這里以Louvain算法為例。
這是一種基于模塊度的社群發(fā)現(xiàn)算法,也是貪心算法。
它根據(jù)頂點(diǎn)的共享邊將頂點(diǎn)排列成社群結(jié)構(gòu),也就是說,它將節(jié)點(diǎn)分為幾個(gè)社群,每個(gè)社群之間共享很少的連接,但是同一社群的節(jié)點(diǎn)之間共享許多連接。
最終,讓整個(gè)社群網(wǎng)絡(luò)呈現(xiàn)出一種模塊聚集的結(jié)構(gòu),實(shí)現(xiàn)整個(gè)社群網(wǎng)絡(luò)的模塊度的最大化。
所以首先,我們需要構(gòu)建一個(gè)表示無向圖的鄰接矩陣,可以加權(quán),也可以不加權(quán),矩陣為2Dnumpy數(shù)組。
n*n矩陣則表示有n個(gè)節(jié)點(diǎn),矩陣的每個(gè)位置分別表示各節(jié)點(diǎn)之間邊的關(guān)系,有邊則為1,沒有邊則為0。
然后,只需從communities.algorithms中導(dǎo)入算法并插入矩陣。
接下來輸出社群列表,每個(gè)社群即為一組節(jié)點(diǎn)。
實(shí)現(xiàn)可視化,并進(jìn)行顏色編碼
利用communities將圖進(jìn)行可視化,將節(jié)點(diǎn)分到社群中并進(jìn)行顏色編碼,還可以選擇深色或淺色背景、保存圖片、選擇圖片的分辨率等等 。
其中各參數(shù)的具體含義為:
-
adj_matrix (numpy.ndarray):圖的鄰接矩陣; -
dark (bool, optional (default=False)):如果為 True, 則繪圖為深色背景,否則為淺色背景; -
filename (str or None, optional (default=None)):通過 filename 路徑可以將圖另存為PNG格式; 設(shè)置 None 則是用交互方式顯示圖; -
dpi (int or None, optional (default=None)):每英寸的點(diǎn)數(shù),控制圖像的分辨率; -
seed (int, optional (default=2)):隨機(jī)種子。
具體到Louvain算法的可視化,代碼是這樣的:
動(dòng)畫呈現(xiàn)算法
communities 還可以動(dòng)畫呈現(xiàn)節(jié)點(diǎn)分配到社群的過程。
其中各參數(shù)的含義如下:
-
adj_matrix (numpy.ndarray):圖的鄰接矩陣; -
frames (list):算法每次迭代的字典列表; -
每個(gè)字典都有倆個(gè)鍵:“C”包含節(jié)點(diǎn)到社群的查找表,“Q”表示圖的模塊度數(shù)值; -
此字典列表是 louvain_method的第二個(gè)返回值; -
dark (bool, optional (default=False)):如果為 True, 則動(dòng)畫為深色背景和配色方案,否則為淺色方案; -
duration (int, optional (default=15)):動(dòng)畫所需的持續(xù)時(shí)間,以秒為單位; -
filename (str or None, optional (default=None)):通過filename 路徑將動(dòng)畫存為GIF;設(shè)置None則以交互方式展示動(dòng)畫; -
dpi (int or None, optional (default=None)):每英寸點(diǎn)數(shù),控制動(dòng)畫的分辨率; -
seed (int, optional (default=2)):隨機(jī)種子。
例如,空手道俱樂部網(wǎng)絡(luò)中Louvain算法的動(dòng)畫呈現(xiàn):
我們可以看到Louvain算法的動(dòng)態(tài)過程:
-
首先掃描數(shù)據(jù)中的所有節(jié)點(diǎn),將每個(gè)節(jié)點(diǎn)看做一個(gè)獨(dú)立的社群; -
接下來,遍歷每個(gè)節(jié)點(diǎn)的鄰居節(jié)點(diǎn),判斷是否將該節(jié)點(diǎn)加入鄰居節(jié)點(diǎn)所在的社群,以提升模塊度; -
這一過程重復(fù)迭代,直到每一個(gè)節(jié)點(diǎn)的社群歸屬穩(wěn)定; -
最后,將所有在同一個(gè)社群的節(jié)點(diǎn)壓縮成一個(gè)新節(jié)點(diǎn),計(jì)算新節(jié)點(diǎn)的權(quán)重,直到整個(gè)圖的模塊度穩(wěn)定。
大家可以通過文末鏈接,自行嘗試一下其他算法~
此外,它還可以用于社群間鄰接矩陣、拉普拉斯矩陣以及模塊度矩陣等。
對于這款工具,不少網(wǎng)友發(fā)出“awesome”、“really cool!”等花式贊嘆,表示正是自己需要的。
當(dāng)然,也有網(wǎng)友提出疑問,例如:是否可以指定執(zhí)行的迭代次數(shù)(例如:提前停止)?
開發(fā)者對此表示:不能,但是對于某些算法,可以指定要將圖形劃分為多少個(gè)社群。
項(xiàng)目開發(fā)者Jonathan Shobrook,他目前是美國一家電商公司的軟件工程師。
之前GitHub上的熱門項(xiàng)目Rebound,也是出自他手,已經(jīng)獲得3.5k星。
更多信息可戳下方鏈接了解~
相關(guān)鏈接:
[1]https://github.com/shobrook/communities[2]https://www.reddit.com/r/MachineLearning/comments/lozys9/p_i_made_communities_a_library_of_clustering/
文章來源于網(wǎng)絡(luò),侵刪!