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:
上面给出的例子只是一个展示事实的玩具例子。实际上,我的数据是粗大的形状数组(500,100)。同样的问题依然存在。
发布于 2017-05-04 08:22:21
这是一个有趣的问题。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维。
https://stackoverflow.com/questions/43776976
复制相似问题