numpy:计算大矩阵的xT*x

NPE*_*NPE 6 python transpose numpy scipy matrix-multiplication

numpy,什么是最有效的计算方法x.T * x,哪里x是一个大的(200,000 x 1000)密集float32矩阵,并且.T是转置运算符?

为避免疑义,结果为1000 x 1000.

编辑:在我原来的问题中,我说这np.dot(x.T, x)需要几个小时.事实证明,我有一些NaNs潜入矩阵,并且由于某种原因完全扼杀了np.dot(任何见解为什么?)现在已经解决了,但最初的问题仍然存在.

Jos*_*der 10

这可能不是你正在寻找的答案,但加速它的一种方法是使用gpu而不是你的cpu.如果你有一个相当强大的显卡,它会在任何一天都超过你的CPU,即使你的系统调整得很好.

为了与numpy很好地集成,你可以使用theano(如果你的显卡是由nvidia制作的).以下代码中的计算在几秒钟内为我运行(尽管我有一个非常强大的图形卡):

$ THEANO_FLAGS=device=gpu0 python
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import theano
Using gpu device 0: GeForce GTX 480
>>> from theano import tensor as T
>>> import numpy
>>> x = numpy.ones((200000, 1000), dtype=numpy.float32)
>>> m = T.matrix() 
>>> mTm = T.dot(m.T, m)
>>> f = theano.function([m], mTm)
>>> f(x)
array([[ 200000.,  200000.,  200000., ...,  200000.,  200000.,  200000.],
       [ 200000.,  200000.,  200000., ...,  200000.,  200000.,  200000.],
       [ 200000.,  200000.,  200000., ...,  200000.,  200000.,  200000.],
       ..., 
       [ 200000.,  200000.,  200000., ...,  200000.,  200000.,  200000.],
       [ 200000.,  200000.,  200000., ...,  200000.,  200000.,  200000.],
       [ 200000.,  200000.,  200000., ...,  200000.,  200000.,  200000.]], dtype=float32)
>>> r = f(x)
>>> r.shape
(1000, 1000)
Run Code Online (Sandbox Code Playgroud)

我打算等待>>> numpy.dot(x.T, x)通过比较找出多长时间,但我感到无聊......

你也可以尝试PyCuda或PyOpenCL(如果你没有nvidia显卡),虽然我不知道他们的numpy支持是否如此简单.

  • 虽然这确实是一个不错的选择,但他的cpu乘法花费这么多时间肯定不正常 (2认同)

Dav*_*eau 5

首先,确保使用优化的blas/lapack,这可以产生巨大的差异(最多一个数量级).例如,如果您使用线程ATLAS,它将相对有效地使用您的所有内核(您需要使用最近的ATLAS,并且编译ATLAS是PITA).

至于为什么Nan减慢所做的一切:这几乎是不可避免的,NaN处理比CPU级别的"正常"浮动慢得多:http://www.cygnus-software.com/papers/x86andinfinity.html.这取决于CPU模型,您使用的是哪种指令集,当然还有您正在使用的算法/实现.