[編者按] Python是大數據分析的常用技術之一,用Python進行數據分析的眾多優勢使得越來越多的人開始走上Python數據分析之路。後臺也常常有讀者來信,希望我們分享關於Python數據分析的知識。從本期開始,我們推出「小白學Python數據分析」專欄,本專欄邀請到一位Python數據分析的初學者小白,記錄他學習Python數據分析的歷程。大家可以和小白一起學習,並完成每期專欄中的實例,就可以掌握Python數據分析的常用方法和技術。教材方面,我們參考的是王宏志老師編著的《大數據分析原理與實踐》。由於小白也在學習過程中,所以文中難免會有認識和理解不當之處,歡迎大家批評指正,更歡迎大家通過後臺留言與我們進行討論交流,大家共同向Python數據分析高手的目標前進!
本期我們將學習如何用NetworkX庫進行結構分析,主要將討論以下內容:
NetworkX庫簡介
最短路徑分析
Pagerank算法
結構計數
聚類係數
社團發現
1. NetworkX庫簡介
NetworkX是一個用Python語言開發的圖論與複雜網絡建模工具,內置了常用的圖與複雜網絡分析算法,可以方便地進行複雜網絡數據分析、仿真建模等工作。Networkx支持創建簡單無向圖、有向圖和多重圖。內置許多標準的圖論算法,節點可為任意數據;支持任意的邊值維度,功能豐富,簡單易用。本文我們將採用這個庫來實現結構分析的若干問題。
2. 最短路徑分析
最短路徑分析的基本原理是貪心算法,通過輸入的起點和終點以及各個線段的長度來計算出任意兩點之間的距離。首先我們有如下的數據,第一列代表起點,第二列代表終點,最後一列是長度:
然後我們載入這個文件,對數據進行處理:
在NetworkX中採用G=nx.Graph()來構建一個網絡,之後就可以進行計算:
搭好網絡以後我們可以畫圖,採用nx.draw:
可以輸出的圖像如下:
最後我們計算各個點之間的路徑長度的部分是:
得到輸出:
其中第一行是起點,第二行是終點,第三行是最短路徑長度,最短路徑計算完成。
3.Pagerank算法
PageRank起於網頁的搜索排序,Google 利用網頁的連結結構計算每個網頁的等級排名,其基本思路是:如果一個網頁被其他多個網頁指向,這說明該網頁比較重要或者質量較高。除考慮網頁的連結數量,還考慮網頁本身的權重級別,以及該網頁有多少條出鏈到其它網頁。對於用戶構成的人際網絡,除了用戶本身的影響力之外,邊的權重也是重要因素之一。例如,新浪微博的某個用戶,會更容易影響粉絲中關係比較親密的家人、同學、同事等,而對陌生的弱關係粉絲影響較小。
在NetworkX中有pagerank算法可以直接導出各個點的PR值(pagerank值),我們可以直接使用,但是要先按照(一)中的方法搭建一個網絡結構,然後再交由pagerank計算,在此不贅述搭建過程:
得到輸出結果為:
第一行為節點,第二行為pagerank值。
4.結構計數(以三角形為例)
對於三角形計數,在Networkx中有內置的triangles函數來完成三角形結構的計算。函數如下:
triangles函數的標準形式是:triangles(G, nodes=None)。G是提前編好的網絡,網絡的構建方法與前面一致。後面的nodes是需要參與計算的點,如果只想將某些點加入到計算體系中,就在「nodes=「後寫上你想加的點,如果沒有加上這個參量,默認為計算所有的點。
加入計算的點如下:
得出的結果為:
輸出的數據代表某個點是多少個三角形的公共頂點,例如:1是四個三角形的頂點。
5.聚類係數
結構聚類指的是對圖中的結點和邊進行聚類。對於結點聚類,輸入圖G,輸出其結點的分類,使得每個分類在結構上關聯密切。
我們用Python中的Networkx庫的clustering函數來說明點結構聚類的定義和實現。點聚類係數在無向圖G中,計算每一個節點周圍的稠密度,星狀網絡稠密度為0,全聯通網絡稠密度為1。邊聚類係數為在無向圖G中,計算每一條邊周圍的稠密度。
以點聚類係數為例,點聚類係數計算數據採用無向圖,該無向圖如下所示:
對應的列表為:
函數clustering(G,nodes=None, weight=None)的使用和前面的triangle類似,在此不贅述,結果如下:
6.社團發現
一個社區就是一個包含比其他圖的節點之間連接更加稠密的子圖;一個圖是一個社區結構若且唯若任意子圖內的連接數量比子圖之間的連接數目多得多。一般來說,同一社區內的節點與節點之間的連接很緊密,而社區與社區之間的連接比較稀疏。
Python的Networkx的k_clique_communities函數可以進行社團發現,這裡函數引用的是clique滲透算法,具體算法思路複雜,可以查閱下相關資料。
k_clique_communities的輸入結構和之前的兩個函數一樣,它有兩個輸入參量,一個是我們之前輸入的結構G,還有一個是設置的最小社群的節點個數。最後將返回的結果進行list轉化就可以列印出我們需要的答案了。
在這期文章中,我們主要介紹了Networkx的安裝和一些簡單的使用方法及其應用。這個庫是Python中能夠進行結構分析的一個非常好的庫,其中的函數和用法博大精深,有網絡結構分析需求的同學可以好好研究一下這個庫,它將對你的數據分析起到很大的作用。
「大數據與數據科學家」公眾號
主編:王宏志
特邀副主編: 朱劼
副主編: 丁小歐
責任編輯: 齊志鑫,宋揚,王雨茁、魏龑,張榮恩
編輯: 陶穎安
-精彩內容,記得分享到朋友圈-
長按下圖並點擊 「識別圖中二維碼」,即可關注大數據與數據科學家微信公共號