显然是随机矢量绘图:TSNE
Posted
技术标签:
【中文标题】显然是随机矢量绘图:TSNE【英文标题】:Apparently random vector plotting: TSNE 【发布时间】:2017-09-28 22:38:45 【问题描述】:我已经使用 Gensim 的 word2vec 库成功创建了一个矢量模型。相关向量之间的距离很好(也就是说,从人类的角度来看,派生的相似度是有意义的)。
但是,尝试将这些向量映射到图表已被证明具有挑战性。自然地,向量的 N 维需要减少以便可绘制:为此我使用了 TSNE。
import gensim, logging, os
import codecs
import numpy as np
import matplotlib.pyplot as plt
import gensim, logging, os
from sklearn.manifold import TSNE
wvs = model.syn1neg
vocabulary = model.wv.vocab
tsne = TSNE(n_components=2, random_state=0)
np.set_printoptions(suppress=True)
Y = tsne.fit_transform(wvs[::])
plt.scatter(Y[:, 0], Y[:, 1])
for label, x, y in zip(vocabulary, Y[:, 0], Y[:, 1]):
plt.annotate(label, xy=(x, y), xytext=(0, 0), textcoords='offset points')
plt.show()
但是,与向量相关的结果点似乎基本上是随机的 - 只有一个带有几个异常值的巨大集群。
一个恰当的例子:注意在集群边缘“幻觉”的最近邻居
但是使用 model.most_similar() 返回的实际向量是
[('激动', 0.7707732319831848), ('不安分', 0.740711510181427), ('迷失方向', 0.7242116332054138), ('迷惑', 0.7215688228607178),('咄咄逼人',0.71 69249057769775),('drowsy',0.6654224395751953),('泪流满面',0.6573441624641418),('aggitated',0.6566967964172363),('Sleepy',0.6562871932983398),('摇晃', 0.6419488191604614)]
我可以用什么方法来尝试使输出更合理?
【问题讨论】:
阅读文档并使用所有这些参数。当然,如此艰巨的任务可能需要微调。wvs
的形状是什么?为什么要跳过前 100 个 TSNE (wvs[100::]
)?
@ImanolLuengo 尺寸显然是 (6708*100)。跳过只是为了测试目的,我会把它从引用的代码中去掉
您可能还想看看这篇 t-SNE 文章distill.pub/2016/misread-tsne
【参考方案1】:
绝对阅读@MattiLyra 链接的文章。除此之外,根据我所知道的(没有看到实际数据),您可能希望将n_iter
参数增加一点。通常 1000 次迭代不会让你进入静止状态。此外,您可能还想使用method
参数。 sklearn.manifold.TSNE
的文档指出:
"默认情况下,梯度计算算法使用 Barnes-Hut 近似,在 O(NlogN) 时间内运行。method='exact' 将在 O(N^2) 时间内运行在较慢但精确的算法上。精确算法应该在最近邻误差需要优于 3% 时使用。但是,确切的方法无法扩展到数百万个示例。"
如果将方法更改为“精确”,则可以使用n_iter_without_progress
参数,基本上可以让模型找到一个静态点。
【讨论】:
以上是关于显然是随机矢量绘图:TSNE的主要内容,如果未能解决你的问题,请参考以下文章