范数(norm),是具有“长度”概念的函数 p p 。在线性代数、泛函分析及相关的数学领域,是一个函数,其为向量空间内的所有向量赋予非零的正长度或大小。半范数反而可以为非零的向量赋予零长度。它是欧几里得空间中长度的推广。
举一个简单的例子,一个二维度的欧氏几何空间 ℝ2 R 2 就有欧氏范数。在这个向量空间的元素(譬如:(3,7))常常在笛卡儿坐标系统被画成一个从原点出发的箭号。每一个向量的欧氏范数就是箭号的长度。
范数是一个由向量域指向实数域的函数,满足三个性质:
如果范数是半范数还要加上一个额外的性质才能成为范数:
满足这 3 + 1 的性质的范数及其向量空间被称为赋范向量空间。
‖x‖=|x| ‖ x ‖ = | x |
是在由实数或虚数构成的一维向量中的范数。
两点之间之间线段形成线段对轴产生的投影的距离总和。一般表示城市区块之间距离,绝对值是曼哈顿范数的特殊情况。
就是某点到原点之间距离。
‖x‖:=x21+⋯+x2n‾‾‾‾‾‾‾‾‾‾‾‾√ ‖ x ‖ := x 1 2 + ⋯ + x n 2
p-范数的定义如下:
‖x‖p:=(∑ni=1|xi|p)1/p ‖ x ‖ p := ( ∑ i = 1 n | x i | p ) 1 / p (p 不在(0,1)范围内)
可见当 p 为 2 的时候是欧几里得范数。
考虑系数域 K K (可以是实数域或者复数域), m×n m × n 矩阵的向量空间实际上就是有 m * n 维的向量空间。就可和其他的向量一样,为其装备上一个范数。
如果可以给矩阵空间也建立成赋范向量空间,那就需要矩阵范数。矩阵范数也必须满足如上文所示的 3 + 1 个性质。矩阵范数用 ‖⋅‖ ‖ ⋅ ‖ 表示
另外如果矩阵是个方阵,还需要满足:
这种范数将矩阵看做一个 m×n m × n 向量。并且使用类似向量范数的范数,比如 p-范数:
‖A‖p=(∑mi=1∑nj=1|aij|p)1/p ‖ A ‖ p = ( ∑ i = 1 m ∑ j = 1 n | a i j | p ) 1 / p
定义方法有多种,最容易理解的就是:
‖A‖F=∑mi=1∑nj=1|aij|2‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾√ ‖ A ‖ F = ∑ i = 1 m ∑ j = 1 n | a i j | 2
也是编程中非常常用的范数。类似欧氏长度。
其他还有:
‖A‖F=trace(A∗A)‾‾‾‾‾‾‾‾‾‾√=∑min{m,n}i=1σ2i‾‾‾‾‾‾‾‾‾‾‾‾√ ‖ A ‖ F = trace ( A ∗ A ) = ∑ i = 1 min { m , n } σ i 2
当 p-范数 p 为正无穷的时候可以得到:
‖A‖max=max{|aij|} ‖ A ‖ m a x = max { | a i j | }
求得是分量最大值。
注意:python 里面的 inf 系列范数与此有所不同。
numpy 提供的求范数函数。可以求矩阵范数和向量范数。
numpy.linalg.norm(x, ord=None, axis=None, keepdims=False)
axis
填了None
,这个 x 则必须是 1 维或者 2 维的。{non-zero int, inf, -inf, ‘fro’, ‘nuc’}
。这里的inf
代表着 numpy 的无穷对象(正无穷和负无穷)。{int, 2-tuple of ints, None}
,如果是一个 int
那规定着是按0
:列向量还是1
:行向量来计算向量范数。如果是一个二元的 tuple,它指定两个维度,按照这两个维度来规定一层层的矩阵,按照矩阵计算矩阵范数。如果None
,返回的结果根据 x 的维度(1 维或 2维)来计算向量范数或矩阵范数。一个浮点数或者 ndarray。
ord | 矩阵范数 | 向量范数 |
---|---|---|
None | 弗罗贝尼乌斯范数 | 欧几里得范数 |
‘fro’ | 弗罗贝尼乌斯范数 | 无 |
‘nuc’ | nuclear 范数 | 无 |
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)) | as below |
-1 | min(sum(abs(x), axis=0)) | as below |
2 | 2-norm (largest sing. value) | as below |
-2 | smallest singular value | as below |
other | 无 | sum(abs(x)**ord)**(1./ord) |