1

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

另一种选择可能是使用某种形式的优化来找到 L,但这并不简单,因为我已经尝试了 SciPy 的几种优化方法,在 frobenius 范数下具有差异 M - LT * L,到目前为止我还没有没有成功。

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

4

1 回答 1

3

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

如果矩阵是半正定矩阵,您可以使用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. 是不可能的。

矛盾的是,我们知道这个矩阵不可​​能有你要求的分解。

于 2017-09-07T18:14:59.403 回答