search
尋找貓咪~QQ 地點 桃園市桃園區 Taoyuan , Taoyuan

Flownetwork:流網路的開源Python包

開放的流網路(Open Flow Network),或流動網路,也簡稱流網路(Flow Network)是指一類特殊的加權有向的複雜網路。其中,有向連邊表示能量、物質、貨幣、信息、注意力等流動的方向,連邊的權重則表示流量。開放性體現為網路中存在著源和匯兩類特殊的節點代表環境。目前,開放流網路這種模型已經被應用到了生態能量流分析、國際貿易流分析、投入產出關係、大規模的人類行為、集體注意力流等多個學科背景中去了。

南京大學的王成軍老師和芝加哥大學的吳令飛博士開發了一個開源工具包Flownetwork,將常用的計算都集成到了一起。初學者可以直接調用該包完成各種有關開放流網路的計算。

該包的主要功能如下:https://github.com/chengjun/flownetwork(或點擊閱讀原文)

1

操作演示

首先需要安裝flownetwork的包,打開一個終端輸入:

pip install flownetwork

然後可以在jupyter notebook(或者其他的地方)中導入安裝包:

# import packages from flownetwork import flownetwork as fn import networkx as nx import matplotlib.pyplot as plt print(fn.__version__)

然後進行注意力網路的分析:

首先我們可以用help語句來查看一下這個流網路的結構:

help(fn.constructFlowNetwork)Help on function constructFlowNetwork in module flownetwork.flownetwork: constructFlowNetwork(C) C is an array of two dimentions, e.g., C = np.array([[user1, item1], [user1, item2], [user2, item1], [user2, item3]]) Return a balanced flow networ

在了解了這個網路的架構之後,我們就可以自己創建一個流網路:

demo = fn.attention_data gd = fn.constructFlowNetwork(demo)

為了更好的了解這個流網路的結構,我們可以利用matplotlib畫出這個demo的流網路:

# drawing a demo network fig = plt.figure(figsize=(12, 8),facecolor='white') pos={0: np.array([ 0.2 , 0.8]), 2: np.array([ 0.2, 0.2]), 1: np.array([ 0.4, 0.6]), 6: np.array([ 0.4, 0.4]), 4: np.array([ 0.7, 0.8]), 5: np.array([ 0.7, 0.5]), 3: np.array([ 0.7, 0.2 ]), 'sink': np.array([ 1, 0.5]), 'source': np.array([ 0, 0.5])} width=[float(d['weight']*1.2) for (u,v,d) in gd.edges(data=True)] edge_labels=dict([((u,v,),d['weight']) for u,v,d in gd.edges(data=True)])nx.draw_networkx_edge_labels(gd,pos,edge_labels=edge_labels, font_size = 15, alpha = .5) nx.draw(gd, pos, node_size = 3000, node_color = 'orange', alpha = 0.2, width = width, edge_color='orange',style='solid') nx.draw_networkx_labels(gd,pos,font_size=18) plt.show

然後我們就畫出了這個demo的流網路圖:

利用下面這條語句,我們查看一下這個demo的一些信息:

nx.info(gd)

如果網路沒有達到平衡的話,我們就對網路進行流平衡:

# balancing the network # if it is not balanced gh = fn.flowBalancing(cd) nx.info(gh)

計算網路的流矩陣,存儲在m中:

# flow matrix
m = fn.getFlowMatrix(gd) m

我們可以看到輸出的流矩陣的信息是下面這樣子的:

matrix([[ 0., 1., 0., 0., 3., 1., 0., 0., 0.], [ 0., 0., 3., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 2., 0., 0., 0., 0., 2.], [ 0., 0., 0., 0., 0., 0., 0., 0., 2.], [ 0., 0., 0., 0., 0., 1., 0., 0., 2.], [ 0., 0., 0., 0., 0., 0., 0., 0., 2.], [ 0., 0., 0., 0., 0., 0., 0., 0., 1.], [ 5., 2., 1., 0., 0., 0., 1., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0., 0., 0.]])

計算網路的馬可夫矩陣:

fn.getMarkovMatrix(m)

我們可以看到輸出的馬可夫矩陣是下列數組的形式:

array([[ 0., 0.2 , 0., 0., 0.6 ,0.2 , 0., 0., 0.], [ 0., 0., 1., 0., 0.,0., 0., 0., 0.], [ 0., 0., 0., 0.5 , 0.,0., 0., 0., 0.5 ], [ 0., 0., 0., 0., 0.,0., 0., 0., 1.], [ 0., 0., 0., 0., 0.,0.33333333, 0., 0., 0.66666667], [ 0., 0., 0., 0., 0.,0., 0., 0., 1.], [ 0., 0., 0., 0., 0.,0., 0., 0., 1.], [ 0.55555556, 0.22222222, 0.11111111, 0., 0.,0., 0.11111111, 0., 0.], [ 0., 0., 0., 0., 0.,0., 0., 0., 0.]])

接著我們計算無窮步長的累積馬可夫轉移矩陣:

fn.getUmatrix(gd)

我們可以看到輸出的矩陣是下面這個樣子的:

matrix([[ 1., 0.2 , 0.2 , 0.1 , 0.6 ,0.4 , 0.], [ 0., 1., 1., 0.5 , 0.,0., 0.], [ 0., 0., 1., 0.5 , 0.,0., 0.], [ 0., 0., 0., 1., 0.,0., 0.], [ 0., 0., 0., 0., 1.,0.33333333, 0.], [ 0., 0., 0., 0., 0.,1., 0.], [ 0., 0., 0., 0., 0.,0., 1.]])

最後來統計一下節點的耗散數據:

# return dissipationToSink,totalFlow,flowFromSource fn.networkDissipate(gd)

計算網路中給定節點1的出流和入流:

fn.outflow(gd, 1) fn.inflow(gd, 1)

計算網路中流的平均長度:

fn.averageFlowLength(gd)

計算流網路的平均時間矩陣:

fn.getAverageTimeMatrix(gd)

最後我們進行畫圖操作:

首先將流網路轉為樹圖,然後做出 y = (x+x*[0,1))**3的函數圖像(雙對數坐標系下,近似直線) :

fig=plt.figure(figsize=(9.9),facecolor="white" ax=fig.add_subplot(111) fn.plotTree(gd,ax) plt.show from random import random x=np.array(range(1,100)) y=(x+random*x)**3 plt.plot(x,y) plt.xscale('log') plt.yscale("log") plt.show

這樣我們就畫出了第一張圖:

然後我們對: y = (x+x*[0,1))**3的函數圖像做最小二乘法線性擬合(雙對數條件下,近似直線) :

fn.alloRegressPlot(x,y,"r","s","$x$","$y$",loglog=True)

畫指數截斷的冪律分布圖:

rg = np.array([ 20.7863444 , 9.40547933, 8.70934714, 8.62690145, 7.16978087, 7.02575052, 6.45280959, 6.44755478, 5.16630287, 5.16092884, 5.15618737, 5.05610068, 4.87023561, 4.66753197, 4.41807645, 4.2635671 , 3.54454372, 2.7087178 , 2.39016885, 1.9483156 , 1.78393238, 1.75432688, 1.12789787, 1.02098332, 0.92653501, 0.32586582, 0.1514813 , 0.09722761]) fn.powerLawExponentialCutOffPlot(rg, '$x$', '$p(x)$')

得到如圖所示:

畫出DGBD圖:

fn.DGBDPlot(rg) fn.DGBDPlot(rg)

畫冪律分布圖及擬合曲線:

from networkx.utils import powerlaw_sequence pl_sequence = powerlaw_sequence(1000,exponent=2.5) fig = plt.figure(figsize=(4, 4),facecolor='white') ax = fig.add_subplot(111) fn.plotPowerlaw(pl_sequence,ax,'r','$x$')

畫出CCDF圖:

fig = plt.figure(figsize=(4, 4),facecolor='white') ax = fig.add_subplot(111) fn.plotCCDF(pl_sequence,ax,'b','$x$')

畫出基尼係數圖:

bins, result, gini_val = fn.gini_coefficient(np.array(pl_sequence)) plt.plot(bins, bins, '--', label="perfect") plt.plot(bins, result, label="observed") plt.title("$GINI: %.4f$" %(gini_val)) plt.legend(loc = 0, frameon = False) plt.show


參考資料

  • http://wiki.swarma.net/index.php/Python 集智wiki上面編寫的關於流網路的演算法

  • http://wiki.swarma.net/index.php/%E5%9F%BA%E4%BA%8E%E9%A9%AC%E5%B0%94%E7%A7%91%E5%A4%AB%E9%93%BE%E7%9A%84%E6%B5%81%E7%BD%91%E7%BB%9C%E5%88%86%E6%9E%90 集智wiki上編寫的關於基於馬可夫鏈的流網路分析

打包組課只需499¥

可開發票

團購享優惠

集智QQ群|292641157
商務合作|[email protected]
投稿轉載|[email protected]

加入「沒有圍牆的研究所」

讓蘋果砸得更猛烈些吧!



熱門推薦

本文由 yidianzixun 提供 原文連結

寵物協尋 相信 終究能找到回家的路
寫了7763篇文章,獲得2次喜歡
留言回覆
回覆
精彩推薦