我在100D中有大约3000个数据点,我用t-SNE投影到2D。每个数据点属于三个类中的一个。但是,当我在两台独立的计算机上运行脚本时,我会不断得到不一致的结果。由于我使用随机种子,因此会出现一些不一致的情况,但是其中一台计算机的结果越来越好(我在Ubuntu上使用了macbook pro和固定机器)。
我使用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)
第一张图片是从macbook生成的一个样本,我已经运行了几次,它总是在相同的x / y范围内生成类似的形状。第二个来自Ubuntu并且明显更好,我再次运行它以确保它继续产生更好的结果,总是在与Mac相比更高的x / y范围内。不知道我在这里没有看到什么,很可能是我错过了一些明显的东西。
答案 0 :(得分:3)
TSNE是一种启发式方法。像大多数启发式一样,根据微小变化,它可能表现得完全不同。这里的核心特征是:只保证本地收敛! (不是很健壮)。后者在docs:
中表示(遵循基本优化理论)t-SNE的成本函数不是凸的,即使用不同的初始化我们可以得到不同的结果。
虽然您解释说,非播种方法不是您认为的罪魁祸首(难以衡量!基准测试很难),您应该查看您的sklearn版本,如{{ 3}}是sklearn中比较活跃的部分之一,随着时间的推移会有很多变化。
这些变化中的每一个都可能会引入像你这样的观察结果(当只尝试一个例子时;当比较t-sne实现时,更大的基准/测试集应该是更好的方法)
备注:however one of the computers keeps getting better results:
这是广泛的,因为至少有两种不同的解释:
kl_divergence_