背景
t-SNE(t-Distributed Stochastic Neighbor Embedding)是一种非常流行的非线性降维技术,主要用来对高维数据进行可视化,了解和验证数据或者模型。t-SNE属于流行学习(manifold learning),假设数据是均匀采样于一个高维欧氏空间中的低维流形,流形学习就是从高维采样数据中恢复低维流形结构,即找到高维空间中的低维流形,并求出相应的嵌入映射,以实现维数约简或者数据可视化。
t-SNE 基本理论
假设一个数据集X,数据集中每个样本都是D维的,X∈RD,t-SNE的目的是生成一个低维的特征集Y∈Rd来表征样本,其中d 远小于D。最典型的为d=2,从而将高维样本数据在二维平面上表示,方便观察数据的分布特性。
在降维过程中,目的是使原始空间中的两个样本点x_i和x_j在降维后的空间中对应的点y_i和y_j保持同样的距离分布。为了达到这样的效果,t-SNE将原始空间的相似性建模为概率密度,并且相似性的分布由高斯分布给出。即,在原始空间中已知样本点i的情况下,j点和i点间的相似性可以用条件概率分布公式来表示:
p_j∣i=∑_k=iexp(−∥x_i−x_k∥2/2σ_i2)exp(−∥x_i−x_j∥2/2σ_i2)
由于相似度是对称的,即i 和j 的相似度应该是等于j 和i 的相似度,所以最终的联合概率分布:
p_ij=2p_j∣i+p_i∣j
在降维后的空间中,用学生t分布(Student’s t-distribution)代替高斯分布,因为学生t分布有更粗的尾巴,能够保留更多较远的距离的相似度。所以在降维后的目标空间中,联合概率分布为如下形式:
q_ij=∑_k=l(1+∥y_k−y_l∥2)−1(1+∥y_i−y_j∥2)−1
目的是为了让这个两个概率分布尽可能的相似,这样就说明在降维后的数据分布和原始空间的数据分布基本一致,因此使用KL散度进行度量这两个分布之间的相似度:
C=KL(P∥Q)=∑_ijp_ijlogq_ijp_ij
根据以上目标函数进行优化,常用的优化方法就是梯度下降法。因为我们希望的是得到一个较好的Y ,所以梯度如下:
∂yi∂C=4∑_j=i(p_ij−q_ij)(y_i−y_j)(1+∥y_i−y_j∥2)−1
实例
手写数字可视化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
from sklearn import manifold,datasets
import time import numpy as np import matplotlib.pyplot as plt
n_components = 2
digits = datasets.load_digits(n_class=10) data = digits['data'] label = digits['target'] n_samples, n_features = data.shape n_features
tsne = manifold.TSNE(n_components=n_components, init='pca', random_state=0, perplexity=30) start = time.time() result = tsne.fit_transform(data) end = time.time() print('t-SNE time: {}'.format(end-start))
x_min, x_max = np.min(result, 0), np.max(result, 0) result = (result-x_min)/(x_max-x_min) ax = plt.subplot(111) for i in range(n_samples): plt.text(result[i, 0], result[i, 1], str(label[i]), color=plt.cm.Set1(label[i] / 10.), fontdict={'weight': 'bold', 'size': 9}) plt.xticks([]) plt.yticks([]) plt.title('t-SNE-digits') plt.show()
|
联系作者