在Python中计算低秩近似

2024-09-25 08:33:46 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

编辑:我忘了补充一点,通过使用scikit的非负矩阵分解类,我可以部分地通过传递L和L.T作为优化的候选矩阵来实现这一点。但是,我的矩阵M不是非负的,所以这个方法对我不适用。在


Tags: 方法编辑范数矩阵scipyscikit形式svd
1条回答
网友
1楼 · 发布于 2024-09-25 08:33:46

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

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

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


例如,如果不存在解决方案,则以下矩阵没有解决方案:

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

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

^{pr2}$

因此,以下必须是正确的:

  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 == 0和{}。如果这是真的,那么(a+d) == 0就等于4。不可能的。在

如果(a+d) == 0,则为4。是不可能的。在

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

相关问题 更多 >