显然随机矢量绘图:TSNE

时间:2017-05-01 14:01:50

标签: python matplotlib scikit-learn visualization dimensionality-reduction

我使用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()

然而,与矢量相关的结果点看起来基本上是随机的 - 只有一个巨大的集群有几个异常值。

math py graph

一个恰当的例子:注意在群集边缘“幻觉”的最近邻居

vectors

但是实际的向量返回了模型.most_similar()是

  

[('agitated',0.7707732319831848),('restless',0.740711510181427),   ('迷失',0.7242116332054138),('迷茫',   0.7215688228607178),( '攻击性',0.71 69249057769775),( '昏昏欲睡',0.6654224395751953),( '含泪',0.6573441624641418),( 'aggitated',0.6566967964172363),( '困',0.6562871932983398),( '摇动',    0.6419488191604614)]

我可以采用哪种方式来尝试使输出更合理?

1 个答案:

答案 0 :(得分:2)

绝对阅读@MattiLyra链接的文章。除此之外,基于我所知道的(没有看到实际数据),您可能希望稍微增加n_iter参数。通常1000次迭代不会使您进入静态状态。此外,您可能还想使用method参数。 sklearn.manifold.TSNE州的文档:

  

“默认情况下,梯度计算算法使用在O(NlogN)时间运行的Barnes-Hut近似。方法='精确'将在O(N ^ 2)时间内运行较慢但精确的算法。精确算法当最近邻误差需要优于3%时应该使用。但是,确切的方法不能扩展到数百万个例子。“

如果将方法更改为“确切”,则可以使用n_iter_without_progress参数,并且基本上允许模型找到静态点。