在 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]]
因此以下必须为真:
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.是不可能的。
根据矛盾我们知道你要求这个矩阵不能分解。
给定一个维度为 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]]
因此以下必须为真:
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.是不可能的。
根据矛盾我们知道你要求这个矩阵不能分解。