在numpy中操作巨大的密集矩阵

4
为了训练神经网络,我有一个巨大的212,243×2500的密集矩阵phi,以及向量y(212,243)和w(2500),它们被存储为双精度numpy数组。 我想要计算的是:
w = dot(pinv(phi), y)
# serialize w...
r = dot(w, transpose(phi))
# serialize r...

我的机器在Ubuntu x64上有6GB的RAM和16GB的交换空间。我启动了计算两次,但每次都在工作约一小时后出现系统(而非Python)交换错误。

有没有办法在我的电脑上进行这个计算?它不需要使用Python。


2
你应该检查h5py。这个之前在https://dev59.com/kE7Sa4cB1Zd3GeqP8Pq3#3315055中提到过,它回答了一个类似的问题。 - fgb
1
没问题。在一个不错的系统上只花了几分钟:Python 3.3 64位,numpy-MKL 1.7.1,Core i7,32 GB RAM,Windows 8。 - cgohlke
与fgb所说的类似,您可以尝试使用Pytables。它们都使用相同的底层技术(HDF和numpy iirc)。 - Brad
2个回答

3

如果您只需要计算w,而不需要伪逆用于其他任何目的,请使用以下代码替换该行:

w = np.linalg.lstsq(phi, y)[0]

在我的系统上,它运行速度大约快了2倍,并且使用的中间存储空间减少了一半。


0

我们来看一下:

212,243 row values * 2500 col values * 8 bytes/value = 4,244,860,000 bytes = 4GB

这就是你需要多少内存才能将整个矩阵存储在内存中。

如果这是Java,我建议你提高JVM的最大堆大小。我不知道Python的类比是什么。


但是如果你的2/3 RAM被phi占用了,那么在计算点积时计算伪逆的中间结果应该存储在哪里? - fgb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接