導航:首頁 > 源碼編譯 > python社區發現演算法

python社區發現演算法

發布時間:2025-01-28 04:16:57

1. 基於社區發現演算法和圖分析Neo4j解讀《權力的游戲》下篇

其中的分析和可視化是用Gephi做的,Gephi是非常流行的圖分析工具。但作者覺得使用Neo4j來實現更有趣。

節點中心度
節點中心度給出網路中節點的重要性的相對度量。有許多不同的方式來度量中心度,每種方式都代表不同類型的「重要性」。

度中心性(Degree Centrality)
度中心性是最簡單度量,即為某個節點在網路中的聯結數。在《權力的游戲》的圖中,某個角色的度中心性是指該角色接觸的其他角色數。作者使用Cypher計算度中心性:
MATCH (c:Character)-[:INTERACTS]- RETURN c.name AS character, count(*) AS degree ORDER BY degree DESC

character
degree

Tyrion
36

Jon
26

Sansa
26

Robb
25

Jaime
24

Tywin
22

Cersei
20

Arya
19

Joffrey
18

Robert
18

從上面可以發現,在《權力的游戲》網路中提利昂·蘭尼斯特(Tyrion)和最多的角色有接觸。鑒於他的心計,我們覺得這是有道理的。

加權度中心性(Weighted Degree Centrality)
作者存儲一對角色接觸的次數作為 INTERACTS 關系的 weight 屬性。對該角色的 INTERACTS 關系的所有 weight 相加得到加權度中心性。作者使用Cypher計算所有角色的這個度量:
MATCH (c:Character)-[r:INTERACTS]- RETURN c.name AS character, sum(r.weight) AS weightedDegree ORDER BY weightedDegree DESC

character
weightedDegree

Tyrion
551

Jon
442

Sansa
383

Jaime
372

Bran
344

Robb
342

Samwell
282

Arya
269

Joffrey
255

Daenerys
232

介數中心性(Betweenness Centrality)
介數中心性:在網路中,一個節點的介數中心性是指其它兩個節點的所有最短路徑都經過這個節點,則這些所有最短路徑數即為此節點的介數中心性。介數中心性是一種重要的度量,因為它可以鑒別出網路中的「信息中間人」或者網路聚類後的聯結點。

圖6中紅色節點是具有高的介數中心性,網路聚類的聯結點。
為了計算介數中心性,作者使用Neo4j 3.x或者apoc庫。安裝apoc後能用Cypher調用其170+的程序:
MATCH (c:Character) WITH collect(c) AS charactersCALL apoc.algo.betweenness(['INTERACTS'], characters, 'BOTH') YIELD node, scoreSET node.betweenness = scoreRETURN node.name AS name, score ORDER BY score DESC

name
score

Jon
1279.7533534055322

Robert
1165.6025171231624

Tyrion
1101.3849724234349

Daenerys
874.8372110508583

Robb
706.5572832464792

Sansa
705.1985623519137

Stannis
571.5247305125714

Jaime
556.1852522889822

Arya
443.01358430043337

Tywin
364.7212195528086

緊度中心性(Closeness centrality)
緊度中心性是指到網路中所有其他角色的平均距離的倒數。在圖中,具有高緊度中心性的節點在聚類社區之間被高度聯結,但在社區之外不一定是高度聯結的。

圖7 :網路中具有高緊度中心性的節點被其它節點高度聯結
MATCH (c:Character) WITH collect(c) AS charactersCALL apoc.algo.closeness(['INTERACTS'], characters, 'BOTH') YIELD node, scoreRETURN node.name AS name, score ORDER BY score DESC

name
score

Tyrion
0.004830917874396135

Sansa
0.004807692307692308

Robert
0.0047169811320754715

Robb
0.004608294930875576

Arya
0.0045871559633027525

Jaime
0.004524886877828055

Stannis
0.004524886877828055

Jon
0.004524886877828055

Tywin
0.004424778761061947

Eddard
0.004347826086956522

使用python-igraph
Neo4j與其它工具(比如,R和Python數據科學工具)完美結合。我們繼續使用apoc運行 PageRank和社區發現(community detection)演算法。這里接著使用python-igraph計算分析。Python-igraph移植自R的igraph圖形分析庫。 使用 pip install python-igraph 安裝它。

從Neo4j構建一個igraph實例
為了在《權力的游戲》的數據的圖分析中使用igraph,首先需要從Neo4j拉取數據,用Python建立igraph實例。作者使用 Neo4j 的Python驅動庫py2neo。我們能直接傳入Py2neo查詢結果對象到igraph的 TupleList 構造器,創建igraph實例:
from py2neo import Graphfrom igraph import Graph as IGraph graph = Graph query = ''' MATCH (c1:Character)-[r:INTERACTS]->(c2:Character) RETURN c1.name, c2.name, r.weight AS weight '''ig = IGraph.TupleList(graph.run(query), weights=True)

現在有了igraph對象,可以運行igraph實現的各種圖演算法來。

PageRank
作者使用igraph運行的第一個演算法是PageRank。PageRank演算法源自Google的網頁排名。它是一種特徵向量中心性(eigenvector centrality)演算法。
在igraph實例中運行PageRank演算法,然後把結果寫回Neo4j,在角色節點創建一個pagerank屬性存儲igraph計算的值:
pg = ig.pagerank pgvs = for p in zip(ig.vs, pg): print(p) pgvs.append({"name": p[0]["name"], "pg": p[1]}) pgvs write_clusters_query = ''' UNWIND {nodes} AS n MATCH (c:Character) WHERE c.name = n.name SET c.pagerank = n.pg '''graph.run(write_clusters_query, nodes=pgvs)

現在可以在Neo4j的圖中查詢最高PageRank值的節點:
MATCH (n:Character) RETURN n.name AS name, n.pagerank AS pagerank ORDER BY pagerank DESC LIMIT 10

name
pagerank

Tyrion
0.042884981999963316

Jon
0.03582869669163558

Robb
0.03017114665594764

Sansa
0.030009716660108578

Daenerys
0.02881425425830273

Jaime
0.028727587587471206

Tywin
0.02570016262642541

Robert
0.022292016521362864

Cersei
0.022287327589773507

Arya
0.022050209663844467

社區發現(Community detection)

圖8
社區發現演算法用來找出圖中的社區聚類。作者使用igraph實現的隨機遊走演算法( walktrap)來找到在社區中頻繁有接觸的角色社區,在社區之外角色不怎麼接觸。
在igraph中運行隨機遊走的社區發現演算法,然後把社區發現的結果導入Neo4j,其中每個角色所屬的社區用一個整數來表示:
clusters = IGraph.community_walktrap(ig, weights="weight").as_clustering nodes = [{"name": node["name"]} for node in ig.vs]for node in nodes: idx = ig.vs.find(name=node["name"]).index node["community"] = clusters.membership[idx] write_clusters_query = ''' UNWIND {nodes} AS n MATCH (c:Character) WHERE c.name = n.name SET c.community = toInt(n.community) '''graph.run(write_clusters_query, nodes=nodes)

我們能在Neo4j中查詢有多少個社區以及每個社區的成員數:
MATCH (c:Character) WITH c.community AS cluster, collect(c.name) AS members RETURN cluster, members ORDER BY cluster ASC

cluster
members

0
[Aemon, Alliser, Craster, Eddison, Gilly, Janos, Jon, Mance, Rattleshirt, Samwell, Val, Ygritte, Grenn, Karl, Bowen, Dalla, Orell, Qhorin, Styr]

1
[Aerys, Amory, Balon, Brienne, Bronn, Cersei, Gregor, Jaime, Joffrey, Jon Arryn, Kevan, Loras, Lysa, Meryn, Myrcella, Oberyn, Podrick, Renly, Robert, Robert Arryn, Sansa, Shae, Tommen, Tyrion, Tywin, Varys, Walton, Petyr, Elia, Ilyn, Pycelle, Qyburn, Margaery, Olenna, Marillion, Ellaria, Mace, Chataya, Doran]

2
[Arya, Beric, Eddard, Gendry, Sandor, Anguy, Thoros]

3
[Brynden, Catelyn, Edmure, Hoster, Lothar, Rickard, Robb, Roose, Walder, Jeyne, Roslin, Ramsay]

4
[Bran, Hodor, Jojen, Luwin, Meera, Rickon, Nan, Theon]

5
[Belwas, Daario, Daenerys, Irri, Jorah, Missandei, Rhaegar, Viserys, Barristan, Illyrio, Drogo, Aegon, Kraznys, Rakharo, Worm]

6
[Davos, Melisandre, Shireen, Stannis, Cressen, Salladhor]

7
[Lancel]

角色「大合影」
《權力的游戲》的權力圖。節點的大小正比於介數中心性,顏色表示社區(由隨機遊走演算法獲得),邊的厚度正比於兩節點接觸的次數。現在已經計算好這些圖的分析數據,讓我們對其進行可視化,讓數據看起來更有意義。
Neo4j自帶瀏覽器可以對Cypher查詢的結果進行很好的可視化,但如果我們想把可視化好的圖嵌入到其它應用中,可以使用Javascript可視化庫Vis.js。從Neo4j拉取數據,用Vis.js的neovis.js構建可視化圖。Neovis.js提供簡單的API配置,例如:
var config = { container_id: "viz", server_url: "localhost", labels: { "Character": "name" }, label_size: { "Character": "betweenness" }, relationships: { "INTERACTS": }, relationship_thickness: { "INTERACTS": "weight" }, cluster_labels: { "Character": "community" } }; var viz = new NeoVis(config); viz.render;

其中:
節點帶有標簽Character,屬性name;

節點的大小正比於betweenness屬性;

可視化中包括INTERACTS關系;

關系的厚度正比於weight屬性;

節點的顏色是根據網路中社區community屬性決定;

從本地伺服器localhost拉取Neo4j的數據;

在一個id為viz的DOM元素中展示可視化。

2. Nosql-neo4j-基於社區發現演算法和圖分析Neo4j解讀《權力的游戲》

幾個月前,數學家 Andrew Beveridge 和 Jie Shan 在數學雜志上發表的論文《權力的網路》,深入分析了暢銷小說《冰與火之歌》第三部《冰雨的風暴》中的人物關系,並將其應用至電視劇《權力的游戲》系列。他們闡述了通過文本分析與實體提取構建人物關系網路,隨後採用社交網路分析演算法確定關鍵角色,以及通過社區發現演算法識別角色聚類的過程。文中指出,Gephi作為圖分析工具,盡管被廣泛應用,但作者認為使用Neo4j進行實現更具有吸引力。

為了將原始數據導入Neo4j,作者構建了一個簡單的數據模型,首先創建了唯一的約束條件,確保每個角色的名字獨一無二,從而保證了數據模型的完整性。通過使用Neo4j的Cypher(一種聲明式圖查詢語言)和LOAD CSV語句,數據得以高效地導入到Neo4j中。盡管可視化圖形較為直觀,但還需進一步分析以獲得更深入的見解。

作者使用Neo4j的圖查詢語言Cypher對《權力的游戲》進行了詳細的人物網路分析。首先,他們計算了網路中角色的數量,接著,對每個角色接觸的其他角色數目進行了統計。此外,他們還分析了網路的直徑,即最長的最短路徑長度,並通過Cypher的shortestPath函數找到了任意兩個角色之間的最短路徑。進一步地,通過allShortestPaths函數,他們探索了不同路徑的可能性,最終識別出關鍵節點,即在所有最短路徑上都出現的角色。這些角色扮演著信息傳遞者的重要角色,驗證了通過可視化展示的路徑分析結果。

在討論節點中心度時,作者強調了度中心性、加權度中心性、介數中心性和緊度中心性的重要性。度中心性反映了角色與其他角色的直接連接數,加權度中心性考慮了連接的頻率,介數中心性則衡量了角色作為信息傳遞者的角色,而緊度中心性評估了角色與網路中其他角色的平均接近程度。通過Cypher計算這些中心性指標,作者發現提利昂·蘭尼斯特在《權力的游戲》網路中具有最高的度中心性,這與他復雜的人際關系網相符。

為了進一步分析角色之間的關系,作者藉助Python-igraph庫,結合Neo4j的強大功能,執行了PageRank演算法和社區發現演算法。通過構建一個igraph實例,作者能夠分析角色之間的復雜關系,並將PageRank結果與社區發現結果整合回Neo4j中。這使得角色之間的相對重要性與所屬社區的信息得以可視化,提供了對《權力的游戲》網路結構更全面的理解。

為了直觀展示分析結果,作者使用Neo4j的內置瀏覽器進行了初步的可視化,並進一步利用Vis.js構建了嵌入式可視化圖,使得數據展示更加豐富且易於理解。通過整合這些工具與技術,作者成功地構建了一個詳細的《權力的游戲》角色關系網路分析,不僅揭示了角色間的復雜聯系,還通過視覺化手段提供了對小說情節和角色動態的深入洞察。

3. 關於在復雜網路中社區發現演算法的研究及實現,推薦相關的文獻,在實現過程中能用到什麼軟體詳解

推薦文獻 」Community detection in graphs「 ,Santo Fortunato,2009
89頁的論文,寫得很全,涵蓋了從提出復雜網路的1998年到2009年的全部重要的研究內容
至於復雜網路的實現,軟體很多,推薦igraph,在C和Python中都可以直接調用。

閱讀全文

與python社區發現演算法相關的資料

熱點內容
php正整數驗證 瀏覽:363
有個腹黑程序員男友是什麼體驗 瀏覽:110
pdf添加文本框 瀏覽:770
系統文件夾很大沒有文件 瀏覽:74
蘇寧電器app如何還分期 瀏覽:635
蘋果怎麼在主屏幕創建文件夾 瀏覽:627
河南雲伺服器租用虛擬主機 瀏覽:361
centos修改ip命令 瀏覽:779
租用伺服器屬於什麼服務類型 瀏覽:135
英雄聯盟說沒有網路連接到伺服器地址 瀏覽:28
單片機周期信號波形識別 瀏覽:42
演算法驅動的成長史 瀏覽:936
好又省APP怎麼用 瀏覽:576
pdf在線格式轉換jpg格式轉換器 瀏覽:868
中興捧月演算法大賽第二場 瀏覽:15
穿雲伺服器 瀏覽:394
單片機核心電壓表 瀏覽:151
最強大逃頂通達信指標源碼 瀏覽:441
java程序員面試寶典歐立奇 瀏覽:457
cad命令不要跟著游標 瀏覽:200