手撕t-SNE算法

t-SNE(t-Distributed Stochastic Neighbor Embedding)即t分布随机邻近嵌入,类似于PCA,是一种数据降维方法,与PCA不同的是,它是非线性的。

SNE

假设我们的原始数据矩阵为 XRn×m X ∈ R n × m ,降维后的矩阵为 YRn×2 Y ∈ R n × 2 ,也就是说从 m m 维降为2维。

对于 X X

数据点之间的条件概率为:

pji=exixj22σ2ikiexixk22σ2i p j ∣ i = e − ‖ x i − x j ‖ 2 2 σ i 2 ∑ k ≠ i e − ‖ x i − x k ‖ 2 2 σ i 2

xixj2 ‖ x i − x j ‖ 2 也就是欧几里得距离,然后再套一个Softmax使它变成有效的概率。

n n 个数据点,两两分别按上式计算,得到概率矩阵 Pn×n P n × n i i 就是第几行, j j 就是第几列:

p1|1p1|2p1|np2|1p2|2p2|npn|1pn|2pn|n ( p 1 | 1 p 2 | 1 ⋯ p n | 1 p 1 | 2 p 2 | 2 ⋯ p n | 2 ⋮ ⋮ ⋮ ⋮ p 1 | n p 2 | n ⋯ p n | n )

σRn σ ∈ R n 是啥?

用过t-SNE进行可视化就知道有个参数叫困惑度(Perplexity),困惑度 K K

K=2H(Pi) K = 2 H ( P i )

其中 H H 是香农熵,即:
H(Pi)=jpj|ilog(pj|i) H ( P i ) = − ∑ j p j | i l o g ( p j | i )

困惑度 K K σ σ 的关系是,当我们设定好 K K 之后, σ σ 的值也为之确定,注意 σ σ 是一个维度为 n n 的向量。

σ σ 越大, P P 中每一行概率单纯形就越平均(趋向 1n 1 n ),熵就越大,困惑度 K K 也就越大。

对于 Y Y

数据点之间的条件概率为:

qji=exixj2kiexixk2 q j ∣ i = e − ‖ x i − x j ‖ 2 ∑ k ≠ i e − ‖ x i − x k ‖ 2

也就是没有了 σi σ i

同理也可以得到概率矩阵 Qn×n Q n × n

损失函数

要想使得两个分布差异尽可能小,可以用KL散度度量两个概率分布的差异,最小化差异从而得到损失函数:

C=minYDKL(PQ)=minYiPilogPiQi(39) (39) C = min Y D K L ( P ‖ Q ) = min Y ∑ i P i l o g P i Q i

使用梯度下降优化就可以得到 Y Y 啦。

t-SNE

t-SNE对SNE进行了进一步的假设并引入了t分布。
(后补)

你可能感兴趣的:(笔记)