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)} pj∣i?=∑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?=2Npj∣i?+pi∣j??
并且, 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]]
参考:
- 官方文档;
- wike tSNE;
- tSNE推导 推荐;