繁体   English   中英

Pytorch torch.linalg.svd 返回不正交的 U 和 V^T

[英]Pytorch torch.linalg.svd returning U and V^T, which are not orthogonal

使用 U、S、VT = torch.linalg.svd(M),矩阵“M”很大,所以我得到的矩阵 U 和 VT 是非正交的。 当我计算 torch.norm(torch.mm(matrix, matrix.t()) - identity_matrix)) 它的 0.004 以及当我打印 MM^T 时,对角线条目不是 1,而是 0.2 或 0.4,非对角线不是0,但 0.0023。 有没有办法通过正交 U 和 V^T 获得 SVD? 但是奇异值,即 S 的对角元素仅小于 1。

matrix = torch.randn(4096, 4096) 
u, s, vh = torch.linalg.svd(matrix) 
matrix = torch.mm(u, vh)
print('norm ||WTW - I||: ',torch.norm(torch.mm(matrix, matrix.t()) - torch.eye(matrix.shape[0]))) 
print(matrix)

我做了一些数值分析,Pytorch 的 linalg_svd 似乎没有返回正交的 u 和 vh。 其他人是否也可以验证这种行为是否与其他人有关,或者我做错了什么?

Matlab:我在 matlab 中尝试了内置 svd 分解,那里有norm(u*transpose(u) - eye(4096)) ,那里有它的 1E-13。

为什么你期望matrix @ matrix.T接近I

SVD是输入矩阵matrix分解 它不会改变它,它只会产生三个矩阵usvh st matrix = u @ s @ vh SVD的特殊之处在于矩阵usvh不是任意的,而是唯一的: uv是正交的,而s是对角线的。

您实际上应该期望的是:

matrix = torch.randn(4096, 4096) 
u, s, vh = torch.linalg.svd(matrix)

print(f'||uuT - I|| = {torch.norm(u@u.t() - torch.eye(u.shape[0]))}')
print(f'||vvT - I|| = {torch.norm(vh.t()@vh - torch.eye(vh.shape[0]))}')

请注意,由于数字问题,差异||uuT -I|| 不太可能完全为零,而是一些小数字,具体取决于矩阵的维度(矩阵越大——误差越大),以及您使用的dtype的精度: float32 (又名single )可能会导致与float64 (又名double )相比误差更大。


PS,运算符@代表矩阵乘法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM