DeepWalk & Node2Vec

DeepWalk & Node2Vec

维基百科词条DeepWalk图嵌入

import networkx as nx
import pandas as pd
import numpy as np
import random
from tqdm import tqdm
import matplotlib.pyplot as plt
%matplotlib inline

plt.rcParams["font.sans-serif"]=["SimHei"]
plt.rcParams["axes.unicode_minus"]=False
df = pd.read_csv("seealsology-data.tsv", sep="\t")

构建无向图

节点过多,省去可视化

生成随机游走序列

训练word2vec模型

分析word2vec结果

PCA降维可视化

可视化全部词条的二维embedding

可视化某个词条的二维embedding

可视化某些词条的二维embedding

TSNE降维可视化

可视化全部词条的二维embedding

导出TSNE降维到二维之后的embedding

可视化全部词条的三维enmbedding

导出TSNE降维到三维之后的embedding

<悲惨世界>人物关系-Node2Vec图嵌入

导入数据集

G = nx.les_miserables_graph()
G.nodes
NodeView(('Napoleon', 'Myriel', 'MlleBaptistine', 'MmeMagloire', 'CountessDeLo', 'Geborand', 'Champtercier', 'Cravatte', 'Count', 'OldMan', 'Valjean', 'Labarre', 'Marguerite', 'MmeDeR', 'Isabeau', 'Gervais', 'Listolier', 'Tholomyes', 'Fameuil', 'Blacheville', 'Favourite', 'Dahlia', 'Zephine', 'Fantine', 'MmeThenardier', 'Thenardier', 'Cosette', 'Javert', 'Fauchelevent', 'Bamatabois', 'Perpetue', 'Simplice', 'Scaufflaire', 'Woman1', 'Judge', 'Champmathieu', 'Brevet', 'Chenildieu', 'Cochepaille', 'Pontmercy', 'Boulatruelle', 'Eponine', 'Anzelma', 'Woman2', 'MotherInnocent', 'Gribier', 'MmeBurgon', 'Jondrette', 'Gavroche', 'Gillenormand', 'Magnon', 'MlleGillenormand', 'MmePontmercy', 'MlleVaubois', 'LtGillenormand', 'Marius', 'BaronessT', 'Mabeuf', 'Enjolras', 'Combeferre', 'Prouvaire', 'Feuilly', 'Courfeyrac', 'Bahorel', 'Bossuet', 'Joly', 'Grantaire', 'MotherPlutarch', 'Gueulemer', 'Babet', 'Claquesous', 'Montparnasse', 'Toussaint', 'Child1', 'Child2', 'Brujon', 'MmeHucheloup'))
len(G)
77
plt.figure(figsize=(15,14))
pos = nx.spring_layout(G, seed=5)
nx.draw(G, pos, with_labels=True)
plt.show()

DeepWalk & Node2Vec_第1张图片

构建Node2Vec模型

from node2vec import Node2Vec
node2vec = Node2Vec(G,
                   dimensions=32,
                   p=2,
                   q=0.5,
                   walk_length=3,
                   num_walks=600,
                   workers=4
                   )
Computing transition probabilities:   0%|          | 0/77 [00:00
model = node2vec.fit(window=3,
                    min_count=1,
                    batch_words=4
                    )
x = model.wv.vectors

节点Embedding聚类可视化

x.shape
(77, 32)
from sklearn.cluster import KMeans
import warnings
warnings.filterwarnings('ignore')
cluster_labels = KMeans(n_clusters=3).fit(x).labels_
cluster_labels
array([1, 1, 1, 1, 2, 1, 0, 2, 1, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 2, 1, 0,
       2, 1, 0, 0, 1, 0, 0, 2, 0, 0, 2, 1, 1, 1, 1, 2, 1, 1, 0, 2, 1, 2,
       1, 2, 2, 1, 1, 1, 1, 1, 2, 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1,
       1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1])

将networkx中的节点和词向量中的节点对应

colors = []
nodes = [*G.nodes]
for node in nodes:
    idx = model.wv.key_to_index[str(node)]
    colors.append(cluster_labels[idx])

可视化聚类效果

plt.figure(figsize=(15,14))
pos = nx.spring_layout(G, seed=10)
nx.draw(G, pos, node_color=colors, with_labels=True)
plt.show()

DeepWalk & Node2Vec_第2张图片

节点Embedding降维可视化

查看Embedding

对Edge(连接)做Embedding

Node2Vec官方作者Aditya Grover代码解读

载入图

生成一条随机游走序列

采样得到所有随机游走序列

利用word2vec训练Node2Vec模型

结果分析和可视化

查看Node Embedding

查找相似节点

Node Embedding聚类

运行聚类

将networkx中的节点和向量中的节点对应

可视化聚类效果

你可能感兴趣的:(python,机器学习,聚类,知识图谱)