【问题标题】:Calculating determinants via Cholesky decomposition in PyTorch通过 PyTorch 中的 Cholesky 分解计算行列式
【发布时间】:2020-11-03 16:17:54
【问题描述】:

我一直在尝试通过 PyTorch 中的 Cholesky 分解来计算 2x2 矩阵的行列式,它不会给出与 Numpy 相同的数字,我不知道为什么。据我了解,您可以通过将正定矩阵分解为下三角矩阵及其转置来计算正定矩阵的行列式,即 M = LL^T。

那么根据行列式定律,M的行列式等于L的行列式乘以L^T的行列式。在下三角矩阵的情况下,这只是对角线的乘积。所以,M等于L的对角线乘以L^T的对角线的乘积。

但是,当我在 PyTorch 中实现它时,我得到了错误的值。我在下面复制了一个示例代码。

import torch
import numpy as np

matrix = torch.Tensor(2,2).uniform_()
print("Matrix: \n", matrix.detach().numpy(), "\n")

print("Positive-definite?: ", np.all(np.linalg.eigvals(matrix.detach().numpy()) > 0))
det_np = np.linalg.det(matrix.detach().numpy())

det_tor = torch.cholesky(matrix, upper=False).diag().prod()**2

print("determinant (numpy) %8.4f" % (det_np))
print("determinant (torch) %8.4f" % (det_tor))

一个示例输出是这样的,

Matrix: 
 [[0.5305128  0.2795679 ]
 [0.41778737 0.40350497]] 

Positive-definite?:  True
determinant (numpy)   0.0973
determinant (torch)   0.0395

有什么问题吗?为什么这两种方法有区别?

【问题讨论】:

  • 您的矩阵似乎不是对称的。
  • 啊,我真傻!它确实不是对称的。谢谢!

标签: python numpy pytorch determinants matrix-decomposition


【解决方案1】:

从 1.8 版开始,PyTorch 原生支持 numpy 样式的 torch.linalg 操作,包括 Cholesky 分解和行列式:

torch.linalg.det(input)

计算方阵输入或批处理输入中每个方阵的行列式。

【讨论】:

    猜你喜欢
    • 2012-02-22
    • 1970-01-01
    • 2013-02-12
    • 2018-04-29
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 2013-11-01
    相关资源
    最近更新 更多