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 #
矩阵或向量范数。
此函数根据
ord
和axis
参数的值计算向量或矩阵范数。- 参数:
a (数组) – 输入数组。如果
axis
为None
,则a
必须是 1 维或 2 维的,除非ord
也为None
。如果axis
和ord
都为None
,将返回a.flatten
的 2 范数。ord (int, float 或 str, 可选) – 范数的阶(参见
Notes
下的表格)。如果为None
,将沿给定axis
计算 2 范数(对于矩阵为 Frobenius 范数)。默认值:None
。axis (int 或 list(int), 可选) – 如果
axis
是一个整数,它指定了a
中沿哪个轴计算向量范数。如果axis
是一个包含两个整数的元组,它指定了包含 2 维矩阵的轴,并计算这些矩阵的矩阵范数。如果 axis 为None
,则返回向量范数(当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))