from sklearn.manifold import TSNE
tsne = TSNE(n_components=2, init='pca', n_iter=5000)
print(tsne.fit_transform(np.array([[1,2,3],[3,4,3],[1,2,3],[3,3,3]])))
输出:
[[ 547.9452404 11.31943926]
[-152.33035505 -223.32060683]
[ 97.57201578 84.04839505]
[-407.18939464 124.50285141]]
对于矢量[1,2,3],重复两次,它给出了不同的值/矢量。
为什么会这样?
EDIT1:
上面给出的例子只是一个展示事实的玩具示例。实际上我的数据是numpy数组(500,100)。仍然存在同样的问题。
答案 0 :(得分:2)
这是一个有趣的问题。 TSNE将样本转换为保留它们之间距离的不同空间,但不保证保留数据样本的值。它将每个样本视为不同的点,并尝试将从该点到另一个样本的距离映射到另一个空间。这不考虑样本的值,只考虑其与其他每个点的相对距离。
您可以查看:
>>> a = np.array([[1,2,3],[3,4,3],[1,2,3],[3,3,3]])
>>> b = TSNE(n_components=2)
>>> from sklearn.metrics import euclidean_distances
>>> print(euclidean_distances(b[0], b).sum())
2498.7985853798709
>>> print(euclidean_distances(b[2], b).sum())
2475.26750924
>>> print(b)
[[-201.41082311 361.14132525]
[-600.23416334 -523.48599925]
[ 180.07532649 -288.01414955]
[ 553.42486539 538.85793453]]
它大致保留了两个样本与其他每个样本的相似距离(考虑到比例),尽管它们具有不同的表示形式。
关于为什么只有4个样本那么糟糕,我的猜测是你只有4个样本和3个维度。 TSNE不能用如此少的样本推断出正确的映射。假设使用高维数据(及其多个样本)。
对于低维数据,我会说一个简单的PCA可以完成这项工作。 PCA您的数据并保持前2个维度。