圖論與圖學(xué)習(xí)(二):圖算法

圖(graph)近來正逐漸變成機(jī)器學(xué)習(xí)的一大核心領(lǐng)域痴怨,比如你可以通過預(yù)測(cè)潛在的連接來理解社交網(wǎng)絡(luò)的結(jié)構(gòu)文判、檢測(cè)欺詐、理解汽車租賃服務(wù)的消費(fèi)者行為或進(jìn)行實(shí)時(shí)推薦橡庞。近日,數(shù)據(jù)科學(xué)家 Ma?l Fabien 在其博客上發(fā)布了涉及圖論印蔗、圖算法和圖學(xué)習(xí)的系列文章《圖論與圖學(xué)習(xí)》扒最。

本文是其中第二篇,介紹了圖算法华嘹。更多文章和對(duì)應(yīng)代碼可訪問:https://github.com/maelfabien/Machine_Learning_Tutorials

本文涵蓋以下主題:

  • 主要的圖算法
  • 示意圖和用例
  • Python 示例

首先進(jìn)行一些準(zhǔn)備工作吧趣,打開 Jupyter Notebook,導(dǎo)入以下軟件包:

import numpy as np
import random
import networkx as nx
from IPython.display import Image
import matplotlib.pyplot as plt

后文會(huì)使用 networkx 最新的 2.0 版本耙厚。networkx 是一個(gè)用于復(fù)雜網(wǎng)絡(luò)的結(jié)構(gòu)强挫、動(dòng)態(tài)和功能的創(chuàng)建、操作和研究的 Python 軟件包薛躬。
前一篇文章介紹了圖的主要種類以及描述一個(gè)圖的基本特性「┎常現(xiàn)在我們更加詳細(xì)地介紹圖分析/算法以及分析圖的不同方式。為了理解上下文型宝,這里給出一些圖算法的用例:

  • 實(shí)時(shí)欺詐檢測(cè)
  • 實(shí)時(shí)推薦
  • 精簡(jiǎn)法規(guī)遵從性
  • 復(fù)雜網(wǎng)絡(luò)的管理和監(jiān)控
  • 身份和訪問管理
  • 社交應(yīng)用/功能

目前大多數(shù)框架(比如 Python 的 networkx 或 Neo4J)支持的圖算法類別主要有三個(gè):

  • Pathfinding(尋路):根據(jù)可用性和質(zhì)量等條件確定最優(yōu)路徑八匠。我們也將搜索算法包含在這一類別中。這可用于確定最快路由或流量路由趴酣。

  • Centrality(中心性):確定網(wǎng)絡(luò)中節(jié)點(diǎn)的重要性梨树。這可用于識(shí)別社交網(wǎng)絡(luò)中有影響力的人或識(shí)別網(wǎng)絡(luò)中潛在的攻擊目標(biāo)。

  • Community detection(社群檢測(cè)):評(píng)估群體聚類的方式岖寞。這可用于劃分客戶或檢測(cè)欺詐等抡四。

我們將在第三篇文章中介紹圖中的機(jī)器學(xué)習(xí)和圖學(xué)習(xí)。

networkx 中的所有算法都可在這里找到:https://networkx.github.io/documentation/stable/reference/algorithms/index.html

我們只會(huì)介紹 networkx 中實(shí)現(xiàn)的最常見的基本算法慎璧。

一. 尋路和圖搜索算法

尋路算法是通過最小化跳(hop)的數(shù)量來尋找兩個(gè)節(jié)點(diǎn)之間的最短路徑床嫌。搜索算法不是給出最短路徑,而是根據(jù)圖的相鄰情況或深度來探索圖胸私。這可用于信息檢索厌处。

1. 搜索算法

圖搜索算法主要有兩種:

  • 寬度優(yōu)先搜索(BFS):首先探索每個(gè)節(jié)點(diǎn)的相鄰節(jié)點(diǎn),然后探索相鄰節(jié)點(diǎn)的相鄰節(jié)點(diǎn)
  • 深度優(yōu)先搜索(DFS):會(huì)嘗試盡可能地深入一條路徑岁疼,如有可能便訪問新的相鄰節(jié)點(diǎn)阔涉。


    BFS和DFS

2. 尋路算法

a. 最短路徑

最短路徑計(jì)算的是一對(duì)節(jié)點(diǎn)之間的最短的加權(quán)(如果圖有加權(quán)的話)路徑缆娃。

這可用于確定最優(yōu)的駕駛方向或社交網(wǎng)絡(luò)上兩個(gè)人之間的分離程度。

計(jì)算圖中的最短路徑的方法有很多瑰排,包括 Dijkstra 算法贯要,這是 networkx 中的默認(rèn)算法。

根據(jù)維基百科椭住,該算法的偽代碼如下:

  • 將圖中所有節(jié)點(diǎn)標(biāo)記為未訪問崇渗。創(chuàng)建一個(gè)所有未訪問節(jié)點(diǎn)的集合,稱為未訪問集京郑。

  • 為每個(gè)節(jié)點(diǎn)分配一個(gè)暫定的距離值:將我們的初始節(jié)點(diǎn)的該值設(shè)置為零宅广,將其它所有節(jié)點(diǎn)的該值設(shè)置為無窮。將初始起始節(jié)點(diǎn)設(shè)置為當(dāng)前節(jié)點(diǎn)些举。

  • 對(duì)于當(dāng)前節(jié)點(diǎn)跟狱,考察其所有未被訪問過的相鄰節(jié)點(diǎn)并計(jì)算通過當(dāng)前節(jié)點(diǎn)的暫定距離。比較新計(jì)算出的暫定距離與當(dāng)前分配的值户魏,配之以其中更小的值驶臊。舉個(gè)例子,如果當(dāng)前節(jié)點(diǎn) A 標(biāo)記的距離為 6叼丑,將其與相鄰節(jié)點(diǎn) B 連接的邊的長(zhǎng)度為 2关翎,則通過 A 到達(dá) B 的距離為 6+2=8。如果 B 之前被標(biāo)記的距離大于 8鸠信,則將其改為 8笤休。否則,保持其當(dāng)前的值症副。

  • 當(dāng)我們考察完當(dāng)前節(jié)點(diǎn)的所有未訪問節(jié)點(diǎn)時(shí)店雅,將當(dāng)前節(jié)點(diǎn)標(biāo)記為已訪問,并將其移出未訪問集贞铣。已訪問節(jié)點(diǎn)不會(huì)再次進(jìn)行檢查闹啦。

  • 如果目標(biāo)節(jié)點(diǎn)已被標(biāo)記為已訪問(當(dāng)規(guī)劃兩個(gè)特定節(jié)點(diǎn)之間的路由時(shí))或未訪問集中節(jié)點(diǎn)之間的最小暫定距離為無窮時(shí)(當(dāng)規(guī)劃一次完整的遍歷時(shí);當(dāng)初始節(jié)點(diǎn)與剩余的未訪問節(jié)點(diǎn)之間沒有連接時(shí)才會(huì)出現(xiàn)這種情況)辕坝,那么就停止操作窍奋。算法結(jié)束。

  • 否則酱畅,選擇標(biāo)記有最小暫定距離的未訪問節(jié)點(diǎn)琳袄,將其設(shè)置為新的「當(dāng)前節(jié)點(diǎn)」,然后回到步驟 3纺酸。

更多有關(guān)最短路徑問題的介紹請(qǐng)參閱:https://en.wikipedia.org/wiki/Shortest_path_problem

維基百科上 Dijkstra 算法示意圖

該算法的 Python 實(shí)現(xiàn)簡(jiǎn)單直接:

# Returns shortest path between each node
nx.shortest_path(G_karate)

這會(huì)返回圖中每個(gè)節(jié)點(diǎn)之間的最小路徑的列表:

{0: {0: [0],
    1: [0, 1],
    2: [0, 2],
    ...
b. 單源最短路徑

單源最短路徑(Single Source Shortest Path/SSSP)是找到給定節(jié)點(diǎn)與圖中其它所有節(jié)點(diǎn)之間的最短路徑窖逗。

這常用于 IP 網(wǎng)絡(luò)的路由協(xié)議。

c. 所有配對(duì)最短路徑

所有配對(duì)最短路徑(All Pairs Shortest Path / APSP)算法是找到所有節(jié)點(diǎn)對(duì)之間的最短路徑餐蔬。

盡管能夠提供相近的結(jié)果碎紊,但這比為每個(gè)節(jié)點(diǎn)對(duì)調(diào)用單源最短路徑算法更快佑附。該算法通常可用于確定交通網(wǎng)格的不同分區(qū)的流量負(fù)載仗考。

# Returns shortest path length between each node
list(nx.all_pairs_shortest_path_length(G_karate))

這會(huì)返回:

[(0,
    {0: 0,
    1: 1,
    2: 1,
    3: 1,
    4: 1,
    ...

d. 最小權(quán)重生成樹

最小權(quán)重生成樹(minimum spanning tree)是圖(一個(gè)樹)的一個(gè)子圖音同,其用權(quán)重和最小的邊連接了圖中的所有節(jié)點(diǎn)。

最小生成樹應(yīng)該用于無向圖秃嗜。

from networkx.algorithms import tree
mst = tree.minimum_spanning_edges(G_karate, algorithm='prim', data=False)
edgelist = list(mst)
sorted(edgelist)

這會(huì)返回:

[(0, 1),
(0, 2),
(0, 3),
(0, 4),
(0, 5),
(0, 6),
...

二. 社群檢測(cè)

社群檢測(cè)是根據(jù)給定的質(zhì)量指標(biāo)將節(jié)點(diǎn)劃分為多個(gè)分組权均。
這通常可用于識(shí)別社交社群锅锨、客戶行為或網(wǎng)頁主題螺句。社區(qū)是指一組相連節(jié)點(diǎn)的集合。但是橡类,目前關(guān)于社群還沒有廣泛公認(rèn)的定義,只是社群內(nèi)的節(jié)點(diǎn)應(yīng)該要密集地相連芽唇。

社群

1. Girvan Newman 算法

Girvan Newman 算法是一個(gè)用于發(fā)現(xiàn)社群的常用算法顾画。其通過逐步移除網(wǎng)絡(luò)內(nèi)的邊來定義社區(qū)。我們將居間性稱為「邊居間性(edge betweenness)」匆笤。這是一個(gè)正比于穿過該邊的節(jié)點(diǎn)對(duì)之間最短路徑的數(shù)量的值研侣。

該算法的步驟如下:

  • 計(jì)算網(wǎng)絡(luò)中所有已有邊的居間性。
  • 移除居間性最高的邊炮捧。
  • 移除該邊后庶诡,重新計(jì)算所有邊的居間性。
  • 重復(fù)步驟 2 和 3咆课,直到不再剩余邊末誓。

你可以通過 Python 使用以下代碼實(shí)現(xiàn)它:

from networkx.algorithms import community
k = 1
comp = community.girvan_newman(G_karate)for communities in itertools.islice(comp, k):
    print(tuple(sorted(c) for c in communities))

這會(huì)得到一個(gè)屬于每個(gè)社群的節(jié)點(diǎn)的列表(k=1 的意思是我們期望得到 2 個(gè)社群):

([0, 1, 3, 4, 5, 6, 7, 10, 11, 12, 13, 16, 17, 19, 21], [2, 8, 9, 14, 15, 18, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33])

如上給出的那樣,這個(gè)方法實(shí)在沒法擴(kuò)展书蚪。由于這個(gè)原因喇澡,Louvain 等方法已被開發(fā)出來。但是殊校,如果要運(yùn)行大規(guī)模的圖晴玖,這些方法需要很長(zhǎng)的時(shí)間。

2. Louvain 模塊性

在定義 Louvain 方法之前为流,需要介紹一下模塊性(modularity)的概念呕屎。模塊性是一個(gè)度量,衡量的是分組被劃分為聚類的程度:

模塊性

Louvain 方法的偽代碼如下:

  • 首先為每個(gè)節(jié)點(diǎn)分配一個(gè)社群
  • 交替執(zhí)行接下來的兩個(gè)步驟敬察,直到收斂
  • 創(chuàng)建一個(gè)帶有相鄰節(jié)點(diǎn)的新社群秀睛,以最大化模塊性
  • 創(chuàng)建一個(gè)新的加權(quán)的圖。之前步驟的社群變成圖的節(jié)點(diǎn)莲祸。

這個(gè)現(xiàn)在可能看起來有些讓人迷惑琅催。事實(shí)上居凶,我們現(xiàn)在唯一做的事情是將最近的節(jié)點(diǎn)劃分為分組,以便我們優(yōu)化模塊性指標(biāo)藤抡。

image

Louvain 方法
注意侠碧,Louvain 方法沒有理論上的保證,但實(shí)踐效果很好缠黍。Louvain 方法是 networkx 的一個(gè)子項(xiàng)目弄兜,參閱:https://python-louvain.readthedocs.io/en/latest/

首先,安裝軟件包:

pip install python-louvain

然后瓷式,計(jì)算最佳的劃分方式(基于 Louvain 方法):

import community
partition = community.best_partition(G_karate)pos = nx.spring_layout(G_karate)
plt.figure(figsize=(8, 8))
plt.axis('off')
nx.draw_networkx_nodes(G_karate, pos, node_size=600, cmap=plt.cm.RdYlBu, node_color=list(partition.values()))
nx.draw_networkx_edges(G_karate, pos, alpha=0.3)
plt.show(G_karate)
使用 Louvain 對(duì)空手道圖執(zhí)行的最佳劃分

4. 強(qiáng)互連的組分

強(qiáng)互連的組分(Strongly Connected Components /SCC)算法能找到有向圖中的互連節(jié)點(diǎn)的分組替饿。注意,在同一個(gè)分組中贸典,每個(gè)節(jié)點(diǎn)都必須從任意其它節(jié)點(diǎn)從兩個(gè)方向都到達(dá)视卢。

這通常用在圖分析過程的早期階段,能讓我們了解圖構(gòu)建的方式廊驼。舉個(gè)例子据过,這能讓我們探索財(cái)務(wù)報(bào)表數(shù)據(jù),了解誰擁有什么公司的股份妒挎。

5. 弱互連的組分(并查集)

弱互連的組分(Weakly Connected Components)绳锅,也稱為并查集(Union Find)算法,能找到有向圖中的互連節(jié)點(diǎn)的集合酝掩,在同一個(gè)集合中鳞芙,每個(gè)節(jié)點(diǎn)都可從任意其它節(jié)點(diǎn)到達(dá)。

這只需要節(jié)點(diǎn)對(duì)之間在一個(gè)方向上存在一條路徑即可期虾,而 SCC 則需要兩個(gè)方向都存在路徑原朝。和 SCC 一樣,并查集通常用在分析的早期階段镶苞,以理解圖的結(jié)構(gòu)竿拆。

并查集是一個(gè)預(yù)處理步驟,為了理解圖的結(jié)構(gòu)宾尚,在任何算法之前都是必需的丙笋。

我們可以使用下面的方法測(cè)試相連的有向圖:

nx.is_weakly_connected(G)
nx.is_strongly_connected(G)

或使用下面的方法測(cè)試無向圖:

nx.is_connected(G_karate)

這會(huì)返回一個(gè)布爾值。

一定要看看 networkx 文檔中有關(guān)連接性實(shí)現(xiàn)的問題:https://networkx.github.io/documentation/stable/reference/algorithms/component.html

6.分層聚類

在分層聚類(hierarchical clustering)中煌贴,我們構(gòu)建聚類的層次結(jié)構(gòu)御板。我們用樹狀圖的形式表示聚類。

樹狀圖

其思想是以不同的規(guī)模分析社群結(jié)構(gòu)牛郑。我們通常自下而上構(gòu)建樹狀圖怠肋。我們從每個(gè)節(jié)點(diǎn)一個(gè)聚類開始,然后合并兩個(gè)「最近」的節(jié)點(diǎn)淹朋。
但我們?nèi)绾魏饬烤垲愂欠裣嘟伢细鳎课覀兪褂孟嗨贫染嚯x钉答。令 d(i,j) 為 i 和 j 之間的最短路徑的長(zhǎng)度。

相似度距離

要得到最大連接杈抢,在每個(gè)步驟数尿,被最短距離分開的兩個(gè)聚類被組合到一起。相似度距離可用以下示意圖闡釋:


連接方式

回到我們的空手道示例惶楼。在應(yīng)用分層聚類之前右蹦,我們需要定義每個(gè)節(jié)點(diǎn)之間的距離矩陣。

pcc_longueurs=list(nx.all_pairs_shortest_path_length(G_karate))
distances=np.zeros((n,n))# distances[i, j] is the length of the shortest path between i and j
for i in range(n):
    for j in range(n):
        distances[i, j] = pcc_longueurs[i][1][j]

現(xiàn)在歼捐,我們將使用 sklearn 的 AgglomerativeClustering 函數(shù)來確定分層聚類何陆。

from sklearn.cluster import AgglomerativeClustering
clustering = AgglomerativeClustering(n_clusters=2,linkage='average',affinity='precomputed').fit_predict(distances)

最后,根據(jù)聚類結(jié)果豹储,用不同顏色繪出所得到的圖:

nx.draw(G_karate,  node_color = clustering)
分層聚類

7.聚類系數(shù)

聚類系數(shù)衡量的是兩個(gè)節(jié)點(diǎn)傾向于聚類到一起的程度贷盲。

局部聚類系數(shù)是以節(jié)點(diǎn) i 為中心的三角形的數(shù)量與以節(jié)點(diǎn) i 為中心的三節(jié)點(diǎn)的數(shù)量的比。某種程度而言剥扣,這衡量的是節(jié)點(diǎn) i 與其相鄰節(jié)點(diǎn)接近完備圖(complete graph)的程度巩剖。


聚類系數(shù)

我通過以下圖演示了聚類系數(shù)的計(jì)算:

聚類系數(shù)

全局聚類系數(shù)衡量的是圖中三角形(局部聚類)的密度:

全局聚類系數(shù)

全局<mark data-type="concepts" data-id="de069734-8912-43fb-b365-3b014165bc4d" class="tooltipstered" style="box-sizing: border-box; line-height: 2; padding: 0.2em; background-color: transparent; color: inherit; cursor: pointer; border-bottom: 1px solid rgb(235, 40, 53);">聚類</mark>系數(shù)

上面的圖的全局聚類系數(shù)為:

image

對(duì)于 Erdos-Rényi 隨機(jī)圖,E[Clustering Coefficient]=E[Ci]=p朦乏,其中 p 是前一篇文章中定義的概率。
對(duì)于 Baràbasi-Albert 隨機(jī)圖氧骤,全局聚類系數(shù)根據(jù)節(jié)點(diǎn)的數(shù)量遵循冪律呻疹。度為 k 的節(jié)點(diǎn)的平均聚類系數(shù)正比于 k 的倒數(shù):

image

度較低的節(jié)點(diǎn)連接的是它們社群中的其它節(jié)點(diǎn)。度較高的節(jié)點(diǎn)連接的是其它社群的節(jié)點(diǎn)筹陵。

對(duì)于一個(gè)給定的圖刽锤,在 networkx 中,聚類系數(shù)很容易算出朦佩。首先并思,我們來計(jì)算局部聚類系數(shù):

# List of local clustering coefficients
list(nx.clustering(G_barabasi).values())

這會(huì)得到類似下面的結(jié)果:

0.13636363636363635,
0.2,
0.07602339181286549,
0.04843304843304843,
0.09,
0.055384615384615386,
0.07017543859649122,
...

然后平均這些結(jié)果,得到該圖的全局聚類系數(shù):

# Global clustering coefficient
np.mean(list(nx.clustering(G_barabasi).values()))

這會(huì)得到:

0.0965577637155059

三. 中心度算法

中心度(Centrality)衡量的是節(jié)點(diǎn)的重要程度语稠。這并非一個(gè)明晰的定義宋彼,但如果我們想要確定重要的網(wǎng)頁、交通網(wǎng)絡(luò)中的瓶頸……仙畦,那這就會(huì)很有用输涕。

游走(walk)是可以多次經(jīng)過同一個(gè)節(jié)點(diǎn)的路徑。根據(jù)所考慮的游走類型和統(tǒng)計(jì)它們的方式慨畸,中心度度量也會(huì)各有不同莱坎。

1. PageRank 算法

PageRank 是根據(jù)所連接的相鄰節(jié)點(diǎn),然后再根據(jù)它們各自的相鄰節(jié)點(diǎn)估計(jì)當(dāng)前節(jié)點(diǎn)的重要性寸士。
盡管是谷歌讓這種算法流行起來的檐什,但這種方法能夠用于檢測(cè)任何網(wǎng)絡(luò)中的高影響力節(jié)點(diǎn)碴卧。比如可用在社交網(wǎng)絡(luò)上進(jìn)行推薦。
PageRank 要么是通過在相鄰節(jié)點(diǎn)上迭代地分配節(jié)點(diǎn)的秩(原本是基于度)來計(jì)算乃正,要么是通過隨機(jī)遍歷圖并統(tǒng)計(jì)每次游走期間到達(dá)每個(gè)節(jié)點(diǎn)的頻率來計(jì)算住册。


Neo4J 對(duì) PageRank 算法的總結(jié)

PageRank 通常是在有向圖上計(jì)算,但也可通過將有向圖中的每條邊轉(zhuǎn)換成兩條邊而在無向圖上執(zhí)行烫葬。

舉個(gè)例子界弧,空手道圖的 PageRank 可以這樣獲得:

nx.pagerank(G_karate, alpha=0.9)

其中 alpha 是阻尼參數(shù)(默認(rèn)為 0.85)。這應(yīng)該能返回一個(gè)排名列表:

{0: 0.09923208031303203,
 1: 0.0543403155825792,
 2: 0.05919704684187155,
 3: 0.036612460562853694,
...

2. 度中心度

度中心度(Degree Centrality)統(tǒng)計(jì)的是終止于節(jié)點(diǎn) i 的長(zhǎng)度為 1 的游走的數(shù)量搭综。

這能夠衡量傳入和傳出關(guān)系垢箕。這能通過 C(Xi)=di 給出。度中心度可用于識(shí)別社交網(wǎng)絡(luò)中最有影響力的人兑巾。

c_degree = nx.degree_centrality(G_karate)
c_degree = list(c_degree.values())

3. 特征向量中心度

特征向量中心度(Eigenvector Centrality)是終止于節(jié)點(diǎn) i 的長(zhǎng)度為無窮的游走的數(shù)量条获。

這能讓有很好連接相鄰節(jié)點(diǎn)的節(jié)點(diǎn)有更高的重要度。

image

特征向量中心度

c_eigenvector = nx.eigenvector_centrality(G_karate)
c_eigenvector = list(c_eigenvector.values())

4. 接近度中心度

接近度中心度(Closeness Centrality)檢測(cè)的是可以在圖中有效傳播信息的節(jié)點(diǎn)蒋歌。

這可用于識(shí)別假新聞賬戶或恐怖分子帅掘,以便隔離能向圖中其它部分傳播信息的個(gè)體。

image

接近度中心度反比于到其它節(jié)點(diǎn)的最短路徑長(zhǎng)度的總和堂油。

c_closeness = nx.closeness_centrality(G_karate)
c_closeness = list(c_closeness.values())

5. 居間性中心度

居間性中心度(Betweenness Centrality)檢測(cè)的是節(jié)點(diǎn)在圖中的信息流上所具有的影響量修档。

這通常可用于發(fā)現(xiàn)用作從圖的一部分到另一部分的橋的節(jié)點(diǎn)府框,比如用在電信網(wǎng)絡(luò)的數(shù)據(jù)包傳遞處理器或假新聞傳播分析中吱窝。

image

其中:

  • σ_jk 是 j 和 k 之間的最短路徑的數(shù)量

  • σ_jk(i) 是 j 和 k 之間的經(jīng)過 i 的最短路徑的數(shù)量

居間性中心度衡量的是一個(gè)節(jié)點(diǎn)用作兩個(gè)節(jié)點(diǎn)之間的橋的次數(shù),比如:

中心度度量
c_betweenness = nx.betweenness_centrality(G_karate)
c_betweenness = list(c_betweenness.values())

Python 中實(shí)現(xiàn)依賴于 networkx 的內(nèi)置函數(shù):

# Plot the centrality of the nodes
plt.figure(figsize=(18, 12))# Degree Centrality
f, axarr = plt.subplots(2, 2, num=1)
plt.sca(axarr[0,0])
nx.draw(G_karate, cmap = plt.get_cmap('inferno'), node_color = c_degree, node_size=300, pos=pos, with_labels=True)
axarr[0,0].set_title('Degree Centrality', size=16)# Eigenvalue Centrality
plt.sca(axarr[0,1])
nx.draw(G_karate, cmap = plt.get_cmap('inferno'), node_color = c_eigenvector, node_size=300, pos=pos, with_labels=True)
axarr[0,1].set_title('Eigenvalue Centrality', size=16)# Proximity Centrality
plt.sca(axarr[1,0])
nx.draw(G_karate, cmap = plt.get_cmap('inferno'), node_color = c_closeness, node_size=300, pos=pos, with_labels=True)
axarr[1,0].set_title('Proximity Centrality', size=16)# Betweenness Centrality
plt.sca(axarr[1,1])
nx.draw(G_karate, cmap = plt.get_cmap('inferno'), node_color = c_betweenness, node_size=300, pos=pos, with_labels=True)
axarr[1,1].set_title('Betweenness Centrality', size=16)
不同的中心度度量

可以觀察到迫靖,不同的中心度度量關(guān)注的節(jié)點(diǎn)也不同院峡。比如,居間性中心度得到的結(jié)果與其它方法的結(jié)果非常不同系宜,因?yàn)樗鼈兒饬康牟皇峭粋€(gè)指標(biāo)照激。

四 總結(jié)

現(xiàn)在我們已經(jīng)介紹了圖的基礎(chǔ)知識(shí)、圖的主要類型盹牧、不同的圖算法和它們使用 networkx 的 Python 實(shí)現(xiàn)俩垃。

下一篇文章我們將介紹圖學(xué)習(xí),這能提供預(yù)測(cè)圖中節(jié)點(diǎn)和邊的方法汰寓,從而處理缺失值或預(yù)測(cè)新的關(guān)系吆寨。

擴(kuò)展閱讀:

原文鏈接:https://towardsdatascience.com/graph-algorithms-part-2-dce0b2734a1d

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末踩寇,一起剝皮案震驚了整個(gè)濱河市啄清,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖辣卒,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掷贾,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡荣茫,警方通過查閱死者的電腦和手機(jī)想帅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啡莉,“玉大人港准,你說我怎么就攤上這事∵中溃” “怎么了浅缸?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)魄咕。 經(jīng)常有香客問我衩椒,道長(zhǎng),這世上最難降的妖魔是什么哮兰? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任毛萌,我火速辦了婚禮,結(jié)果婚禮上喝滞,老公的妹妹穿的比我還像新娘阁将。我一直安慰自己,他們只是感情好右遭,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布做盅。 她就那樣靜靜地躺著,像睡著了一般狸演。 火紅的嫁衣襯著肌膚如雪言蛇。 梳的紋絲不亂的頭發(fā)上僻他,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天宵距,我揣著相機(jī)與錄音,去河邊找鬼吨拗。 笑死满哪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的劝篷。 我是一名探鬼主播哨鸭,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼娇妓!你這毒婦竟也來了像鸡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤哈恰,失蹤者是張志新(化名)和其女友劉穎只估,沒想到半個(gè)月后志群,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蛔钙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年锌云,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吁脱。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡桑涎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出兼贡,到底是詐尸還是另有隱情攻冷,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布紧显,位于F島的核電站讲衫,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏孵班。R本人自食惡果不足惜涉兽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望篙程。 院中可真熱鬧枷畏,春花似錦、人聲如沸虱饿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽氮发。三九已至渴肉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間爽冕,已是汗流浹背仇祭。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颈畸,地道東北人乌奇。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像眯娱,于是被迫代替她去往敵國(guó)和親礁苗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容