t-SNE 在不同的机器上生成不同的结果

t-SNE generates different results on different machines

我在 100D 中有大约 3000 个数据点,我用 t-SNE 投影到 2D。每个数据点属于三个 类 之一。但是,当我 运行 在两台不同的计算机上运行脚本时,我总是得到不一致的结果。当我使用 运行dom 种子时,预计会有一些不一致,但是其中一台计算机不断获得更好的结果(我使用 macbook pro 和固定 machine on Ubuntu).

我使用 Scikit-learn 中的 t-SNE 实现。脚本和数据是相同的,我手动复制了文件夹以确保。相关代码片段如下所示:

X_vectors, X_labels = self.load_data(spec_path, sound_path, subset)
tsne = TSNE(n_components=2, perplexity=25, random_state=None)
Y = tsne.fit_transform(X_vectors)
self.plot(X_labels, Y[:, 0], Y[:, 1], Y)

第一张图片是从 mac 书中生成的一个样本,我已经 运行 多次,它总是在同一 x/y-range 中生成相似的形状。第二个来自 Ubuntu 并且明显更好,我再次 运行 几次以确保它继续产生更好的结果,与 x/y-range 相比总是更高=27=]。不确定我在这里没有看到什么,这很可能是我错过的明显的东西。

TSNE 是一种启发式算法。与大多数启发式算法一样,它可能会根据微小的变化表现出截然不同的行为。这里的核心特点是:只保证局部收敛! (不是很健壮)。后者在 docs:

中指出(遵循基本优化理论)

t-SNE has a cost function that is not convex, i.e. with different initializations we can get different results.

虽然您解释了非播种方法不是您认为的罪魁祸首(很难衡量!基准测试很难),您应该检查您的 sklearn 版本 ,因为 t-sne code 是 sklearn 中比较活跃的部分之一,随着时间的推移发生了许多变化。

这些变化中的每一个都可能引入像您这样的观察结果(当只尝试一个例子时;当然,在比较 t-sne 实现时,更大的 benchmark/testset 应该是更好的方法)

备注:however one of the computers keeps getting better results:这很宽泛,因为至少有两种不同的解释:

  • 从视觉上/感知上评价结果
  • kl_divergence_优化后实现