我有两套数据训练和测试。这两个数据集分别有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,而块之间没有任何不一致?在
我不完全确定您所说的“具有相同数据项的不同输出”是什么意思,但这里有一些可能对您有所帮助的注释。在
首先,t-SNE并不像PCA或其他方法那样是一种“降维”技术。没有办法采取一个固定的,学习的t-SNE模型,并将其应用于新的数据。(请注意,该类没有})因此,您将无法使用“train”和“test”集。在
transform()
方法,只有fit()
和{第二,每次调用
fit_transform()
时,都会得到一个完全不同的模型。因此,你缩小的维度的含义在不同的区块之间并不一致。每个区块都有自己的低维空间。模型每次都是不同的,因此数据不会被投影到相同的空间中。在第三,你不包括你把“训练”和“测试”分开的代码。可能是,当您小心地设置t-SNE的随机种子时,您没有设置列车/测试分区的随机种子,从而导致不同的数据划分,从而在后续运行中产生不同的结果。在
最后,如果您想使用t-SNE来可视化数据,您可以考虑遵循文档页面上的建议,并应用PCA将输入的维数从66降到15。这将大大减少t-SNE的内存占用。在
TSNE in SKLearn Docs
相关问题 更多 >
编程相关推荐