mlx.core.linalg.norm

目录

mlx.core.linalg.norm#

norm(a: array, /, ord: None | int | float | str = None, axis: None | int | list[int] = None, keepdims: bool = False, *, stream: None | Stream | Device = None) array#

矩阵或向量范数。

此函数根据 ordaxis 参数的值计算向量或矩阵范数。

参数:
  • a (数组) – 输入数组。如果 axisNone,则 a 必须是 1 维或 2 维的,除非 ord 也为 None。如果 axisord 都为 None,将返回 a.flatten 的 2 范数。

  • ord (int, floatstr, 可选) – 范数的阶(参见 Notes 下的表格)。如果为 None,将沿给定 axis 计算 2 范数(对于矩阵为 Frobenius 范数)。默认值:None

  • axis (intlist(int), 可选) – 如果 axis 是一个整数,它指定了 a 中沿哪个轴计算向量范数。如果 axis 是一个包含两个整数的元组,它指定了包含 2 维矩阵的轴,并计算这些矩阵的矩阵范数。如果 axisNone,则返回向量范数(当 a 为 1 维时)或矩阵范数(当 a 为 2 维时)。默认值:None

  • keepdims (bool, 可选) – 如果为 True,则被计算范数的轴将保留在结果中,作为大小为一的维度。默认值 False

返回值:

包含范数的输出。

返回类型:

数组

说明

对于 ord < 1 的值,严格来说,结果不是数学范数,但它可能对各种数值目的仍然有用。

可以计算以下范数

ord

矩阵范数

向量范数

None

Frobenius 范数

2 范数

‘fro’

Frobenius 范数

‘nuc’

核范数

inf

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

max(abs(x))

-inf

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

min(abs(x))

0

sum(x != 0)

1

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

如下所示

-1

min(sum(abs(x), axis=0))

如下所示

2

2 范数 (最大奇异值)

如下所示

-2

最小奇异值

如下所示

其他

sum(abs(x)**ord)**(1./ord)

Frobenius 范数由 [1] 给出

\(||A||_F = [\sum_{i,j} abs(a_{i,j})^2]^{1/2}\)

核范数是奇异值的总和。

Frobenius 范数和核范数阶都只对矩阵定义,当 a.ndim != 2 时会引发 ValueError

参考文献

示例

>>> import mlx.core as mx
>>> from mlx.core import linalg as la
>>> a = mx.arange(9) - 4
>>> a
array([-4, -3, -2, ..., 2, 3, 4], dtype=int32)
>>> b = a.reshape((3,3))
>>> b
array([[-4, -3, -2],
       [-1,  0,  1],
       [ 2,  3,  4]], dtype=int32)
>>> la.norm(a)
array(7.74597, dtype=float32)
>>> la.norm(b)
array(7.74597, dtype=float32)
>>> la.norm(b, 'fro')
array(7.74597, dtype=float32)
>>> la.norm(a, float("inf"))
array(4, dtype=float32)
>>> la.norm(b, float("inf"))
array(9, dtype=float32)
>>> la.norm(a, -float("inf"))
array(0, dtype=float32)
>>> la.norm(b, -float("inf"))
array(2, dtype=float32)
>>> la.norm(a, 1)
array(20, dtype=float32)
>>> la.norm(b, 1)
array(7, dtype=float32)
>>> la.norm(a, -1)
array(0, dtype=float32)
>>> la.norm(b, -1)
array(6, dtype=float32)
>>> la.norm(a, 2)
array(7.74597, dtype=float32)
>>> la.norm(a, 3)
array(5.84804, dtype=float32)
>>> la.norm(a, -3)
array(0, dtype=float32)
>>> c = mx.array([[ 1, 2, 3],
...               [-1, 1, 4]])
>>> la.norm(c, axis=0)
array([1.41421, 2.23607, 5], dtype=float32)
>>> la.norm(c, axis=1)
array([3.74166, 4.24264], dtype=float32)
>>> la.norm(c, ord=1, axis=1)
array([6, 6], dtype=float32)
>>> m = mx.arange(8).reshape(2,2,2)
>>> la.norm(m, axis=(1,2))
array([3.74166, 11.225], dtype=float32)
>>> la.norm(m[0, :, :]), LA.norm(m[1, :, :])
(array(3.74166, dtype=float32), array(11.225, dtype=float32))