当前位置: 代码迷 >> 综合 >> python包:sklearn.manifold.TSNE
  详细解决方案

python包:sklearn.manifold.TSNE

热度:24   发布时间:2023-12-19 04:16:04.0

1. t-SNE理论

t-distributed Stochastic Neighbor Embedding,t分布的随机相邻嵌入。

输入
N 个高维数据。
在这里插入图片描述
输出
低维数据 y, y 的维度为 d.
在这里插入图片描述
t-SNE 计算 x i x_i xi? x j x_j xj?的相似度 p i j p_{ij} pij?.
p j ∣ i = exp ? ( ? ∥ x i ? x j ∥ 2 / 2 σ i 2 ) ∑ k ≠ i exp ? ( ? ∥ x i ? x k ∥ 2 / 2 σ i 2 ) p_{j | i}=\frac{\exp \left(-\left\|\mathbf{x}_{i}-\mathbf{x}_{j}\right\|^{2} / 2 \sigma_{i}^{2}\right)}{\sum_{k \neq i} \exp \left(-\left\|\mathbf{x}_{i}-\mathbf{x}_{k}\right\|^{2} / 2 \sigma_{i}^{2}\right)} pji?=k??=i?exp(?xi??xk?2/2σi2?)exp(?xi??xj?2/2σi2?)?
p i j = p j ∣ i + p i ∣ j 2 N p_{i j}=\frac{p_{j | i}+p_{i | j}}{2 N} pij?=2Npji?+pij??
并且, p i i = 0 p_{ii} = 0 pii?=0.
使用 q i j q_{ij} qij? 测量 y i y_i yi? y j y_j yj?的相似度。
在这里插入图片描述

尽量减少 P 分布和 Q 分布,用KL散度来衡量分布的距离:
在这里插入图片描述
在低维空间下,我们使用更加偏重长尾分布的方式来将距离转换为概率分布,使得高维度下中低等的距离在映射后能够有一个较大的距离。

t-SNE算法过程:
在这里插入图片描述

主要不足有四个:

  • 主要用于可视化,很难用于其他目的。比如测试集合降维,因为他没有显式的预估部分,不能在测试集合直接降维;比如降维到10维,因为t分布偏重长尾,1个自由度的t分布很难保存好局部特征,可能需要设置成更高的自由度。
  • t-SNE倾向于保存局部特征,对于本征维数(intrinsic dimensionality)本身就很高的数据集,是不可能完整的映射到2-3维的空间
  • t-SNE没有唯一最优解,且没有预估部分。如果想要做预估,可以考虑降维之后,再构建一个回归方程之类的模型去做。但是要注意,t-sne中距离本身是没有意义,都是概率分布问题。
  • 训练太慢。有很多基于树的算法在t-sne上做一些改进

2、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]])
X_embedded = TSNE(n_components=2).fit_transform(X)
print(X_embedded)

输出:

[[  49.43867  -232.42368 ][-158.12872  -188.12868 ][-113.829155   19.437737][  93.73828   -24.857227]]

参考:

  1. 官方文档;
  2. wike tSNE;
  3. tSNE推导 推荐;