目标:我希望在R中使用t-SNE(t分布随机邻域嵌入)对我的训练数据(包含N个观测和K个变量,其中K>>N)进行降维处理,并随后为我的测试数据生成t-SNE表示。
示例:假设我希望将K个变量降维到D=2维(通常,t-SNE使用D=2或D=3)。有两个R包:Rtsne
和tsne
,我在这里使用前者。
# 加载包
library(Rtsne)
# 生成训练数据:具有J=400个变量和N=100个观测的随机标准正态矩阵
x.train <- matrix(nrom(n=40000, mean=0, sd=1), nrow=100, ncol=400)
# 生成测试数据:具有N=1个观测和J=400个变量的随机标准正态向量
x.test <- rnorm(n=400, mean=0, sd=1)
# 执行t-SNE
set.seed(1)
fit.tsne <- Rtsne(X=x.train, dims=2)
其中命令fit.tsne$Y
将返回包含数据t-SNE表示的(100×2)维对象;也可以通过plot(fit.tsne$Y)
进行绘图。
问题:现在,我正在寻找一个函数,该函数基于训练的t-SNE模型为我的测试数据返回一个维度为(1×2)的预测pred
。类似于,
# 我正在寻找的函数(但目前还不存在):
pred <- predict(object=fit.tsne, newdata=x.test)
(如何)这是可能的吗?你能帮我解决这个问题吗?
回答:
这是Rtsne包作者(Jesse Krijthe)的邮件回复:
感谢您提出如此具体的问题。我之前也收到过类似的请求,并且在GitHub上标记为一个未解决的问题(https://github.com/jkrijthe/Rtsne/issues/6)。我犹豫是否要实现这样的功能,主要原因是,从某种意义上说,t-SNE的预测没有一个“自然”的解释方式。对我来说,t-SNE是一种可视化距离矩阵的方式。因此,一个新的样本会导致一个新的距离矩阵,从而产生一个新的可视化。所以,我目前的想法是,唯一合理的方式是重新运行t-SNE程序,将训练集和测试集结合起来。
尽管如此,其他一些人认为定义预测是有意义的,例如,通过在映射中固定训练对象,并为测试对象找到合适的位置(如在该问题中所建议的)。我个人更倾向于一种方法,如参数化t-SNE,这是Laurens van der Maaten(t-SNE论文的作者)在论文中探讨过的。然而,这最好使用我的包以外的其他东西来实现,因为参数模型最有效的选择可能需要由用户来决定。
所以我的建议是1)使用所有数据重新拟合映射,或者2)看看是否能找到参数化t-SNE的实现,我知道的唯一一个是Laurens的Matlab实现。
很抱歉我不能提供更多帮助。如果您想出任何其他/更好的解决方案,请告诉我。