使用最小二乘法求解任意“Y”的矩阵乘法“AB=Y”中的“A”“B”
Solve `A` `B` in matrix multiplication `AB=Y` for arbitrary `Y` using least square
如果这是某个主题的重复,我很抱歉。我知道有很多分解来分解矩阵(如 LU
或 SVD
),但现在我有一个任意的 非方矩阵,我想将它分解为给定形状的两个矩阵。如果不存在精确解,我想找到一个最小二乘法。如果存在不止一种解决方案,任何一种都可以。
我使用的是这样的迭代方法:
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,第一列按第一个奇异值缩放,第二列按第二个奇异值缩放),依此类推。
如果这是某个主题的重复,我很抱歉。我知道有很多分解来分解矩阵(如 LU
或 SVD
),但现在我有一个任意的 非方矩阵,我想将它分解为给定形状的两个矩阵。如果不存在精确解,我想找到一个最小二乘法。如果存在不止一种解决方案,任何一种都可以。
我使用的是这样的迭代方法:
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,第一列按第一个奇异值缩放,第二列按第二个奇异值缩放),依此类推。