karateclub庫 | 計算社交網路中節點的向量

語言: CN / TW / HK

近期活動

karateclub是小規模圖挖掘研究的一把瑞士軍刀, 可以對圖形結構化資料進行無監督學習。

  • 首先,可以計算出節點、圖的特徵向量

  • 其次,它包括多種重疊和非重疊的社群發現方法。

資料格式

karateclub假設使用者提供的用於 節點嵌入社群檢測 的 NetworkX 圖具有以下重要屬性:

  • 節點用整數索引

  • 節點索引從零開始,索引是連續的

節點的屬性矩陣可以提供為 scipy sparse 和 numpy 陣列。返回的社群成員字典和嵌入矩陣使用相同的數字連續索引。

安裝

pip3 install karateclub

準備資料

import pandas as pd

df = pd.read_csv('karate_club_graph.csv')

print(df.columns)

print()

print(df.head().to_markdown())

print()

edges = list(zip(df['src'], df['tgt']))
print(edges)

Run

Index(['src', 'tgt'], dtype='object')

|    |   src |   tgt |
|---:|------:|------:|
|  0 |     0 |     1 |
|  1 |     0 |     2 |
|  2 |     0 |     3 |
|  3 |     0 |     4 |
|  4 |     0 |     5 |

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

graph = nx.Graph()
graph.add_edges_from(edges)
nx.draw(graph)

Run

社群發現

現在讓我們使用LabelPropagation演算法來發現網路中的社群結構。

from karateclub import LabelPropagation

model = LabelPropagation()
model.fit(graph)
cluster_membership = model.get_memberships()
cluster_membership

Run

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

在有34個節點的圖中,發現了4個社群,分別是1、8、10、31。

Node embeddings

計算節點的向量。使用 Diff2vec 擬合數據的節點嵌入(向量),具有少量維度、每個源節點的擴散和短尤拉遊走。

from karateclub import Diff2Vec

model = Diff2Vec(diffusion_number=2,
diffusion_cover=20,
dimensions=5)

model.fit(graph)
X = model.get_embedding()
X.shape

Run

(34, 5)
X

Run

array([[ 1.3687179 , -0.33502993, -0.3294797 ,  0.40154558,  1.0270709 ],
       [ 0.88167036, -0.3201618 , -0.34293872,  0.41519755,  0.71964073],
       [ 0.8756805 , -0.21934716, -0.33261183,  0.33785722,  0.51631075],
       [ 0.9768452 , -0.39260587, -0.39460638,  0.28851682,  0.8665034 ],
       [ 0.4809215 , -0.28729865, -0.19276802,  0.22588767,  0.07305563],
       [ 0.5580538 , -0.28137547, -0.1947159 ,  0.23712516,  0.49257705],
       [ 0.23477663,  0.04262228,  0.07154325,  0.02909669,  0.33999097],
       [ 1.1882199 , -0.21742308, -0.26985615,  0.44171503,  0.6679048 ],
       [ 1.0287609 , -0.27409104, -0.04119629,  0.30143994,  0.704676  ],
       [ 0.5700088 , -0.26341844,  0.01560158, -0.08039217,  0.41796318],
       [ 0.5753763 , -0.2242508 , -0.1795436 ,  0.0705331 ,  0.46571913],
       [ 0.46763912, -0.17108741, -0.22459361,  0.03058788,  0.05998428],
       [ 0.5500626 , -0.12745889, -0.28661036,  0.16889155,  0.48200938],
       [ 0.6217582 , -0.10251168, -0.0713837 ,  0.13550574,  0.60422456],
       [ 0.9797377 , -0.46282482, -0.09380057,  0.2749968 ,  0.7020155 ],
       [ 0.38830167, -0.30841848, -0.20950563, -0.02130592,  0.0836651 ],
       [ 0.57225037, -0.04150235, -0.1246101 ,  0.06918757,  0.23083903],
       [ 0.6431406 , -0.04898892, -0.05708801,  0.1311793 ,  0.46377632],
       [ 0.541667  , -0.16031542, -0.33119023,  0.10385639,  0.39525154],
       [ 0.65543544, -0.27534947, -0.28757   ,  0.2080029 ,  0.5288213 ],
       [ 0.46381798, -0.07729273, -0.09209982,  0.11292508,  0.36836028],
       [ 0.53826964, -0.09915172, -0.09243581,  0.15036733,  0.5449071 ],
       [ 0.31599265, -0.22078821, -0.02872767,  0.07436654,  0.28573534],
       [ 1.0706906 , -0.27783617, -0.16653039,  0.2631594 ,  0.6408689 ],
       [ 0.67875004, -0.34441757, -0.10262538,  0.2588695 ,  0.38405937],
       [ 0.41786563, -0.10344986, -0.19508548,  0.19657765,  0.22006002],
       [ 0.7855942 , -0.27200857,  0.02204541,  0.09168041,  0.42220354],
       [ 0.7773458 , -0.11727296, -0.24145149,  0.04537854,  0.5737133 ],
       [ 0.75732976, -0.314953  , -0.15383345,  0.02065313,  0.51843405],
       [ 0.7226543 , -0.31919608, -0.18878649,  0.15413427,  0.42012522],
       [ 0.43411565, -0.17342259, -0.28042233,  0.26853496,  0.49947587],
       [ 1.1565564 , -0.36802933, -0.12613232,  0.32381424,  0.75113887],
       [ 1.1192797 , -0.162529  , -0.17195942,  0.39265418,  0.83656436],
       [ 1.2231556 , -0.5336606 , -0.14015286,  0.14054438,  0.5695296 ]],
      dtype=float32)

精選文章

從符號到嵌入:計算社會科學的兩種文字表示

推薦 | 社科(經管)文字分析快速指南

影片專欄課 | Python網路爬蟲與文字分析

使用cntext訓練Glove詞嵌入模型

認知的測量 | 向量距離vs語義投影

案例實戰 | 企業資訊資料採集

使用文字相似度可以識別變化的時間點

PNAS | 文字網路分析&文化橋樑Python程式碼實現

tomotopy | 速度最快的LDA主題模型

文字分析方法在《管理世界》(2021.5)中的應用

SciencePlots | 科研樣式繪相簿

Wow~70G上市公司定期報告資料集

YelpDaset: 酒店管理類資料集10+G

極簡瀏覽器啟動頁StartPage分享

doccano|為機器學習建模做資料標註

使用WeasyPrint自動生成pdf報告檔案

推薦 | 社科(經管)文字分析快速指南

100min影片 | Python文字分析與會計

Python資料探勘2022.05.16工作坊開始報名啦