基于PCA和t-SNE可视化词嵌入( 三 )


下面是同一组单词的三维可视化 。
基于PCA和t-SNE可视化词嵌入文章插图
从视觉上 , 我们现在可以看到关于这些词所占空间的模式 。 与“ball”相关的单词彼此靠近 , 因为它们具有相似的上下文 。 同时 , 它们与“学校”和“食物”相关的词之间的距离因它们的语境不同而进一步不同 。
基于t-SNE的可视化词嵌入除了PCA , 另一种常用的降维技术是t分布随机邻域嵌入(t-SNE) 。 PCA和t-SNE的区别是它们实现降维的基本技术 。
PCA是一种线性降维方法 。 将高维空间中的数据线性映射到低维空间 , 同时使数据的方差最大化 。 同时 , t-SNE是一种非线性降维方法 。 该算法利用t-SNE计算高维和低维空间的相似性 。 其次 , 利用一种优化方法 , 例如梯度下降法 , 最小化两个空间中的相似性差异 。
用t-SNE实现词嵌入的可视化代码与PCA的代码非常相似 。 在下面的代码中 , 只显示三维可视化 。 为了使t-SNE在2D中可视化 , 只需应用微小的更改 。 你可以在代码的注释部分找到需要更改的部分 。
import plotlyimport numpy as npimport plotly.graph_objs as gofrom sklearn.manifold import TSNEdef display_tsne_scatterplot_3D(model, user_input=None, words=None, label=None, color_map=None, perplexity = 0, learning_rate = 0, iteration = 0, topn=5, sample=10):if words == None:if sample > 0:words = np.random.choice(list(model.vocab.keys()), sample)else:words = [ word for word in model.vocab ]word_vectors = np.array([model[w] for w in words])three_dim = TSNE(n_components = 3, random_state=0, perplexity = perplexity, learning_rate = learning_rate, n_iter = iteration).fit_transform(word_vectors)[:,:3]# 对于2D , 将three_dim变量改为two_dim , 如下所示:# two_dim = TSNE(n_components = 2, random_state=0, perplexity = perplexity, learning_rate = learning_rate, n_iter = iteration).fit_transform(word_vectors)[:,:2]data = http://kandian.youth.cn/index/[]count = 0for i in range (len(user_input)):trace = go.Scatter3d(x = three_dim[count:count+topn,0],y = three_dim[count:count+topn,1],z = three_dim[count:count+topn,2],text = words[count:count+topn],name = user_input[i],textposition ="top center",textfont_size = 20,mode = 'markers+text',marker = {'size': 10,'opacity': 0.8,'color': 2})# 对于2D , 不是使用go.Scatter3d , 我们需要用go.Scatter并删除变量z 。 另外 , 不要使用变量three_dim , 而是使用前面声明的变量(例如two_dim)data.append(trace)count = count+topntrace_input = go.Scatter3d(x = three_dim[count:,0],y = three_dim[count:,1],z = three_dim[count:,2],text = words[count:],name = 'input words',textposition = "top center",textfont_size = 20,mode = 'markers+text',marker = {'size': 10,'opacity': 1,'color': 'black'})# 对于2D , 不是使用go.Scatter3d , 我们需要用go.Scatter并删除变量z 。 另外 , 不要使用变量three_dim , 而是使用前面声明的变量(例如two_dim)data.append(trace_input)# 配置布局layout = go.Layout(margin = {'l': 0, 'r': 0, 'b': 0, 't': 0},showlegend=True,legend=dict(x=1,y=0.5,font=dict(family="Courier New",size=25,color="black")),font = dict(family = " Courier New ",size = 15),autosize = False,width = 1000,height = 1000)plot_figure = go.Figure(data = http://kandian.youth.cn/index/data, layout = layout)plot_figure.show()display_tsne_scatterplot_3D(model, user_input, similar_word, labels, color_map, 5, 500, 10000)