我有一个MxN矩阵 X ,其中M是可管理的,但N非常大。矩阵是维基百科的术语 - 文档语料库格式,为您提供一些背景信息。我需要计算:
X.dot(X.T)
我知道结果(维度MxM)将适合内存,但矩阵X不会。
如何最好地计算产品,迭代X批次列?我将语料库保存为文件,并且我能够逐个迭代每个文档(即X列)。有没有办法迭代地构建X * X.T?
我碰巧和Numpy一起工作,但实际上算法的任何描述都会很棒。
答案 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