使用最小二乘法求解任意“Y”的矩阵乘法“AB=Y”中的“A”“B”

Solve `A` `B` in matrix multiplication `AB=Y` for arbitrary `Y` using least square

如果这是某个主题的重复,我很抱歉。我知道有很多分解来分解矩阵(如 LUSVD),但现在我有一个任意的 非方矩阵,我想将它分解为给定形状的两个矩阵。如果不存在精确解,我想找到一个最小二乘法。如果存在不止一种解决方案,任何一种都可以。

我使用的是这样的迭代方法:

A = np.random.rand(...)
B = np.random.rand(...)
for i in range(999):
    A = np.linalg.lstsq(B.T, Y.T, None)[0].T
    B = np.linalg.lstsq(A, Y, None)[0]

这很简单,但我发现它收敛sublinearly(实际上是对数),这很慢。我也发现它有时(或经常?)"bounces" 回到非常高的 L2 损失。我想知道对此是否有改进或简单地解决 AB=Y 应该以完全不同的方式完成?

非常感谢!

您可以使用 SVD 执行此操作。参见,例如 the wiki article 例如,假设您有一个 mxn 矩阵 Y 并且想要找到因式分解

Y = A*B where A is mx1 and B is nx1 

所以

A*B 

与 Y 尽可能接近(通过 Frobenius 范数测量)。

解法是取Y的SVD:

Y = U*S*V'

然后拿

A = s*U1 (the first column of A, scaled by the first singular value)
B = V1' (the first column of V)

如果您希望 A 为 mx2,B 为 2xn,则取前两列(对于 A,第一列按第一个奇异值缩放,第二列按第二个奇异值缩放),依此类推。