使用最小二乘法

时间:2019-01-22 09:06:56

标签: python numpy least-squares

很抱歉,如果这与某个线程重复。我知道要分解矩阵(例如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(实际上是对数的),这很慢。我还发现有时(或经常?)“反弹”回到非常高的L2损失。我想知道是否对此有所改进,还是简单地解决AB=Y应该以完全不同的方式完成?

非常感谢!

1 个答案:

答案 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,第一列按第一个奇异值缩放,第二列按第二个奇异值缩放),依此类推。