使用t-SNE降低维数

时间:2015-08-19 20:42:38

标签: python scikit-learn

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

我正在尝试应用scikit的t-SNE学习将维度减少到2.由于数据集很大,如果我尝试一次处理整个数据,我会得到MemoryError,我尝试将它们分成块并像这样一次转换一个块:

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,而不会在块之间产生任何不一致?

1 个答案:

答案 0 :(得分:2)

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

首先,t-SNE实际上并不是PCA或其他方法所具有的“降维”技术。没有办法采用固定的,学习过的t-SNE模型并将其应用于新数据。 (请注意,该类没有transform()方法,只有fit()fit_transform()。)因此,您将无法使用“train”和“test”集。

其次,每次拨打fit_transform()时,您都会得到一个完全不同的模型。因此,缩小尺寸的含义从块到块不一致。每个块都有自己的低维空间。模型每次都不同,因此数据不会投射到同一空间。

第三,您不包括将“train”与“test”分开的代码。可能是因为,当您小心设置t-SNE的随机种子时,您没有设置列车/测试分区的随机种子,导致不同的数据划分,因此在后续运行中会产生不同的结果。

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

TSNE in SKLearn Docs