torch.linalg.cond

torch.linalg.cond(A, p=None, *, out=None) Tensor

计算矩阵相对于矩阵范数的条件数。

K\mathbb{K} 为实数集 R\mathbb{R} 或复数集 C\mathbb{C},矩阵 AKn×nA \in \mathbb{K}^{n \times n}条件数κ\kappa定义为:

κ(A)=ApA1p\kappa(A) = \|A\|_p\|A^{-1}\|_p

矩阵 A 的条件数衡量了线性系统 AX = B 在矩阵范数下的数值稳定性。

支持浮点型、双精度型、复数浮点型和复数双精度型的数据类型作为输入。还支持矩阵的批量处理,如果A是一组矩阵,那么输出将具有相同的批处理维度。

p 定义了要计算的矩阵范数。支持的范数包括:

p

矩阵范数

2-范数(即最大奇异值)

“fro”

Frobenius 范数

“nuc”

核范数

inf 由于这里的修改目标是为了使句子更自然、更符合中文习惯,但给定的内容仅为一个标签“inf”,在不改变其意义和结构的前提下,保持原样最为合适。因此直接返回原文: inf

max(sum(abs(x), dim=1))

-∞

min(sum(abs(x), dim=1))

1

max(sum(abs(x), dim=0))

-1

min(sum(abs(x), dim=0)) (表示先对x取绝对值,然后沿维度0求和,最后取最小值)

2

最大的奇异值

-2

最小奇异值

其中inf指的是float('inf')、NumPy的inf对象,或者任何等效的对象。

p(‘fro’, ‘nuc’, inf, -inf, 1, -1)中的一个值时,此函数使用torch.linalg.norm()torch.linalg.inv()。因此,在这种情况下,矩阵(或批次中的每个矩阵)A 必须是方阵且可逆。

p(2, -2) 时,此函数可以基于奇异值 σ1σn\sigma_1 \geq \ldots \geq \sigma_n 来计算

κ2(A)=σ1σnκ2(A)=σnσ1\kappa_2(A) = \frac{\sigma_1}{\sigma_n}\qquad \kappa_{-2}(A) = \frac{\sigma_n}{\sigma_1}

在这种情况下,它是通过torch.linalg.svdvals() 函数计算的。对于这些范数,矩阵(或批次中的每个矩阵)A 可以是任何形状。

注意

当输入位于CUDA设备上时,如果p(‘fro’, ‘nuc’, inf, -inf, 1, -1)之一,此函数会将该设备与CPU同步。

参见

torch.linalg.solve() 用于求解方阵的线性系统问题。

torch.linalg.lstsq() 用于求解一般矩阵的线性系统。

参数
  • A (Tensor) – 张量的形状为 (*, m, n),其中 * 表示零个或多个批次维度,适用于 p(2, -2) 中;张量的形状为 (*, n, n),每个矩阵都是可逆的,适用于 p('fro', 'nuc', inf, -inf, 1, -1)

  • p (int, inf, -inf, 'fro', 'nuc', optional) – 矩阵范数的类型(见上文)。默认值: None

关键字参数

out (Tensor, optional) – 输出张量。默认为None,若未指定则忽略。

返回值

这是一个实值张量,即便在A为复数的情况下也成立。

异常

RuntimeError – 如果 p(‘fro’, ‘nuc’, inf, -inf, 1, -1) 中的一个,并且 A 矩阵或批次中的任何矩阵不是方阵或不可逆。

示例:

>>> A = torch.randn(3, 4, 4, dtype=torch.complex64)
>>> torch.linalg.cond(A)
>>> A = torch.tensor([[1., 0, -1], [0, 1, 0], [1, 0, 1]])
>>> torch.linalg.cond(A)
tensor([1.4142])
>>> torch.linalg.cond(A, 'fro')
tensor(3.1623)
>>> torch.linalg.cond(A, 'nuc')
tensor(9.2426)
>>> torch.linalg.cond(A, float('inf'))
tensor(2.)
>>> torch.linalg.cond(A, float('-inf'))
tensor(1.)
>>> torch.linalg.cond(A, 1)
tensor(2.)
>>> torch.linalg.cond(A, -1)
tensor(1.)
>>> torch.linalg.cond(A, 2)
tensor([1.4142])
>>> torch.linalg.cond(A, -2)
tensor([0.7071])

>>> A = torch.randn(2, 3, 3)
>>> torch.linalg.cond(A)
tensor([[9.5917],
        [3.2538]])
>>> A = torch.randn(2, 3, 3, dtype=torch.complex64)
>>> torch.linalg.cond(A)
tensor([[4.6245],
        [4.5671]])
本页目录