很抱歉,如果这与某个线程重复。我知道要分解矩阵(例如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(实际上是对数的),这很慢。我还发现有时(或经常?)“反弹”回到非常高的L2损失。我想知道是否对此有所改进,还是简单地解决AB=Y
应该以完全不同的方式完成?
非常感谢!
答案 0 :(得分:2)
您可以使用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,那么tou会采用前两个列(对于A,第一列按第一个奇异值缩放,第二列按第二个奇异值缩放),依此类推。