简介
t-SNE
( TSNE )将数据点的相似性转换为概率。原始空间中的相似性表示为高斯联合概率(根据数据点之间的相似性转换为概率),嵌入空间中的相似性表示为 “学生” 的 t 分布。这允许 t-SNE 对局部结构特别敏感,并且有超过现有技术的一些其它优点.
t-SNE
是目前来说效果最好的数据降维与可视化方法,但是它的缺点也很明显,比如:占内存大,运行时间长。但是,当我们想要对高维数据进行分类,又不清楚这个数据集有没有很好的可分性(即同类之间间隔小,异类之间间隔大),可以通过 t-SNE 投影到 2 维或者 3 维的空间中观察一下。如果在低维空间中具有可分性,则数据是可分的;如果在高维空间中不具有可分性,可能是数据不可分,也可能仅仅是因为不能投影到低维空间
通过原始空间和嵌入空间的联合概率的 Kullback-Leibler(KL)散度来评估可视化效果的好坏,也就是说用有关 KL 散度的函数作为 loss 函数,然后通过梯度下降最小化 loss 函数,最终获得收敛结果.
使用 t-SNE 的缺点是:
- t-SNE 的计算复杂度很高,在数百万个样本数据集中可能需要几个小时,而 PCA 可以在几秒钟或几分钟内完成
- Barnes-Hut t-SNE 方法限于二维或三维嵌入。
- 算法是随机的,具有不同种子的多次实验可以产生不同的结果。虽然选择 loss 最小的结果就行,但可能需要多次实验以选择超参数。
- 全局结构未明确保留。这个问题可以通过 PCA 初始化点(使用init =‘pca’)来缓解。
优化 t-SNE
t-SNE 的主要目的是高维数据的可视化。因此,当数据嵌入二维或三维时,效果最好。有时候优化 KL 散度可能有点棘手。有6个参数可以控制 t-SNE 的优化,即会影响最后的可视化质量:
sklearn.manifold.TSNE(
n_components=2, perplexity=30.0, early_exaggeration=12.0,
learning_rate=200.0, n_iter=1000, n_iter_without_progress=300,
min_grad_norm=1e-07, metric='euclidean', init='random',
verbose=0, random_state=None, method='barnes_hut', angle=0.5, n_jobs=None
)
- n_components=2 . 默认为 2,嵌入空间的维度(嵌入空间的意思就是结果空间)
- perplexity 困惑度 . 默认为30,数据集越大,需要的参数值就越大,数据噪声越大,需要的参数值就越大
- early exaggeration factor 前期放大系数 . 控制原始空间中的自然集群在嵌入式空间中的紧密程度以及它们之间的空间。 对于较大的值,嵌入式空间中自然群集之间的空间将更大。 再次,这个参数的选择不是很关键。 如果在初始优化期间成本函数增加,则可能是该参数值过高
- learning rate 学习率 .
- maximum number of iterations 最大迭代次数 .
- init=‘random’ 初始化方法,建议为pca
- angle 角度 .
Methods | description |
---|---|
fit | 将 X 投影到一个嵌入空间 |
fit_transform | 将 X 投影到一个嵌入空间并返回转换结果 |
get_params | 获取 t-SNE 的参数 |
set_params | 设置 t-SNE 的参数 |
具体事例:
x=np.array(xb)
y=np.array(y)
print(""Computing t-SNE ")
tsne=TSNE(n_components=2,perplexity=5,early_exaggeration=30,init='pca',random_state=21)
start =time.time()
x_min,x_max = np.min(x,0), np.max(x,0)
x = (x-x_min)/(x_max-x_min)
fig = plt.figure()
ax = plt.subplot(111)
markers = ["+","o","<",">","*",".",",","p","3"]
for i in range(x.shape[0]):
plt.text(x[i,0],x[i,1],markers[int(y[i])],color=plt.cm.Set1(y[i]/8.),fontdict={'size':4})
plt.xticks(range(0,1))
plt.yticks(range(0,1))
result = tsne.fit_transform(x)
print("The shape of result is :{}".format(result.shape))
print("TSNE time is :{}".format(time.time-start))
plt.savefig('./tsne.png',dpi=500)