我有两组数据,分别是训练集和测试集。这两组数据都有30213和30235个项目,并且每个项目有66个维度。
我尝试使用scikit learn的t-SNE算法将维度降至2。由于数据集很大,如果我尝试一次性处理整个数据集,就会出现内存错误。因此,我尝试将它们分成块,并依次转换一个块,如下所示:
我尝试使用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
它运行时不会出现MemoryError,但我发现相同的数据项在脚本的不同运行中产生了不同的输出。这可能是因为每块数据上的拟合和变换操作同时进行。但如果我尝试在训练数据上进行拟合 tsne.fit(X_train)
,我会得到一个MemoryError
。如何正确地将所有训练和测试集中的数据项降到2维而没有任何片段间的不一致性?