【问题标题】:sparse matrix multiplication involving inverted matrix涉及逆矩阵的稀疏矩阵乘法
【发布时间】:2012-08-02 03:49:21
【问题描述】:

我有两个大的稀疏平方矩阵 A 和 B,需要以最有效的方式计算以下内容:A * B^-1。我有一种感觉,答案涉及使用scipy.sparse,但我一生都无法弄清楚。

经过大量搜索,我遇到了以下线程:Efficient numpy / lapack routine for product of inverse and sparse matrix?,但不知道最有效的方法是什么。

有人建议使用 scipy 的稀疏模块中内置的 LU 分解,但是当我尝试在样本矩阵上执行 LU 时说结果是奇异的(尽管当我只执行 * B^-1 时我得到了答案)。我也听说有人建议使用linalg.spsolve(),但我不知道如何实现它,因为它需要一个向量作为第二个参数。

如果它有帮助,一旦我有解决方案 s.t. A * B^-1 = C,我只需要知道矩阵 C 的一行的值。矩阵大约是 1000x1000 到 1500x1500。

【问题讨论】:

  • 这些矩阵有多大?

标签: numpy sparse-matrix matrix-multiplication


【解决方案1】:

实际上 1000x1000 的矩阵并没有那么大。您可以在现代台式计算机上使用 numpy.linalg.inv(B) 在不到 1 秒的时间内计算出此类矩阵的逆矩阵。

但是,如果考虑到您只需要一行 C 的事实(实际上经常出现这种情况),重写您的问题会更有效率。

让我们写 d_i = [0 0 0 ... 0 1 0 ... 0 ],一个在第 i 个元素上只有一个 1 的向量。 你可以写,如果 ^t 表示转置:

AB^-1 = C <=> A = CB <=> A^t = B^t C^t

对于第 i 行:

A^t d_i = B^t C^t d_i <=> a_i = B^t c_i

所以你有一个线性逆问题,可以使用 numpy.linalg.solve 解决

ci = np.linalg.solve(B.T, a[i])

【讨论】:

  • 谢谢!我会试试这个,让你知道它是怎么回事。另外,我知道进行反转不会花费很长时间,但是我将不得不做这个过程数万次,所以我想尽可能地对其进行微调:)
  • 我试了一下,经过一番摸索后,我让它工作了。您的解决方案在使用numpy.linalg.solve() 时有效,但在使用sparse.linalg.spsolve 时我得到的答案不正确。我的数组包含以下内容:B.T = [[0.802, -0.396, 0.], [-0.594, 0.604, 0.], [-0.198, -0.198, 0.01]]A.T: [[.25,.5,0.],[.75,.5,0.],[.0,.0,1.]];第二行的正确答案是[2.00654938, 2.80114293, 95.19230769],但spsolve吐出[.5, .5, .0]
  • 好的。我认为 spsolve 与solve 的工作方式相同,但显然并非如此。但实际上我不太确定从你现在的位置来看,使用稀疏矩阵是否会为你带来任何加速。主要优势是内存消耗,但您可能不受此限制,对吧?
  • 我将不得不等到实施的稍后阶段才能确定是否有加速(以及是否受内存限制)。我终于遇到了一个有类似问题的人。看起来 spsolve 在 64 位 Windows 环境中存在问题(使用 EPD+MKL 时),并且只返回传递给它的第二个参数。但我在 Ubuntu 版本的 EPD 上对其进行了测试,效果很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
  • 2017-07-20
  • 2017-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多