一、什么是t-SNE

t-SNE的作用是:为了可视化,以直观地了解数据的结构,比如数据大致聚成几团,哪些数据聚成一团,哪些团比较近,等等。

为什么t-SNE能够做到可视化呢?主要是将数据降维到2维/3维的功劳,因为这样就可以被人眼观察到了,拿一个例子来看一下背后的原理。

假设你有一个二维空间的数据,想要转换到一维空间并且将他们分离开来,如下图所示:

§ t-SNE可视化 - 图1

如果直接将y轴坐标映射到x轴上,就会变成下面的样子

§ t-SNE可视化 - 图2

我们知道自然条件下,数据一般都会服从某种分布,那能不能将数据根据某种规则来映射到这个分布上呢?来看下图:

§ t-SNE可视化 - 图3

上图是说,我先选出某个点,然后计算这个点到所有点的距离,因为同一类的距离小嘛,所以映射到对应的分布上就成了以下的样子啦。而TSNE所对应的分布就是t分布,bingo,以上就是大致的原理啦。

原文链接:笔记 | 什么是TSNE - 知乎 (zhihu.com)

二、t-SNE代码

下面是一个t-SNE的示例代码,通过这个简单的代码就可以知道这个轮子是怎么跑起来的,之后再调试这个轮子里的参数

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from sklearn import datasets
  4. from sklearn.manifold import TSNE
  5. class FeatureVisualize(object):
  6. '''
  7. Visualize features by TSNE
  8. '''
  9. def __init__(self, features, labels):
  10. '''
  11. features: (m,n)
  12. labels: (m,)
  13. '''
  14. self.features = features
  15. self.labels = labels
  16. def plot_tsne(self, save_eps=False):
  17. ''' Plot TSNE figure. Set save_eps=True if you want to save a .eps file.
  18. '''
  19. tsne = TSNE(n_components=2, init='pca', random_state=0)
  20. features = tsne.fit_transform(self.features)
  21. x_min, x_max = np.min(features, 0), np.max(features, 0)
  22. data = (features - x_min) / (x_max - x_min)
  23. del features
  24. for i in range(data.shape[0]):
  25. plt.text(data[i, 0], data[i, 1], str(self.labels[i]),
  26. color=plt.cm.Set1(self.labels[i] / 10.),
  27. fontdict={'weight': 'bold', 'size': 9})
  28. plt.xticks([])
  29. plt.yticks([])
  30. plt.title('T-SNE')
  31. if save_eps:
  32. plt.savefig('tsne.eps', dpi=600, format='eps')
  33. plt.show()
  34. if __name__ == '__main__':
  35. digits = datasets.load_digits(n_class=5)
  36. features, labels = digits.data, digits.target
  37. print(features.shape)
  38. print(labels.shape)
  39. vis = FeatureVisualize(features, labels)
  40. vis.plot_tsne(save_eps=True)