per*_*all 1 python macos ubuntu dimensionality-reduction scikit-learn
我在 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)
Run Code Online (Sandbox Code Playgroud)
第一张图片是从 macbook 生成的一个样本,我已经运行了几次,它总是在相同的 x/y 范围内生成类似的形状。第二个来自 Ubuntu,显然更好,我再次运行它几次以确保它继续产生更好的结果,与 mac 相比总是在更高的 x/y 范围内。不确定我在这里没有看到什么,很可能我错过了一些明显的东西。
TSNE 是一种启发式方法。像大多数启发式方法一样,根据微小的变化,它的行为可能会大不相同。这里的核心特征是:只保证局部收敛!(不是很健壮)。后者在文档中指出(遵循基本优化理论):
t-SNE 有一个非凸的成本函数,即不同的初始化我们可以得到不同的结果。
虽然您已经解释过,在您看来,非播种方法不是罪魁祸首(难以衡量!基准测试很难),但您应该查看您的 sklearn 版本,因为t-sne 代码是更活跃的部分之一sklearn 随着时间的推移发生了许多变化。
这些更改中的每一个都可能会引入像您这样的观察结果(仅尝试一个示例时;当然,在比较 t-sne 实现时,更大的基准/测试集应该是更好的方法)
备注:however one of the computers keeps getting better results:这是广义的,因为至少有两种不同的解释:
kl_divergence_优化后的实现