numpy 使用相对稀疏的矩阵计算最小二乘的最快方法(0.4%的数据)

1tuwyuhd  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(89)

**上下文:**我求解方程A_des.x = b,其中我通过最小二乘法找到x。我必须执行此操作数千次。A_des在每次迭代之间变化,但保持稀疏(始终约为矩阵中实际数据的4%)。
问题:A_des很大((28106, 1185)),解线性方程组大约需要1秒,我需要做30万次。
**问题:**你有什么线索可以加快这一进程?
**我尝试了什么:**我在GPU和CPU上都编写了我的函数。我使用pytorch进行GPU计算,但速度不一致。我不能并行化我的函数,因为求解器函数通常已经线程化。我尝试在CPU上使用几个求解器函数:np.linalg.solvenp.linalg.lstsqscipy.linalg.solvescipy.optimize.least_squaresscipy.sparse.linalg.lsqr(用scipy.sparse.coo_array(A_des)预先转换A_des)。
**我找到的最好的方法:**我找到的最好的折衷方法是使用np.linalg.solve,我只需要手工做一些矩阵操作。例如,用最小二乘函数求解系统将是:x = np.linalg.lstsq(A_des, b),而用solve求解系统将是:x = np.linalg.solve(A_des.T@A_des, A_des.T@b)。我发现的唯一另一个更快求解系统的方法是:x = scipy.sparse.linalg.lsqr(A_des, b, atol = 1e-3, btol = 1e-3),但结果并不好。
我的功能:

def Inverter(GPU, A_des, b):

    if GPU:
        # Migrate b to torch
        b= torch.from_numpy(b).to(device).double()
        # Migrate design matrix to GPU
        A_des = torch.from_numpy(A_des).to(device)
        x= torch.linalg.solve(A_des.T@A_des,A_des.T@(b)).cpu()
    else:
        #x= scipy.sparse.coo_array(A_des)
        #x= scipy.sparse.linalg.lsqr(A_des, b)[0]
        #x = scipy.linalg.solve(A_des.T@A_des,A_des.T@(b))
        x= np.linalg.solve(A_des.T@A_des,A_des.T@b)
        

    return x

字符串

相关问题