数据降维与可视化——t-SNE
来源:互联网 发布:房产中介软件 亿房通 编辑:程序博客网 时间:2024/06/05 03:59
- 数据降维与可视化t-SNE
- t-distributed Stochastic Neighbor Embeddingt-SNE
- 优化 t-SNE
- Barnes-Hut t-SNE
- 注意事项
- 参数说明
- 实例
- Hello World
- S曲线的降维与可视化
- 手写数字的降维可视化
- t-distributed Stochastic Neighbor Embeddingt-SNE
声明:
- manifold:可以称之为流形数据。像绳结一样的数据,虽然在高维空间中可分,但是在人眼所看到的低维空间中,绳结中的绳子是互相重叠的不可分的。
- 参考sklearn官方文档
数据降维与可视化——t-SNE
t-SNE是目前来说效果最好的数据降维与可视化方法,但是它的缺点也很明显,比如:占内存大,运行时间长。但是,当我们想要对高维数据进行分类,又不清楚这个数据集有没有很好的可分性(即同类之间间隔小,异类之间间隔大),可以通过t-SNE投影到2维或者3维的空间中观察一下。如果在低维空间中具有可分性,则数据是可分的;如果在高维空间中不具有可分性,可能是数据不可分,也可能仅仅是因为不能投影到低维空间。
下面会简单介绍t-SNE的原理,参数和实例。
t-distributed Stochastic Neighbor Embedding(t-SNE)
t-SNE(TSNE)将数据点之间的亲和力转换为概率。原始空间中的亲和度由高斯联合概率表示,嵌入空间的亲和度由“学生t分布”表示。这使得t-SNE对局部结构特别敏感,并且与现有技术相比具有一些其他优点:
- 在单个图上显示多个尺度的结构
- 可以显示多类的、不同的、在高维空间上交错的或聚合的数据
- 显示图像中相同类的数据点的分布更发散
虽然Isomap,LLE和variants等数据降维和可视化方法,最适合展开单个连续的低维的manifold,但是t-SNE主要是关注数据的局部结构,并且对于下图所示的S曲线(不同颜色的图像表示不同类别的数据)。正是这种关注数据局部特征的方法,更有利于manifold数据的可视化。
通过原始空间和嵌入空间的联合概率的Kullback-Leibler(KL)散度来评估可视化效果的好坏,也就是说用有关KL散度的函数作为loss函数,然后通过梯度下降最小化loss函数,最终获得收敛结果。注意,有关KL散度的loss函数不是凸函数,即具有不同初始值的多次运行将收敛于KL散度函数的局部最小值中,以致获得不同的结果。因此,尝试不同的随机数种子(Python中可以通过设置seed来获得不同的随机分布)有时候是有用的,并选择具有最低KL散度值的结果。
使用t-SNE的缺点大概是:
- t-SNE的计算复杂度很高,在数百万个样本数据集中可能需要几个小时,而PCA可以在几秒钟或几分钟内完成
- Barnes-Hut t-SNE方法(下面讲)限于二维或三维嵌入。
- 算法是随机的,具有不同种子的多次实验可以产生不同的结果。虽然选择loss最小的结果就行,但可能需要多次实验以选择超参数。
- 全局结构未明确保留。这个问题可以通过PCA初始化点(使用
init ='pca'
)来缓解。
优化 t-SNE
t-SNE的主要目的是高维数据的可视化。因此,当数据嵌入二维或三维时,效果最好。有时候优化KL散度可能有点棘手。有五个参数可以控制t-SNE的优化,即会影响最后的可视化质量:
- perplexity困惑度
- early exaggeration factor前期放大系数
- learning rate学习率
- maximum number of iterations最大迭代次数
- angle角度
困惑度被定义为
Maximum number of iterations通常是比较高的,不需要任何调整。优化包括两个阶段:前期放大阶段和最终优化阶段。在前期放大阶段,原始空间的联合概率将通过乘以给定因子(参数early exaggeration factor)的方式人为的增加。其中,给定因子越大,自然类之间的间隔越大。如果因子太高,KL散度可能会增加。不过通常我们不需要调整它。一个关键参数是learning rate。learning rate如果太低的梯度下降将被困在局部最小的地方。如果太高,则优化过程中KL散度将会增加。最后一个参数angle是性能和精度之间的折衷。较大的angle意味着我们可以通过单个点近似较大的区域,导致更好的速度,但是不太准确的结果。
Barnes-Hut t-SNE
在这里实施的Barnes-Hut t-SNE通常比其他流形学习算法慢得多。它的优化是相当困难的,梯度的计算复杂度是O[dNlog(N)],其中d是输出维数,N是样本数。 虽然相比原始t-SNE中梯度计算复杂度O[dNlog(N)]有了提升,但它还有其他几个显着差异:
- Barnes-Hut仅在目标维度为3或更小时才起作用。以2D可视化为主。
- Barnes-Hut仅适用于密集的输入数据。稀疏数据矩阵只能用特定的方法嵌入,或者可以通过投影近似,例如使用sklearn.decomposition.TruncatedSVD
- Barnes-Hut是一个近似值。使用angle参数对近似进行控制,因此当参数
method="exact"
时,angle参数不能使用。 - Barnes-Hut可以处理更多的数据。 Barnes-Hut可用于嵌入数十万个数据点。
为了可视化的目的(这是t-SNE的主要用处),强烈建议使用Barnes-Hut方法。精确的t-SNE方法可用于检查可能在较高维空间中的嵌入的理论属性,但由于计算约束限制了对小数据集的可视化应用。
还要注意,手写数字集合的标签大致与t-SNE发现的自然分组相符,而PCA模型的线性2D投影产生标签区域则有特别多的重叠。这很好的表明了,这个数据集可以通过专注于局部结构的非线性方法(例如,具有高斯RBF内核的SVM)来很好地分离。然而,未能在2D中用t-SNE显现良好分离的均匀标记的组不一定意味着数据不能被监督模型正确分类,还可能是因为2维不足以准确地表示数据的内部结构。
注意事项
- 数据集在所有特征维度上的尺度应该相同
参数说明
method='barnes_hut'
时可用实例
Hello World
一个简单的例子,输入4个3维的数据,然后通过t-SNE降维称2维的数据。
import numpy as npfrom sklearn.manifold import TSNEX = np.array([[0, 0, 0], [0, 1, 1], [1, 0, 1], [1, 1, 1]])tsne = TSNE(n_components=2)tsne.fit_transform(X)print(tsne.embedding_)'''输出[[ 3.17274952 -186.43092346] [ 43.70787048 -283.6920166 ] [ 100.43157196 -145.89025879] [ 140.96669006 -243.15138245]]'''
S曲线的降维与可视化
S曲线上的数据是高维的数据,其中不同颜色表示数据的不同类别。当我们通过t-SNE嵌入到二维空间中后,可以看到数据点之间的类别信息完美的保留了下来
# coding='utf-8'"""# 一个对S曲线数据集上进行各种降维的说明。"""from time import timeimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dfrom matplotlib.ticker import NullFormatterfrom sklearn import manifold, datasets# # Next line to silence pyflakes. This import is needed.# Axes3Dn_points = 1000# X是一个(1000, 3)的2维数据,color是一个(1000,)的1维数据X, color = datasets.samples_generator.make_s_curve(n_points, random_state=0)n_neighbors = 10n_components = 2fig = plt.figure(figsize=(8, 8))# 创建了一个figure,标题为"Manifold Learning with 1000 points, 10 neighbors"plt.suptitle("Manifold Learning with %i points, %i neighbors" % (1000, n_neighbors), fontsize=14)'''绘制S曲线的3D图像'''ax = fig.add_subplot(211, projection='3d')ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=color, cmap=plt.cm.Spectral)ax.view_init(4, -72) # 初始化视角'''t-SNE'''t0 = time()tsne = manifold.TSNE(n_components=n_components, init='pca', random_state=0)Y = tsne.fit_transform(X) # 转换后的输出t1 = time()print("t-SNE: %.2g sec" % (t1 - t0)) # 算法用时ax = fig.add_subplot(2, 1, 2)plt.scatter(Y[:, 0], Y[:, 1], c=color, cmap=plt.cm.Spectral)plt.title("t-SNE (%.2g sec)" % (t1 - t0))ax.xaxis.set_major_formatter(NullFormatter()) # 设置标签显示格式为空ax.yaxis.set_major_formatter(NullFormatter())# plt.axis('tight')plt.show()
手写数字的降维可视化
这里的手写数字数据集是一堆8*8的数组,每一个数组都代表着一个手写数字。如下图所示。
t-SNE将8*8即64维的数据降维成2维,并在平面图中显示,这里只选取了0-5,6个手写数字。
# coding='utf-8'"""t-SNE对手写数字进行可视化"""from time import timeimport numpy as npimport matplotlib.pyplot as pltfrom sklearn import datasetsfrom sklearn.manifold import TSNEdef get_data(): digits = datasets.load_digits(n_class=6) data = digits.data label = digits.target n_samples, n_features = data.shape return data, label, n_samples, n_featuresdef plot_embedding(data, label, title): x_min, x_max = np.min(data, 0), np.max(data, 0) data = (data - x_min) / (x_max - x_min) fig = plt.figure() ax = plt.subplot(111) for i in range(data.shape[0]): plt.text(data[i, 0], data[i, 1], str(label[i]), color=plt.cm.Set1(label[i] / 10.), fontdict={'weight': 'bold', 'size': 9}) plt.xticks([]) plt.yticks([]) plt.title(title) return figdef main(): data, label, n_samples, n_features = get_data() print('Computing t-SNE embedding') tsne = TSNE(n_components=2, init='pca', random_state=0) t0 = time() result = tsne.fit_transform(data) fig = plot_embedding(result, label, 't-SNE embedding of the digits (time %.2fs)' % (time() - t0)) plt.show(fig)if __name__ == '__main__': main()
- 数据降维与可视化——t-SNE
- 高维数据的可视化 Visualizing data using t-SNE
- t-SNE高维数据可视化(python)
- 可视化利器 —— t-SNE(matlab toolbox 的使用与解释)
- 诠释数据降维算法:一文讲尽t-分布邻域嵌入算法(t-SNE)如何有效利用
- 诠释数据降维算法:一文讲尽t-分布邻域嵌入算法(t-SNE)如何有效利用
- Python中T-SNE实现降维
- 【机器学习】关于t-sne:降维、可视化
- 使用 t-SNE算法和JavaScript语言可视化Visualizing Top Tweeps with t-SNE, in Javascript
- sklearn降维方法举例(RandomProjection,TSVD,t-SNE)
- t-SNE
- t-SNE
- DeepLearning:二、t-SNE(Stochastic Neighbor Embedding )降维方法
- 人工智障学习笔记——机器学习(15)t-SNE降维
- t-SNE介绍
- t-SNE初学
- t-SNE理解
- t-SNE详细介绍
- js 浏览器 返回上一级页面并刷新
- Linux中备份mysql数据库
- Linux 中source与点”.”命令的区别
- 笔记13 | 练习Volley(二)加载网络图片的三种方法
- WebView播放视频的问题
- 数据降维与可视化——t-SNE
- Python序列化
- transient 关键字
- 论文管理工具 Mendeley
- C语言基础
- Qt/C++将web网页POST发送的数据转换成正常字符
- 设计模式之适配器模式
- java对json数组格式的字符串的处理
- 最详细易懂的CRC-16校验原理(附源程序)