一、什么是t-SNE
t-SNE的作用是:为了可视化,以直观地了解数据的结构,比如数据大致聚成几团,哪些数据聚成一团,哪些团比较近,等等。
为什么t-SNE能够做到可视化呢?主要是将数据降维到2维/3维的功劳,因为这样就可以被人眼观察到了,拿一个例子来看一下背后的原理。
假设你有一个二维空间的数据,想要转换到一维空间并且将他们分离开来,如下图所示:
如果直接将y轴坐标映射到x轴上,就会变成下面的样子
我们知道自然条件下,数据一般都会服从某种分布,那能不能将数据根据某种规则来映射到这个分布上呢?来看下图:
上图是说,我先选出某个点,然后计算这个点到所有点的距离,因为同一类的距离小嘛,所以映射到对应的分布上就成了以下的样子啦。而TSNE所对应的分布就是t分布,bingo,以上就是大致的原理啦。
原文链接:笔记 | 什么是TSNE - 知乎 (zhihu.com)
二、t-SNE代码
下面是一个t-SNE的示例代码,通过这个简单的代码就可以知道这个轮子是怎么跑起来的,之后再调试这个轮子里的参数
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.manifold import TSNE
class FeatureVisualize(object):
'''
Visualize features by TSNE
'''
def __init__(self, features, labels):
'''
features: (m,n)
labels: (m,)
'''
self.features = features
self.labels = labels
def plot_tsne(self, save_eps=False):
''' Plot TSNE figure. Set save_eps=True if you want to save a .eps file.
'''
tsne = TSNE(n_components=2, init='pca', random_state=0)
features = tsne.fit_transform(self.features)
x_min, x_max = np.min(features, 0), np.max(features, 0)
data = (features - x_min) / (x_max - x_min)
del features
for i in range(data.shape[0]):
plt.text(data[i, 0], data[i, 1], str(self.labels[i]),
color=plt.cm.Set1(self.labels[i] / 10.),
fontdict={'weight': 'bold', 'size': 9})
plt.xticks([])
plt.yticks([])
plt.title('T-SNE')
if save_eps:
plt.savefig('tsne.eps', dpi=600, format='eps')
plt.show()
if __name__ == '__main__':
digits = datasets.load_digits(n_class=5)
features, labels = digits.data, digits.target
print(features.shape)
print(labels.shape)
vis = FeatureVisualize(features, labels)
vis.plot_tsne(save_eps=True)