t-SNE实践——sklearn教程

本文深入探讨了t-SNE算法的基本原理及其在数据可视化中的应用。介绍了t-SNE相较于SNE的优势,详细解释了其参数设置及优化过程,并通过实例展示了如何使用Python的sklearn库实现t-SNE。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

声明:

  1. 参考sklearn官方文档

t-SNE

t-SNE是一种集降维与可视化于一体的技术,它是基于SNE可视化的改进,解决了SNE在可视化后样本分布拥挤、边界不明显的特点,是目前最好的降维可视化手段。
关于t-SNE的历史和原理详见从SNE到t-SNE再到LargeVis

这里写图片描述

代码见下面例一

TSNE的参数

函数参数表:

parameters描述
n_components嵌入空间的维度
perpexity混乱度,表示t-SNE优化过程中考虑邻近点的多少,默认为30,建议取值在5到50之间
early_exaggeration表示嵌入空间簇间距的大小,默认为12,该值越大,可视化后的簇间距越大
learning_rate学习率,表示梯度下降的快慢,默认为200,建议取值在10到1000之间
n_iter迭代次数,默认为1000,自定义设置时应保证大于250
min_grad_norm如果梯度小于该值,则停止优化。默认为1e-7
metric表示向量间距离度量的方式,默认是欧氏距离。如果是precomputed,则输入X是计算好的距离矩阵。也可以是自定义的距离度量函数。
init初始化,默认为random。取值为random为随机初始化,取值为pca为利用PCA进行初始化(常用),取值为numpy数组时必须shape=(n_samples, n_components)
verbose是否打印优化信息,取值0或1,默认为0=>不打印信息。打印的信息为:近邻点数量、耗时、 σ σ 、KL散度、误差等
random_state随机数种子,整数或RandomState对象
method两种优化方法:barnets_hutexact。第一种耗时O(NlogN),第二种耗时O(N^2)但是误差小,同时第二种方法不能用于百万级样本
angle当method=barnets_hut时,该参数有用,用于均衡效率与误差,默认值为0.5,该值越大,效率越高&误差越大,否则反之。当该值在0.2-0.8之间时,无变化。

返回对象的属性表:

Atrtributes描述
embedding_嵌入后的向量
kl_divergence_KL散度
n_iter_迭代的轮数

t-distributed Stochastic Neighbor Embedding(t-SNE)

t-SNE可降样本点间的相似度关系转化为概率:在原空间(高维空间)中转化为基于高斯分布的概率;在嵌入空间(二维空间)中转化为基于t分布的概率。这使得t-SNE不仅可以关注局部(SNE只关注相邻点之间的相似度映射而忽略了全局之间的相似度映射,使得可视化后的边界不明显),还关注全局,使可视化效果更好(簇内不会过于集中,簇间边界明显)。

目标函数:原空间与嵌入空间样本分布之间的KL散度。
优化算法:梯度下降。
注意问题:KL散度作目标函数是非凸的,故可能需要多次初始化以防止陷入局部次优解。

t-SNE的缺点:

  • 计算量大,耗时间是PCA的百倍,内存占用大。
  • 专用于可视化,即嵌入空间只能是2维或3维。
  • 需要尝试不同的初始化点,以防止局部次优解的影响。

t-SNE的优化

在优化t-SNE方面,有很多技巧。下面5个参数会影响t-SNE的可视化效果:

  • perplexity 混乱度。混乱度越高,t-SNE将考虑越多的邻近点,更关注全局。因此,对于大数据应该使用较高混乱度,较高混乱度也可以帮助t-SNE拜托噪声的影响。相对而言,该参数对可视化效果影响不大。
  • early exaggeration factor 该值表示你期望的簇间距大小,如果太大的话(大于实际簇的间距),将导致目标函数无法收敛。相对而言,该参数对可视化效果影响较小,默认就行。
  • learning rate 学习率。关键参数,根据具体问题调节。
  • maximum number of iterations 迭代次数。迭代次数不能太低,建议1000以上。
  • angle (not used in exact method) 角度。相对而言,该参数对效果影响不大。

PS:一个形象展示t-SNE优化技巧的网站How to Use t-SNE Effectively.

代码

例一

import numpy as np
import matplotlib.pyplot as plt
from sklearn import manifold, datasets

digits = datasets.load_digits(n_class=6)
X, y = digits.data, digits.target
n_samples, n_features = X.shape

'''显示原始数据'''
n = 20  # 每行20个数字,每列20个数字
img = np.zeros((10 * n, 10 * n))
for i in range(n):
    ix = 10 * i + 1
    for j in range(n):
        iy = 10 * j + 1
        img[ix:ix + 8, iy:iy + 8] = X[i * n + j].reshape((8, 8))
plt.figure(figsize=(8, 8))
plt.imshow(img, cmap=plt.cm.binary)
plt.xticks([])
plt.yticks([])
plt.show()

数字

'''t-SNE'''
tsne = manifold.TSNE(n_components=2, init='pca', random_state=501)
X_tsne = tsne.fit_transform(X)

print("Org data dimension is {}. 
      Embedded data dimension is {}".format(X.shape[-1], X_tsne.shape[-1]))

'''嵌入空间可视化'''
x_min, x_max = X_tsne.min(0), X_tsne.max(0)
X_norm = (X_tsne - x_min) / (x_max - x_min)  # 归一化
plt.figure(figsize=(8, 8))
for i in range(X_norm.shape[0]):
    plt.text(X_norm[i, 0], X_norm[i, 1], str(y[i]), color=plt.cm.Set1(y[i]), 
             fontdict={'weight': 'bold', 'size': 9})
plt.xticks([])
plt.yticks([])
plt.show()

可视化结果

### 数据降维方法 MDS、PCA 和 t-SNE 的原理与应用 #### 多维尺度分析 (MDS) 多维尺度分析是一种用于探索数据集中样本之间距离关系的技术。该方法旨在找到一个低维空间,在此空间中,各点之间的欧几里得距离尽可能接近原始高维空间的距离[^2]。 通过最小化应力函数(Stress Function),即实际配对距离和理想配对距离间的差异平方误差总和来优化配置。这有助于保持原数据结构特性的同时减少维度数量。因此,当关注的是维持样本间相对位置而非具体数值意义时,可以选择这种方法进行降维处理并辅助后续数据分析工作。 #### 主成分分析 (PCA) 主成分分析是线性代数领域内的一种统计过程,它能够识别出具有最大方差方向上的正交基向量作为新坐标系下的轴,并以此为基础转换原有变量体系成为一组不相关的综合指标——主成分得分;这些主成分保留了尽可能多的信息量而使整体变异程度达到最大化[^1]。 在实践中,通常会选取前几个最重要的主成分代替全部特征参与建模预测等活动当中去,从而简化模型复杂度提高运算效率同时也便于人们理解解释所得结论背后所蕴含的实际物理含义或业务逻辑关联性等问题所在之处。 ```python from sklearn.decomposition import PCA import numpy as np # 创建随机数据集 data = np.random.rand(100, 5) pca = PCA(n_components=2) reduced_data_pca = pca.fit_transform(data) print(reduced_data_pca.shape) # 输出形状应为 (100, 2),表示已降至二维 ``` #### t分布随机邻域嵌入 (t-SNE) t-SNE 是一种概率模型驱动型非线性的降维工具,特别适用于将高维数据映射至两维或三维空间以便直观展示簇状模式及其内部细微差别。不同于其他传统技术侧重全局几何属性保护,本算法更加注重局部相似性表达,即使牺牲了一定程度的整体拓扑一致性也在所不惜[^3]。 由于计算过程中涉及到所有样本点相互作用的概率密度估计环节,故而在面对大规模数据集时可能会遇到性能瓶颈现象。不过借助先期采用诸如 PCA 预处理手段可有效缓解这一难题的发生几率,进而保障最终呈现出来的图形质量不受影响。 ```python from sklearn.manifold import TSNE import matplotlib.pyplot as plt tsne = TSNE(n_components=2, perplexity=30.0, n_iter=1000) result_tsne = tsne.fit_transform(data) plt.scatter(result_tsne[:, 0], result_tsne[:, 1]) plt.show() ```
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值