【问题标题】:Why is the output of torch.lstsq drastically different than np.linalg.lstsq?为什么 torch.lstsq 的输出与 np.linalg.lstsq 有很大不同?
【发布时间】:2020-12-12 01:01:51
【问题描述】:

Pytorch 提供了一个 lstsq 函数,但它返回的结果与 numpy 的版本大不相同。这是一个示例输入及其两个结果:

import numpy as np
import torch 

a = torch.tensor([[1., 1, 1],
                  [2, 3, 4],
                  [3, 5, 2],
                  [4, 2, 5],
                  [5, 4, 3]])

b = torch.tensor([[-10., -3],
                  [ 12, 14],
                  [ 14, 12],
                  [ 16, 16],
                  [ 18, 16]])

a1 = a.clone().numpy()
b1 = b.clone().numpy()

x, r = torch.lstsq(b, a)

x1, res, r1, s = np.linalg.lstsq(b1, a1)

print(f'torch_x: {x}')
print(f'torch_r: {r}\n')

print(f'np_x: {x1}')
print(f'np_res: {res}')
print(f'np_r1(rank): {r1}')
print(f'np_s: {s}')

输出:

torch_x: tensor([[ 2.0000,  1.0000],
        [ 1.0000,  1.0000],
        [ 1.0000,  2.0000],
        [10.9635,  4.8501],
        [ 8.9332,  5.2418]])
torch_r: tensor([[-7.4162, -6.7420, -6.7420],
        [ 0.2376, -3.0896,  0.1471],
        [ 0.3565,  0.5272,  3.0861],
        [ 0.4753, -0.3952, -0.4312],
        [ 0.5941, -0.1411,  0.2681]])

np_x: [[-0.11452514 -0.10474861 -0.28631285]
 [ 0.35913807  0.33719075  0.54070234]]
np_res: [ 5.4269753 10.197526   1.4185953]
np_r1(rank): 2
np_s: [43.057705  5.199417]

我在这里错过了什么?

【问题讨论】:

    标签: python numpy pytorch torch


    【解决方案1】:

    torch.lstq(a, b) 求解 minX L2∥bX−a∥np.linalg.lstsq(a, b) 解决 minX L2∥aX−b∥

    所以改变传递参数的顺序。

    这是一个示例:

    将 numpy 导入为 np 进口火炬

    a = torch.tensor([[1., 1, 1],
                      [2, 3, 4],
                      [3, 5, 2],
                      [4, 2, 5],
                      [5, 4, 3]])
    
    b = torch.tensor([[-10., -3],
                      [ 12, 14],
                      [ 14, 12],
                      [ 16, 16],
                      [ 18, 16]])
    
    a1 = a.clone().numpy()
    b1 = b.clone().numpy()
    
    x, _ = torch.lstsq(a, b)
    
    x1, res, r1, s = np.linalg.lstsq(b1, a1)
    
    print(f'torch_x: {x[:b.shape[1]]}')
    
    print(f'np_x: {x1}')
    

    结果:

    torch_x: tensor([[-0.1145, -0.1047, -0.2863],
            [ 0.3591,  0.3372,  0.5407]])
    np_x: [[-0.11452514 -0.10474861 -0.28631285]
     [ 0.35913807  0.33719075  0.54070234]]
    

    链接到火炬doc 链接到 numpy doc

    从 numpy.lianalg.lstsq 返回的 rank 也是 第一个参数的排名。要在 pytorch 中获得排名,请使用 torch.matrix_rank() 函数。

    【讨论】:

    • 非常感谢非常感谢!但是你知道我也可以在 pytorch 中提取排名吗? numpy 返回一个特定的排名值,但我不知道这在 pytorch 中是如何完成的!
    • @Rika 使用 torch.matrix_rank(required_matrix) 。这里 numpy lstq 返回传递的第一个张量的等级,即 torch lstq 的第二个张量,所以使用 torch.matrix_rank(2nd)
    • 非常感谢非常感谢。所以可以肯定的是,你的意思是,我需要在x,y=torch.lstsq(a, b) 的第二个输出上运行 matrix_rank,即你在这里?正确的?我也应该用 ```symmetric=true`` 还是 false 来称呼它?
    • 使用 matrix_rank(b)
    • 目前还不清楚为什么 torch 会返回一个 5×2 矩阵。求解 bx = a 其中:b 是 5×2,a 是 5×3,应该返回 x,它是 2×3(或 3×2,因为torch 返回转置)其中是 5 -by-2 矩阵结果来自?!
    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多