代码之家  ›  专栏  ›  技术社区  ›  ZisIsNotZis

用最小二乘法求解任意“y”的矩阵乘法“a b=y”中的“a``b`

  •  0
  • ZisIsNotZis  · 技术社区  · 7 年前

    如果这是某条线的复制品,我很抱歉。我知道分解矩阵有很多种方法(比如 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 (实际上是对数),这很慢。我有时(或经常)也会发现它。”反弹“回到非常高的二级损失。我想知道这方面有没有改进,或者简单地解决 AB=Y 应该用完全不同的方式来做吗?

    谢谢!

    1 回复  |  直到 7 年前
        1
  •  2
  •   dmuir    7 年前

    你可以用SVD来做这个。例如,请参见 the wiki article 假设,例如,你有一个MXN矩阵y,想要找到一个因式分解

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

    以便

    A*B 
    

    尽可能接近Y(用弗罗贝尼乌斯标准测量)。

    解决方案是采用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取前两列(对于用第一个奇异值缩放第一列,用第二个奇异值缩放第二列),依此类推。