首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么sklearn.manifold中的TSNE对于相同的值给出了不同的答案?

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

Stack Overflow用户
提问于 2017-05-04 07:52:40
回答 1查看 1.8K关注 0票数 3
代码语言:javascript
复制
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]])))

产出:

代码语言:javascript
复制
[[ 547.9452404    11.31943926]
 [-152.33035505 -223.32060683]
 [  97.57201578   84.04839505]
 [-407.18939464  124.50285141]]

对于重复两次的向量1,2,3,给出了不同的值/向量。

为什么会这样呢?

Edit1:

上面给出的例子只是一个展示事实的玩具例子。实际上,我的数据是粗大的形状数组(500,100)。同样的问题依然存在。

EN

回答 1

Stack Overflow用户

发布于 2017-05-04 08:22:21

这是一个有趣的问题。TSNE将样本转换成一个不同的空间,以保持它们之间的距离,但它不能保证保留数据样本的值。它将每个样本视为不同的点,并试图将从该点到另一个样本的距离映射到另一个空间。这没有考虑到一个样本的值,只考虑到它与其他点的相对距离。

你可以检查一下:

代码语言:javascript
复制
>>> 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维。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43776976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档