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

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

编辑:我忘了通过使用scikit的非负矩阵分解类来添加,我能够通过传递L和L.T作为优化的候选矩阵来部分实现这一点。但是,我的矩阵M不是非负的,因此该方法对我不起作用。

最佳答案

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

如果矩阵是正半定的,则可以使用Cholesky Factorization
 使用枢轴来保持稳定性。

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



一个示例可能不存在解决方案的示例,以下矩阵没有解决方案:

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


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

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


因此,以下条件必须为真:


a*a + b*c == 0
d*d + b*c == 0
c * (a+d) == 0
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.是不可能的。

矛盾的是,我们知道您无法使用该矩阵进行分解。

10-07 20:23