为什么sklearn.manifold中的TSNE对相同的值给出不同的答案?

时间:2017-05-04 07:52:41

标签: python scikit-learn

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)。仍然存在同样的问题。

1 个答案:

答案 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个维度。