【问题标题】:Multipy matrix by its transpose in constant memory将矩阵乘以其在常量内存中的转置
【发布时间】:2014-12-16 06:53:15
【问题描述】:

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

X.dot(X.T)

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

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

我碰巧与 Numpy 合作过,但实际上任何对算法的描述都会很棒。

【问题讨论】:

  • 如果X = np.memmap(..)会发生什么?
  • 您是否尝试过使用稀疏矩阵? docs.scipy.org/doc/scipy/reference/sparse.html
  • cmets M is manageable, but N is very largeNxN) will fit into memory, but ... X will not 似乎没有意义
  • 没错,我的意思是(MxM),这是正确的。编辑了问题。至于稀疏矩阵,这实际上是我现在正在使用的,但它不允许足够大的 Ns。我会研究内存映射!
  • @pdowling 你需要的内存大小至少是X 的两倍,而不是Y = np.empty_like(X); np.dot(X, X.T, out=Y)

标签: python algorithm numpy scipy linear-algebra


【解决方案1】:

可以使用矩阵积的定义:

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

【讨论】:

  • 啊,有道理,非常感谢。我有点期待它会有更多的技巧!
猜你喜欢
  • 1970-01-01
  • 2017-05-30
  • 2021-10-15
  • 1970-01-01
  • 2018-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-24
相关资源
最近更新 更多