在R语言中进行t-SNE预测

11
目标: 我想要在R中使用t-SNE(t-分布随机邻居嵌入)对训练数据进行降维处理(其中训练数据包括N个观测值和K个变量,其中K>>N),并进一步得出测试数据的t-SNE表示。 示例: 假设我要将K个变量降至D=2维(通常情况下,t-SNE采用D=2D=3)。有两个R包:Rtsnetsne,这里我使用前者。
# load packages
library(Rtsne)

# Generate Training Data: random standard normal matrix with J=400 variables and N=100 observations
x.train <- matrix(nrom(n=40000, mean=0, sd=1), nrow=100, ncol=400)

# Generate Test Data: random standard normal vector with N=1 observation for J=400 variables
x.test <- rnorm(n=400, mean=0, sd=1)

# perform t-SNE
set.seed(1)
fit.tsne <- Rtsne(X=x.train, dims=2)

命令 fit.tsne$Y 将返回包含数据的 t-SNE 表示的 (100x2) 维对象;也可以通过 plot(fit.tsne$Y) 进行绘制。

问题:现在,我正在寻找一个函数,它可以基于训练好的 t-SNE 模型对我的测试数据返回一个 (1x2) 维度的预测值 pred。类似于:

# The function I am looking for (but doesn't exist yet):
pred <- predict(object=fit.tsne, newdata=x.test)

这是否可能?你能帮我解决这个问题吗?
4个回答

6
从作者本人(https://lvdmaaten.github.io/tsne/)得知:
t-SNE是学习非参数映射的,这意味着它不会学习从输入空间到地图的显式函数。因此,无法将测试点嵌入现有地图中(尽管可以重新运行t-SNE来处理整个数据集)。解决这个问题的一个潜在方法是训练一个多元回归器来预测地图位置,或者也可以使这样一个回归器直接最小化t-SNE损失。作者在这篇论文(https://lvdmaaten.github.io/publications/papers/AISTATS_2009.pdf)中就是这么做的。
因此,您不能直接应用新数据点。但是,您可以在您的数据和嵌入维度之间拟合一个多元回归模型。作者认识到这是该方法的局限性,并建议使用这种方法来解决这个问题。

6

t-SNE并不是这样工作的:

以下是t-SNE作者网站(https://lvdmaaten.github.io/tsne/)上的一篇专家文章:

一旦我有了一个t-SNE映射,如何将传入的测试点嵌入到该映射中?

t-SNE学习非参数映射,这意味着它不学习将数据从输入空间映射到映射的显式函数。因此,不可能将测试点嵌入到现有映射中(虽然您可以在完整数据集上重新运行t-SNE)。处理这个问题的一个潜在方法是训练一个多元回归器,以从输入数据预测映射位置。另外,您还可以使这样的回归器直接最小化t-SNE损失,这就是我在这篇论文中所做的。

您可能会对他的论文感兴趣:https://lvdmaaten.github.io/publications/papers/AISTATS_2009.pdf

这个网站不仅非常酷,还提供了关于t-SNE的大量信息:http://distill.pub/2016/misread-tsne/

在Kaggle上,我还看到人们做了类似的事情,这也可能会引起兴趣: https://www.kaggle.com/cherzy/d/dalpozz/creditcardfraud/visualization-on-a-2d-map-with-t-sne


6
这是Rtsne软件包作者(Jesse Krijthe)的邮件回复:

感谢您提供非常具体的问题。我之前收到过这样的请求,它已经被记录为GitHub上的一个未解决问题(https://github.com/jkrijthe/Rtsne/issues/6)。我犹豫实现这样的功能的主要原因是,在某种意义上,没有“自然”的方法来解释预测在tsne方面的含义。对我来说,tsne是一种可视化距离矩阵的方式。因此,新样本会导致新的距离矩阵,从而产生新的可视化效果。所以,我目前的想法是唯一明智的方法是在训练集和测试集上重新运行tsne过程。
话虽如此,其他人认为定义预测是有意义的,例如通过在地图中保持训练对象不变并为测试对象找到良好的位置(如在问题中建议的那样)。我个人更喜欢的方法是类似于参数化tsne,Laurens van der Maaten(tsne论文的作者)在一篇论文中探索了这个方法。然而,最好使用其他东西而不是我的软件包来实现这个方法,因为如果用户选择了参数模型,则参数模型可能最有效。
因此,我的建议是1)使用所有数据重新拟合映射或2)查找参数化tsne的实现,我所知道的唯一一个是Laurens的Matlab实现。
很抱歉我不能提供更多帮助。如果您想到任何其他/更好的解决方案,请告诉我。

0

t-SNE基本上不会做你想要的事情。t-SNE仅设计用于在低(2或3)维空间中可视化数据集。您一次性提供要可视化的所有数据。它不是通用的降维工具。

如果您正在尝试将t-SNE应用于“新”数据,则可能没有正确考虑问题,或者可能只是没有理解t-SNE的目的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接