- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我一直在探索不同的降维算法,特别是 PCA 和 T-SNE。我正在使用 MNIST 数据集的一小部分(大约 780 维)并尝试将原始数据减少到三个维度以可视化为散点图。 T-SNE 可以描述的很详细here .
我使用 PCA 作为 T-SNE 之前的中间降维步骤,正如 T-SNE 的原始创建者在 source code from their website. 上所描述的那样
我发现 T-SNE 需要很长时间才能运行(从 2000 x 25 到 2000 x 3 特征空间需要 10-15 分钟),而 PCA 运行速度相对较快(2000 x 780 => 2000 X 20 几秒钟)。
为什么会这样?我的理论是,在 PCA 实现中(直接来自主要作者的 Python 源代码),他利用 Numpy 点积符号来计算 X
和 X.T
:
def pca(X = Math.array([]), no_dims = 50):
"""Runs PCA on the NxD array X in order to reduce its dimensionality to no_dims dimensions."""
print "Preprocessing the data using PCA..."
(n, d) = X.shape;
X = X - Math.tile(Math.mean(X, 0), (n, 1));
(l, M) = Math.linalg.eig(Math.dot(X.T, X));
Y = Math.dot(X, M[:,0:no_dims]);
return Y;
据我所知,这比标量运算效率高得多,也意味着只有 2N(其中 N
是行数)数据是加载到内存中(需要加载一行X
和一列X.T
)。
不过,我认为这不是根本原因。 T-SNE 当然也包含向量操作,例如,在计算成对距离时 D
:
D = Math.add(Math.add(-2 * Math.dot(X, X.T), sum_X).T, sum_X);
或者,在计算 P(高维)和 Q(低维)时。然而,在 t-SNE 中,您必须创建两个 N X N 矩阵来存储每个数据之间的成对距离,一个用于其原始高维空间表示,另一个用于其降维空间。
在计算梯度时,您还必须创建另一个名为 PQ
的 N X N
矩阵,即 P - Q
。
在我看来,这里的内存复杂度是瓶颈。 T-SNE 需要 3N^2 内存。这不可能适合本地内存,因此该算法会遇到严重的缓存行未命中,需要转到全局内存来检索值。
这是正确的吗?我如何向客户或合理的非技术人员解释为什么 t-SNE 比 PCA 慢?
合著者的Python实现被发现here .
最佳答案
t-SNE 比 PCA 慢的主要原因是没有针对正在优化的标准的解析解。相反,解决方案必须通过梯度下降迭代来近似。
实际上,这意味着很多 for 循环。至少不是第 129 行中的主循环 for 循环,它运行了 max_iter=1000
次。此外,x2p
函数使用 for 循环迭代所有数据点。
引用实现针对可读性而非计算速度进行了优化。作者链接到 optimised Torch implementation同样,这应该可以大大加快计算速度。如果你想留在纯 Python 中,我建议在 Scikit-Learn 中实现,这也应该快得多。
关于python - t-SNE 的计算瓶颈是它的内存复杂度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45824724/
大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 t-SNE(t-Distributed Sto
我有大约 3000 个 100D 数据点,我使用 t-SNE 将它们投影到 2D。每个数据点属于三个类别之一。但是,当我在两台不同的计算机上运行脚本时,我不断得到不一致的结果。当我使用随机种子时,预计
我将数据分开进行训练/测试。当我使用 PCA 时,它很简单。 from sklearn.decomposition import PCA pca = PCA() X_train_pca = pca.f
我一直在探索不同的降维算法,特别是 PCA 和 T-SNE。我正在使用 MNIST 数据集的一小部分(大约 780 维)并尝试将原始数据减少到三个维度以可视化为散点图。 T-SNE 可以描述的很详细h
我有一个 Twitter 语料库,我用它来构建情绪分析应用程序。语料库有 5000 条推文,这些推文被手工标记为 - 负面、中立或正面 为了表示文本 - 我正在使用 gensim word2vec 预
是否有并行版本的 t-SNE 算法的 Python 库?或者多核/并行t-SNE算法是否存在? 我正在尝试使用 t-SNE 减少词汇表中所有 word2vec 的维度 (300d -> 2d)。 问题
我们可以记录库的训练如gensim使用 import logging logger = logging.getLogger() logger.setLevel(logging.INFO) 这在运行 T
我的 T-SNE 散点图打印得很好,但打印出的颜色全部相同并且没有图例。我在这方面遇到了很大的麻烦。对于 SeaBorn 来说,它是“hue”,对于 Matplotlib 来说,它是定义“c”。总而言
我有一个约 20k 词向量列表('tuple_vectors'),没有标签,每个都如下所示 [-2.84658718e+00 -7.74899840e-01 -2.24296474e+00 -8.69
问题是哪个应该先出现:a) 聚类还是 b) 降维算法?换句话说,我可以应用像 t-SNE 这样的伪(因为它不是真的)降维方法,然后使用聚类算法来提取聚类,还是应该在原始高维空间上执行聚类并仅用于给节点
我有两组数据训练和测试。两个数据集分别有30213条和30235条,每条66维。 我正在尝试应用 scikit learn 的 t-SNE 将维度减少到 2。由于数据集很大,如果我尝试一次性处理整个数
我正在尝试使用 Yellowbrick 包中的 t-SNE 来可视化数据。我收到一个错误。 import pandas as pd from yellowbrick.text import TSNEV
我正在尝试对平方距离矩阵运行 tsne 分析。这些是我正在使用的命令。 model = TSNE(n_components = 2,perplexity = 32, verbose = 10,n_it
是什么让 t-sne 受到监督? 维基百科对 t-sne algorithm 进行分类作为一种监督方法。我读到监督方法涉及训练,有输入和期望的结果。 我在想,t-sne 的目标是最小化 Kullbac
目标:我的目标是在 R 中使用 t-SNE(t 分布随机邻域嵌入)对我的训练数据进行降维(具有 N 个观察值和 >K 个变量,其中 K>>N),随后旨在为我的测试数据提供 t-SNE 表示。 示例:假
很简单,如果我在 Python 中对高维数据执行 t-SNE,那么我会得到反射(reflect)每个新点的 2 或 3 个坐标。但是我如何将这些映射到原始 ID? 我能想到的一种方法是,如果索引一直保
我无法在我的 Windows 机器上安装 tsne 包。我按照说明 here为 Python 安装 tsne 包。但是 pip install tsne 或 pip install git+https
我有一个很大的文件(下面是一小部分数据),如下所示,我想画一个 PCA,我可以用 PCA 函数画 PCA 但它看起来有点乱,因为我有 200 列所以我想也许 t-SNE 或 UMAP 效果更好,但我无
这是使用 IRIS 数据的 t-SNE 代码: library(Rtsne) iris_unique <- unique(iris) # Remove duplicates iris_matrix <
我尝试在R中使用T-sne。我想使用 dtw 而不是欧几里德距离。如何更改 R 中的规范? 对精选数据执行算法 library(Rtsne) tsne <- Rtsne(train[,-1], dim
我是一名优秀的程序员,十分优秀!