NetworkX提供了4種常見網(wǎng)絡(luò)的建模方法,分別是:規(guī)則圖,ER隨機圖,WS小世界網(wǎng)絡(luò)和BA無標度網(wǎng)絡(luò)。本文首先介紹在NetworkX生成這些網(wǎng)絡(luò)模型的方法,然后以BA無標度網(wǎng)絡(luò)的建模為例,分析利用NetworkX進行復(fù)雜網(wǎng)絡(luò)演化模型設(shè)計的基本思路,以便將來開發(fā)出我們自己的模型。同時這篇文章里還涉及到一點復(fù)雜網(wǎng)絡(luò)可視化的方法(后邊有時間會另文介紹網(wǎng)絡(luò)可視化的方法)。 一、規(guī)則圖 規(guī)則圖差不多是最沒有復(fù)雜性的一類圖了,在NetworkX中,用random_graphs.random_regular_graph(d, n)方法可以生成一個含有n個節(jié)點,每個節(jié)點有d個鄰居節(jié)點的規(guī)則圖。下面是一段示例代碼,生成了包含20個節(jié)點、每個節(jié)點有3個鄰居的規(guī)則圖: import networkx as nx
圖1 NetworkX生成的規(guī)則圖 二、ER隨機圖 ER隨機圖是早期研究得比較多的一類“復(fù)雜”網(wǎng)絡(luò),這個模型的基本思想是以概率p連接N個節(jié)點中的每一對節(jié)點。在NetworkX中,可以用random_graphs.erdos_renyi_graph(n,p)方法生成一個含有n個節(jié)點、以概率p連接的ER隨機圖: import networkx as nx 運行結(jié)果如下: 圖2 NetworkX生成的隨機圖
在NetworkX中,可以用random_graphs.watts_strogatz_graph(n, k, p)方法生成一個含有n個節(jié)點、每個節(jié)點有k個鄰居、以概率p隨機化重連邊的WS小世界網(wǎng)絡(luò),下面是一個例子: import networkx as nx 運行結(jié)果如下: 圖3 NetworkX生成的WS小世界網(wǎng)絡(luò)
在NetworkX中,可以用random_graphs.barabasi_albert_graph(n, m)方法生成一個含有n個節(jié)點、每次加入m條邊的BA無標度網(wǎng)絡(luò),下面是一個例子: import networkx as nx 運行結(jié)果如下: 圖4 NetworkX生成的BA無標度網(wǎng)絡(luò) 五、對BA模型實現(xiàn)代碼的分析 前面我們介紹了NetworkX提供的4種網(wǎng)絡(luò)演化模型的應(yīng)用方法,但僅停留在使用已有的模型是不夠的,實際工作中我們可能會自己開發(fā)一些網(wǎng)絡(luò)演化模型。利用NetworkX提供的數(shù)據(jù)結(jié)構(gòu),我們可以比較方便的完成這一工作。下面以NetworkX中BA模型的實現(xiàn)代碼為例,分析用NetworkX開發(fā)網(wǎng)絡(luò)演化模型的一般思路。NetworkX中關(guān)于網(wǎng)絡(luò)建模的代碼在random_graphs.py這個文件中,可以用記事本打開它。為了敘述簡便起見,我刪掉了原始代碼中的一些錯誤處理與初始條件定義的語句,紅色部分是翻譯后的注釋。 #定義一個方法,它有兩個參數(shù):n - 網(wǎng)絡(luò)節(jié)點數(shù)量;m - 每步演化加入的邊數(shù)量 注釋1:此步是關(guān)鍵,random.choice方法是從一個數(shù)組中隨機地挑選一個元素。由于repeated_nodes數(shù)組中的節(jié)點出現(xiàn)次數(shù)是正比于節(jié)點度的,所以這樣處理可以保證按度大小的概率選出節(jié)點,即實現(xiàn)了度優(yōu)先連接。如果是按正比于節(jié)點適應(yīng)性等非整數(shù)值優(yōu)先連接,可以參考我的另一篇博文《根據(jù)值的大小隨機取數(shù)組元素的方法》。 六、小結(jié) NetworkX的優(yōu)勢之一就是開源,這也是所有Python庫的優(yōu)勢(Python是腳本語言,它沒有辦法隱藏源代碼)。NetworkX的源代碼結(jié)構(gòu)清晰,風格簡練,注釋詳盡,是學習、研究復(fù)雜網(wǎng)絡(luò)不錯的參考資料。當然在這方面我也是初學者,更多的功能還需要在實際應(yīng)用中不斷去發(fā)掘和領(lǐng)會………… |
|