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
导入数据集
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()
构建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()
节点Embedding降维可视化
查看Embedding
对Edge(连接)做Embedding
Node2Vec官方作者Aditya Grover代码解读
载入图
生成一条随机游走序列
采样得到所有随机游走序列
利用word2vec训练Node2Vec模型
结果分析和可视化
查看Node Embedding
查找相似节点
Node Embedding聚类
运行聚类
将networkx中的节点和向量中的节点对应
可视化聚类效果
你可能感兴趣的:(python,机器学习,聚类,知识图谱)