【问题标题】:broadcasted lstsq (least squares)广播 lstsq(最小二乘)
【发布时间】:2017-07-20 22:16:57
【问题描述】:

我有一堆 3x2 矩阵,比如说 777 个,以及大小为 3 的许多右侧。对于每个矩阵,我想知道最小二乘解决方案,所以我在做

import numpy

A = numpy.random.rand(3, 2, 777)
b = numpy.random.rand(3, 777)

for k in range(777):
    numpy.linalg.lstsq(A[..., k], b[..., k])

这可行,但速度很慢。我宁愿一次性计算出所有的解决方案,但是在

numpy.linalg.lstsq(A, b)

我来了

numpy.linalg.linalg.LinAlgError: 3-dimensional array given. Array must be two-dimensional

关于如何广播numpy.linalg.lstsq的任何提示?

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    如果A = U \Sigma V^TA的奇异值分解,可以利用这一事实,

    x = V \Sigma^+ U^T b
    

    Ax = b 的最小二乘解。 SVD is broadcasted in numpy。现在只需要稍微摆弄einsums 就可以了:

    A = numpy.random.rand(7, 3, 2)
    b = numpy.random.rand(7, 3)
    for k in range(7):
        x, res, rank, sigma = numpy.linalg.lstsq(A[k], b[k])
        print(x)
    
    print
    
    u, s, v = numpy.linalg.svd(A, full_matrices=False)
    uTb = numpy.einsum('ijk,ij->ik', u, b)
    xx = numpy.einsum('ijk, ij->ik', v, uTb / s)
    print(xx)
    

    【讨论】:

    • 我很好奇这里的速度比较。它更快吗?
    猜你喜欢
    • 2018-07-06
    • 2012-03-25
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 2012-07-13
    • 2014-03-15
    • 2014-04-28
    • 2012-02-10
    相关资源
    最近更新 更多