在复现deepwalk时,遇到对实验结果降维可视化的问题,使用PCA结果不佳,于是使用T-SNE。
但是想让不同类型节点用不同颜色表示时没有找到合适的解决方法,最终使用model.wv.similar_by_word('xxx'),再将节点区分颜色实现了想要的效果。
最终效果如下:
绿色表示所有与space race相似的节点
这里使用的数据集来自:
使用DeepWalk从图中提取特征 - 人工智能遇见磐创 - 博客园 (cnblogs.com)
我只保留了depth为1的所有节点,深度为2,3,4的节点有待讨论。
1. 将随机游走序列通过word2vec训练后,找到space exploration的相似节点:
words_exploration = model.wv.similar_by_word('space exploration')
所有节点的向量放入X中:
X = model.wv.vectors
term2index = model.wv.key_to_index
2.将与 space exploration相似的节点用t-sne降维可视化:
值得注意的是:这里我将所有与space exploration的相似节点降为2维后的向量存放在了sort_x[]和sort_y[]中(sort_x表示x轴,y同理),再进行plt.scatter()。
tsne = TSNE(n_components=2, n_iter=10000)
#将所有节点降为2维
embed_2d = tsne.fit_transform(X)
def plot(sim_words, color, label):
# 提取相似节点,sim_words是一个[(,),(,)...]形式的list
first_list = [i[0] for i in sim_words]
sort_x = []
sort_y = []
# 将所有相似节点的2维向量放进sort_x和sort_y中
for item in first_list:
idx = term2index[item]
sort_x.append(embed_2d[idx, 0])
sort_y.append(embed_2d[idx, 1])
plt.scatter(sort_x, sort_y, c=color, label=label)
#label放在右上角(1,2,3,4对应右上,左上,左下,右下)
plt.legend(loc=2)
plot(words_race, 'green', 'space race')
plot(words_research, 'red', 'space research')
plot(words_exploration, 'yellow', 'space exploration')
# 注意plt.show不要写在for循环中
plt.show()
存在的问题:model.wv.similar_by_word()没有将所有与space exploration有关的节点提取出来,绘制结果散点图点数过少。