为什么 R 中 t-SNE 的实现默认是去重?

机器算法验证 r 特纳
2022-03-15 04:01:39

具体来说,Rtsne 包中 t-SNE 的 R 实现有一个“check_duplicates”参数,文档建议“最好确保不存在重复项并将此选项设置为 FALSE,尤其是对于大型数据集”。

此外,如果您尝试在 R 中存在重复项的数据集上运行 t-SNE,您会收到错误消息:“[用户截断的命令] 中的错误:在运行 TSNE 之前删除重复项。”

那么,为什么会出现这种行为呢?我有一个数据集,其中多个样本巧合地具有相同的测量值。

它只是一个“重复的数据点,在减少之后,无论如何都会有相同的数据点,所以不要浪费处理能力”?重复项的存在是否会影响过程的计算?

3个回答

该算法旨在处理没有重复信息的数据集,因此包在应用该技术之前会进行检查。他们建议您删除重复项并设置check_duplicates = FALSE以提高性能。

R中的实现是这样的:

if (check_duplicates & !is_distance){
if (any(duplicated(X))) { stop("Remove duplicates before running TSNE.")}

带有默认值check_duplicates = TRUEis_distance = FALSE.

这篇论文,对于谁想要更多地了解该方法,就在这里

t-SNE方法不需要删除重复项。它是默认功能这一事实Rtsne并不意味着它的要求。它对于一些短期事件监控很有用。对于使用大数据集来表征长期趋势和/或模式,我看不到什么用处。Rtsne默认设置更倾向于在时域中表征事件,而无需在傅里叶域中进行任何研究

假设您在时域中有点。重复算法会导致大量误报,因为重复检查主要是针对时域信号设计的。傅立叶空间可以表明那些被算法重复考虑的事件是不必要的。

所以我的观察是,该算法对时域中的重复点很贪心,这在考虑长期信号、长期趋势和长期模式时对我没有用处。该点在时域中重复的事实实际上并不意味着它在傅里叶域中也是重复的。我认为如果在现实生活中的应用程序中在时域中出现重复,那将是更多的巧合。所以关掉这个功能应该没问题。要估计有多少点在两个域中真正重复,具体取决于案例研究。通过考虑长期数据集而无需在许多实际应用程序中进行重复检查,我可以更好地描述事件和/或现象。

我认为Rtsne文档并不清楚[关闭check_duplicates并] 不要浪费处理能力确实存在如上所述的其他原因,如check_duplicates也通过该方法的一些其他实施方式实现的那样,可以将其关闭。目前默认情况下check_duplicates=TRUE是开发人员的个人选择。Rtsne我很想知道该决定是否有任何实施原因。

除了Léo 的回答之外,删除重复项甚至可能是“危险的”。

想象一下,您想探索一个描述机器学习问题的数据集,以查看特征和标签之间是否存在任何相关性:

如果您删除特征空间中的重复项,则 tsne 有更高的机会创建具有特定标签的集群。但是如果特征和标签之间没有相关性(即相同的特征组合可能导致不同的标签),这可能会让您认为存在相关性,因为这些重复点已被删除,您的 tsne-plot 看起来会“更干净”。