将矩阵乘以常数存储器中的转置

时间:2014-10-21 06:17:30

标签: python algorithm numpy scipy linear-algebra

我有一个MxN矩阵 X ,其中M是可管理的,但N非常大。矩阵是维基百科的术语 - 文档语料库格式,为您提供一些背景信息。我需要计算:

X.dot(X.T)

我知道结果(维度MxM)将适合内存,但矩阵X不会。

如何最好地计算产品,迭代X批次列?我将语料库保存为文件,并且我能够逐个迭代每个文档(即X列)。有没有办法迭代地构建X * X.T?

我碰巧和Numpy一起工作,但实际上算法的任何描述都会很棒。

1 个答案:

答案 0 :(得分:2)

您可以使用矩阵产品的定义:

Y = np.zeros((M, M), dtype=float)
for j in xrange(N):
    Y += X[:,np.newaxis,j] * X.T[j,np.newaxis,:]

使用更大的块可以提高性能:

block_size = 256
Y = np.zeros((M, M), dtype=float)
for j in xrange(0, N, block_size):
    Xb = X[:,j:(j+block_size)]
    Y += Xb.dot(Xb.T)

编辑:忘记了第一个例子中的np.newaxis