我一直试图通过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
是什么错了?为什么这两种方法有区别?
从版本1.8开始,PyTorch原生支持numpy风格的torch.linalg
操作,包括Cholesky分解和行列式:
torch.linalg.det(input)
计算一个方阵输入的行列式,或一个批处理输入中每个方阵的行列式。