在 Python 中计算低秩近似

Computing Low-Rank approximation in Python

给定一个维度为 nxn 的矩阵 M,我如何计算一个低秩分解使得 M = L.T * L,其中 L 的维度为 kxn。到目前为止,我只看到这是使用 SVD 完成的,这并不是我想要的,因为该方法给了我 M = USV,和 U.T != S *V,相对于 (L.T).T == L.

另一种替代方法是使用某种形式的优化来找到 L,但这并不简单,因为我已经尝试了 SciPy 中的几种优化方法,不同之处在于 M - L.T * L在frobenius范数下,到目前为止我还没有成功。

编辑: 我忘了补充一点,通过使用 scikit 的非负矩阵分解 class 我可以通过传递 L 和 [=21 来部分实现这一点=] 作为优化的候选矩阵。但是,我的矩阵 M 不是非负的,因此这种方法对我不起作用。

答案取决于您对矩阵的了解。

如果矩阵是半正定的,你可以使用Cholesky Factorization, 使用旋转来保持稳定性。

在其他假设下,可能不存在解决方案。


一个解可能不存在的例子,下面的矩阵没有解:

[[0, 1],
 [0, 0]] 

证明:假设答案存在。然后解决方案如下所示:

L = [[a, b],
     [c, d]]

因此以下必须为真:

  1. a*a + b*c == 0
  2. d*d + b*c == 0
  3. c * (a+d) == 0
  4. b * (a+d) == 1

根据 3.(c == 0) or ((a+d) == 0)

如果c == 0,则根据1.和2.a == 0d == 0。如果这是真的,那么 (a+d) == 0 这使得 4. 不可能。

如果(a+d) == 0那么4.是不可能的。

根据矛盾我们知道你要求这个矩阵不能分解。