- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有两组数据训练和测试。两个数据集分别有30213条和30235条,每条66维。
我正在尝试应用 scikit learn 的 t-SNE 将维度减少到 2。由于数据集很大,如果我尝试一次性处理整个数据,我会得到 MemoryError,我尝试将它们分成 block 像这样一次转换一个 block :
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 的情况下运行,但我发现脚本的不同运行会为相同的数据项产生不同的输出。这可能是由于对每个数据 block 同时进行了拟合和转换操作。但是,如果我尝试使用 tsne.fit(X_train)
拟合训练数据,我会得到 MemoryError
。如何正确地将训练集和测试集中所有数据项的维度降为 2 且 block 之间没有任何不一致?
最佳答案
我不完全确定“具有相同数据项的不同输出”是什么意思,但这里有一些可能对您有所帮助的评论。
首先,t-SNE 并不是与 PCA 或其他方法相同意义上的“降维”技术。没有办法采用固定的、学习过的 t-SNE 模型并将其应用于新数据。 (请注意,该类没有 transform()
方法,只有 fit()
和 fit_transform()
。)因此,您将无法使用“训练”和“测试”集。
其次,每次调用 fit_transform()
时,您都会得到一个完全不同的模型。因此,缩小维度的含义在 block 与 block 之间并不一致。每个 block 都有自己的小低维空间。模型每次都不同,因此数据不会被投影到同一个空间。
第三,您没有包含将“训练”与“测试”分开的代码。可能是因为当您小心设置 t-SNE 的随机种子时,您没有设置训练/测试部门的随机种子,导致不同的数据部门,从而在后续运行中产生不同的结果。
最后,如果您想使用 t-SNE 可视化您的数据,您可以考虑遵循文档页面上的建议,并应用 PCA 将输入的维数从 66 减少到,比如说,15。这将显着减少 t-SNE 的内存占用。
关于python - 使用 t-SNE 降维,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32105302/
我是一名优秀的程序员,十分优秀!