t-SNE#

class sklearn.manifold.TSNE(n_components=2, *, perplexity=30.0, early_exaggeration=12.0, learning_rate='auto', max_iter=None, n_iter_without_progress=300, min_grad_norm=1e-07, metric='euclidean', metric_params=None, init='pca', verbose=0, random_state=None, method='barnes_hut', angle=0.5, n_jobs=None, n_iter='deprecated')[source]#

t-分布随机邻域嵌入。

t-SNE [1] 是一种用于可视化高维数据的工具。它将数据点之间的相似性转换为联合概率,并尝试最小化低维嵌入的联合概率与高维数据的 Kullback-Leibler 散度。t-SNE 的成本函数是非凸的,也就是说,不同的初始化可能会得到不同的结果。

如果特征数量非常多,强烈建议使用另一种降维方法(例如,对于密集数据使用 PCA,对于稀疏数据使用 TruncatedSVD)将维度减少到合理数量(例如 50)。这将抑制一些噪声并加快样本之间成对距离的计算。更多技巧请参见 Laurens van der Maaten 的常见问题解答 [2]。

用户指南 中了解更多信息。

参数:
n_componentsint,默认为 2

嵌入空间的维度。

perplexityfloat,默认为 30.0

困惑度与其他流形学习算法中使用的最近邻数量相关。更大的数据集通常需要更大的困惑度。考虑选择 5 到 50 之间的值。不同的值可能会导致显著不同的结果。困惑度必须小于样本数量。

early_exaggerationfloat,默认为 12.0

控制原始空间中的自然聚类在嵌入空间中的紧密程度以及它们之间的空间大小。对于较大的值,嵌入空间中自然聚类之间的空间将更大。同样,此参数的选择并不十分关键。如果成本函数在初始优化过程中增加,则早期夸大因子或学习率可能过高。

learning_ratefloat 或 “auto”,默认为 “auto”

t-SNE 的学习率通常在 [10.0, 1000.0] 范围内。如果学习率过高,数据可能看起来像一个“球”,任何点与其最近邻的距离大致相等。如果学习率过低,大多数点可能看起来压缩在一个密集的云中,只有少数异常值。如果成本函数陷入局部最小值,增加学习率可能会有所帮助。请注意,许多其他 t-SNE 实现(bhtsne、FIt-SNE、openTSNE 等)使用的学习率定义是我们学习率的 4 倍。因此,我们的 learning_rate=200 相当于这些其他实现中的 learning_rate=800。“auto” 选项将学习率设置为 max(N / early_exaggeration / 4, 50),其中 N 是样本大小,遵循 [4] 和 [5]。

1.2 版本中的更改:默认值更改为 "auto"

max_iterint,默认为 1000

优化的最大迭代次数。应至少为 250。

1.5 版本中的更改:参数名称从 n_iter 更改为 max_iter

n_iter_without_progressint,默认为 300

在放弃优化之前,没有进展的最大迭代次数,在使用早期夸大因子的 250 次初始迭代后使用。请注意,进度仅每 50 次迭代检查一次,因此此值将四舍五入到下一个 50 的倍数。

0.17 版本中添加:参数 n_iter_without_progress 用于控制停止条件。

min_grad_normfloat,默认为 1e-7

如果梯度范数低于此阈值,则优化将停止。

metricstr 或 callable,默认为 'euclidean'

计算特征数组中实例之间距离时使用的度量。如果 metric 是字符串,它必须是 scipy.spatial.distance.pdist 允许的选项之一(用于其 metric 参数),或者是在 pairwise.PAIRWISE_DISTANCE_FUNCTIONS 中列出的度量。如果 metric 是“precomputed”,则假设 X 是距离矩阵。或者,如果 metric 是可调用函数,则将其调用到每个实例对(行)上,并记录结果值。可调用函数应将 X 中的两个数组作为输入,并返回一个值,表示它们之间的距离。默认为“euclidean”,解释为平方欧几里得距离。

metric_paramsdict,默认为 None

度量函数的其他关键字参数。

1.1 版本中添加。

init{"random", "pca"} 或形状为 (n_samples, n_components) 的 ndarray,默认为 "pca"

嵌入的初始化。PCA 初始化不能与预计算距离一起使用,通常比随机初始化更全局稳定。

1.2 版本中的更改:默认值更改为 "pca"

verboseint,默认为 0

详细程度。

random_stateint、RandomState 实例或 None,默认为 None

确定随机数生成器。传递一个整数以便在多次函数调用中获得可重复的结果。请注意,不同的初始化可能会导致代价函数的不同局部最小值。参见 词汇表

method{‘barnes_hut’, ‘exact’}, default=’barnes_hut’

默认情况下,梯度计算算法使用 Barnes-Hut 近似算法,运行时间为 O(NlogN)。method=’exact’ 将使用较慢但精确的算法,运行时间为 O(N^2)。当最近邻误差需要小于 3% 时,应使用精确算法。但是,精确方法无法扩展到数百万个样本。

版本 0.17 中新增: 通过 Barnes-Hut 进行近似优化 method

anglefloat, default=0.5

仅在 method=’barnes_hut’ 时使用。这是 Barnes-Hut t-SNE 算法中速度和精度之间的权衡。“angle”是从一个点测量的远节点的角大小(在 [3] 中称为 theta)。如果此大小低于“angle”,则将其用作其中包含的所有点的汇总节点。此方法对 0.2 - 0.8 范围内的参数变化不太敏感。角度小于 0.2 会迅速增加计算时间,角度大于 0.8 会迅速增加误差。

n_jobsint, default=None

用于邻居搜索的并行作业数。当 metric="precomputed" 或 (metric="euclidean"method="exact") 时,此参数无效。None 表示 1,除非在 joblib.parallel_backend 上下文中。-1 表示使用所有处理器。有关更多详细信息,请参见 词汇表

版本 0.22 中新增。

n_iterint

优化的最大迭代次数。应至少为 250。

自版本 1.5 起已弃用: n_iter 在版本 1.5 中已弃用,将在 1.7 中移除。请改用 max_iter

属性:
embedding_array-like of shape (n_samples, n_components)

存储嵌入向量。

kl_divergence_float

优化后的 Kullback-Leibler 散度。

n_features_in_int

拟合 过程中看到的特征数量。

版本 0.24 中新增。

feature_names_in_ndarray of shape (n_features_in_,)

拟合 过程中看到的特征名称。仅当 X 的特征名称均为字符串时才定义。

版本 1.0 中新增。

learning_rate_float

有效的学习率。

版本 1.2 中新增。

n_iter_int

运行的迭代次数。

另请参见

sklearn.decomposition.PCA

一种线性降维方法的主成分分析。

sklearn.decomposition.KernelPCA

使用核和 PCA 的非线性降维。

MDS

使用多维缩放的流形学习。

Isomap

基于等距映射的流形学习。

LocallyLinearEmbedding

使用局部线性嵌入的流形学习。

SpectralEmbedding

用于非线性降维的谱嵌入。

备注

有关将 TSNEKNeighborsTransformer 结合使用的示例,请参见 TSNE 中的近似最近邻

参考文献

[1] van der Maaten, L.J.P.; Hinton, G.E. 使用 t-SNE 可视化高维数据

Journal of Machine Learning Research 9:2579-2605, 2008。

[2] van der Maaten, L.J.P. t 分布随机邻域嵌入

https://lvdmaaten.github.io/tsne/

[3] L.J.P. van der Maaten. 使用基于树的算法加速 t-SNE。

Journal of Machine Learning Research 15(Oct):3221-3245, 2014. https://lvdmaaten.github.io/publications/papers/JMLR_2014.pdf

[4] Belkina, A. C., Ciccolella, C. O., Anno, R., Halpert, R., Spidlen, J.,

& Snyder-Cappione, J. E. (2019). 用于 t 分布随机邻域嵌入的自动优化参数改善了大型数据集的可视化和分析。Nature Communications, 10(1), 1-12。

[5] Kobak, D., & Berens, P. (2019). 使用 t-SNE 进行单细胞的艺术

转录组学。Nature Communications, 10(1), 1-14。

示例

>>> import numpy as np
>>> from sklearn.manifold import TSNE
>>> X = np.array([[0, 0, 0], [0, 1, 1], [1, 0, 1], [1, 1, 1]])
>>> X_embedded = TSNE(n_components=2, learning_rate='auto',
...                   init='random', perplexity=3).fit_transform(X)
>>> X_embedded.shape
(4, 2)
fit(X, y=None)[source]#

将 X 拟合到嵌入空间中。

参数:
X{array-like, sparse matrix} of shape (n_samples, n_features) or (n_samples, n_samples)

如果度量为“precomputed”,则 X 必须是方距离矩阵。否则,它包含每行一个样本。如果方法为“exact”,则 X 可以是类型为“csr”、“csc”或“coo”的稀疏矩阵。如果方法为“barnes_hut”并且度量为“precomputed”,则 X 可以是预计算的稀疏图。

yNone

忽略。

返回:
selfobject

拟合的估计器。

fit_transform(X, y=None)[source]#

将X拟合到嵌入空间并返回转换后的输出。

参数:
X{array-like, sparse matrix} of shape (n_samples, n_features) or (n_samples, n_samples)

如果度量为“precomputed”,则 X 必须是方距离矩阵。否则,它包含每行一个样本。如果方法为“exact”,则 X 可以是类型为“csr”、“csc”或“coo”的稀疏矩阵。如果方法为“barnes_hut”并且度量为“precomputed”,则 X 可以是预计算的稀疏图。

yNone

忽略。

返回:
X_newndarray of shape (n_samples, n_components)

训练数据在低维空间中的嵌入。

get_feature_names_out(input_features=None)[source]#

获取转换后的特征名称。

输出的特征名称将以小写的类名作为前缀。例如,如果转换器输出3个特征,则输出的特征名称为:["class_name0", "class_name1", "class_name2"]

参数:
input_featuresarray-like of str or None, default=None

仅用于使用在fit中看到的名称验证特征名称。

返回:
feature_names_outndarray of str objects

转换后的特征名称。

get_metadata_routing()[source]#

获取此对象的元数据路由。

请查看用户指南了解路由机制的工作原理。

返回:
routingMetadataRequest

一个MetadataRequest 封装路由信息。

get_params(deep=True)[source]#

获取此估计器的参数。

参数:
deepbool, default=True

如果为True,则将返回此估计器和包含的作为估计器的子对象的参数。

返回:
paramsdict

参数名称映射到它们的值。

set_output(*, transform=None)[source]#

设置输出容器。

查看介绍 set_output API了解如何使用 API 的示例。

参数:
transform{“default”, “pandas”, “polars”}, default=None

配置transformfit_transform的输出。

  • "default": 转换器的默认输出格式

  • "pandas": DataFrame 输出

  • "polars": Polars 输出

  • None: 转换配置保持不变

Added in version 1.4: "polars" 选项已添加。

返回:
selfestimator instance

估计器实例。

set_params(**params)[source]#

设置此估计器的参数。

此方法适用于简单的估计器以及嵌套对象(例如Pipeline)。后者具有<component>__<parameter>形式的参数,因此可以更新嵌套对象的每个组件。

参数:
**paramsdict

估计器参数。

返回:
selfestimator instance

估计器实例。