tSNE降维

2024-06-30 05:40:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两套数据训练和测试。这两个数据集分别有30213和30235个项目,每个项目有66个维度。在

我正在尝试应用scikit learn的t-SNE将维数降到2。由于数据集很大,如果我试图一次性处理整个数据,我会遇到内存错误,我会尝试将它们分成块,然后一次转换一个块,如下所示:

tsne = manifold.TSNE(n_components=2, perplexity=30, init='pca', random_state=0)

X_tsne_train = np.array( [ [ 0.0 for j in range( 2 ) ] for i in range( X_train.shape[0] ) ] )

X_tsne_test = np.array( [ [ 0.0 for j in range( 2 ) ] for i in range( X_test.shape[0] ) ] )

d = ( ( X_train, X_tsne_train ), ( X_test, X_tsne_test ) )

chunk = 5000

for Z in d:

        x, x_tsne = Z[0], Z[1]
        pstart, pend = 0, 0
        while pend < x.shape[0]:
                if pend + chunk < x.shape[0]:
                        pend = pstart + chunk
                else:
                        pend = x.shape[0]
                print 'pstart = ', pstart, 'pend = ', pend
                x_part = x[pstart:pend]
                x_tsne[pstart:pend] += tsne.fit_transform(x_part)
                pstart = pend

在没有运行相同的内存项的情况下,运行不同的内存项的输出。这可能是由于拟合和转换操作同时发生在每个数据块上。但是如果我试图用tsne.fit(X_train)来拟合列车数据,我得到MemoryError。如何正确地将列车和测试集中的所有数据项的维数降到2,而块之间没有任何不一致?在


Tags: 数据项目内存intestfornprange
1条回答
网友
1楼 · 发布于 2024-06-30 05:40:41

我不完全确定您所说的“具有相同数据项的不同输出”是什么意思,但这里有一些可能对您有所帮助的注释。在

首先,t-SNE并不像PCA或其他方法那样是一种“降维”技术。没有办法采取一个固定的,学习的t-SNE模型,并将其应用于新的数据。(请注意,该类没有transform()方法,只有fit()和{})因此,您将无法使用“train”和“test”集。在

第二,每次调用fit_transform()时,都会得到一个完全不同的模型。因此,你缩小的维度的含义在不同的区块之间并不一致。每个区块都有自己的低维空间。模型每次都是不同的,因此数据不会被投影到相同的空间中。在

第三,你不包括你把“训练”和“测试”分开的代码。可能是,当您小心地设置t-SNE的随机种子时,您没有设置列车/测试分区的随机种子,从而导致不同的数据划分,从而在后续运行中产生不同的结果。在

最后,如果您想使用t-SNE来可视化数据,您可以考虑遵循文档页面上的建议,并应用PCA将输入的维数从66降到15。这将大大减少t-SNE的内存占用。在

TSNE in SKLearn Docs

相关问题 更多 >