显然是随机矢量绘图: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的主要内容,如果未能解决你的问题,请参考以下文章

【R>>tSNE】tSNE高效降维

TSNE算法是什么?该算法有什么缺陷?

tsne 绘图(CC2)

c ++矢量随机洗牌部分

CWE-329: 密码分组链接模式未使用随机初始化矢量

矢量 push_back 随机发生