给定尺寸为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 == 0
和d == 0
。如果是这样,则(a+d) == 0
使得4.不可能。如果
(a+d) == 0
,则4.是不可能的。矛盾的是,我们知道您无法使用该矩阵进行分解。