我尝试在scikit学习中使用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)
输出:
array([[ 0.00017599, 0.00003993], #1
[ 0.00009891, 0.00021913],
[ 0.00018554, -0.00009357],
[ 0.00009528, -0.00001407]]) #2
之后,我尝试将一些坐标与第一个数组X
中的坐标完全相同的点添加到现有模型中:
Y = np.array([[0, 0, 0], [1, 1, 1]])
model.fit_transform(Y)
输出:
array([[ 0.00017882, 0.00004002], #1
[ 0.00009546, 0.00022409]]) #2
但是第二数组中的坐标不等于第一数组中的第一个和最后一个坐标。
我知道这是正确的行为,但我如何向model
添加新的坐标,并在输出数组中为输入数组中的相同坐标获得相同的坐标
此外,即使添加了新的点,我仍然需要获得最接近的点。
从这里引用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/.