向 t-SNE 模型添加新点

kon*_*cov 5 python machine-learning scikit-learn

我尝试在 scikit-learn 中使用 t-SNE 算法:

import numpy as np
from sklearn.manifold import TSNE
X = np.array([[0, 0, 0], [0, 1, 1], [1, 0, 1], [1, 1, 1]])
model = TSNE(n_components=2, random_state=0)
np.set_printoptions(suppress=True)
model.fit_transform(X) 
Run Code Online (Sandbox Code Playgroud)

输出:

array([[ 0.00017599,  0.00003993], #1
       [ 0.00009891,  0.00021913], 
       [ 0.00018554, -0.00009357],
       [ 0.00009528, -0.00001407]]) #2
Run Code Online (Sandbox Code Playgroud)

之后,我尝试将一些坐标与第一个数组中的坐标完全相同的点添加X到现有模型中:

Y = np.array([[0, 0, 0], [1, 1, 1]])
model.fit_transform(Y) 
Run Code Online (Sandbox Code Playgroud)

输出:

array([[ 0.00017882,  0.00004002], #1
       [ 0.00009546,  0.00022409]]) #2
Run Code Online (Sandbox Code Playgroud)

但第二个数组中的坐标不等于第一个数组中的第一个和最后一个坐标。

我知道这是正确的行为,但是如何向model输入数组中的相同坐标添加新坐标并在输出数组中获得相同的坐标?

此外,即使在附加新点之后,我仍然需要获取最近的点。

and*_*ino 3

在这里引用 t-SNE 的作者: https: //lvdmaaten.github.io/tsne/

一旦我有了 t-SNE 地图,我如何在该地图中嵌入传入的测试点?

t-SNE 学习非参数映射,这意味着它不会学习将数据从输入空间映射到映射的显式函数。因此,不可能将测试点嵌入到现有地图中(尽管您可以在完整数据集上重新运行 t-SNE)。解决这个问题的一种潜在方法是训练多元回归器来根据输入数据预测地图位置。或者,您也可以让这样的回归器直接最小化 t-SNE 损失,这就是我在本文中所做的。

另外,stats.stackexchange.com 上的这个答案包含想法和链接

t-SNE 的一个非常好且非常快的最新 Python 实现https://github.com/pavlin-policar/openTSNE允许嵌入开箱即用的新点

以及https://github.com/berenslab/rna-seq-tsne/的链接。