Python3——np.linalg.norm

版权声明:本文为博主原创文章,未经博主允许不得转载。

在线性代数中,一个向量通过矩阵转换成另一个向量时,原有向量的大小就是向量的范数,这个变化过程的大小就是矩阵的范数。

矩阵的范数

首先假设矩阵的大小为m∗nm∗n,即m行n列。

  1. 1-范数,又名列和范数。顾名思义,即矩阵列向量中绝对值之和的最大值。
    ∣ ∣ A ∣ ∣ 1 = max ⁡ j ∑ i = 1 m ∣ a i j ∣ ||A||_1=\max_j{\sum_{i=1}^{m}{|a_{ij}}|} A1=jmaxi=1maij
  2. 2-范数,又名谱范数,计算方法为 A T A A^TA ATA矩阵的最大特征值的开平方。
    ∣ ∣ A ∣ ∣ 2 = max ⁡ ( λ ) ||A||_2=\sqrt{\max{(\lambda)}} A2=max(λ)
  3. ∞ ∞ -范数,又名行和范数。顾名思义,即矩阵行向量中绝对值之和的最大值。
    ∣ ∣ A ∣ ∣ 1 = max ⁡ j ∑ i = 1 n ∣ a i j ∣ ||A||_1=\max_j{\sum_{i=1}^{n}{|a_{ij}}|} A1=jmaxi=1naij
  4. F-范数,Frobenius范数,计算方式为矩阵元素的绝对值的平方和再开方。
    ∣ ∣ A ∣ ∣ F = ∑ i = 1 m ∑ j = 1 n ∣ a i j ∣ ||A||_F=\sqrt{\sum_{i=1}^{m}{\sum_{j=1}^{n}{|a_{ij}}|}} AF=i=1mj=1naij

向量的范数计算方法有以下5种:

  1. 1-范数,计算方式为向量所有元素的绝对值之和。
    ∣ ∣ x ∣ ∣ 1 = ∑ i n ∣ x i ∣ ||x||_1=∑_{i}^{n}{|x_i|} x1=inxi
  2. 2-范数,计算方式同欧式距离。
    ∣ ∣ x ∣ ∣ 2 = ( ∑ i n ∣ x i ∣ 2 ) ||x||_2=\sqrt{(∑_{i}^{n}|xi|^2)} x2=(inxi2)
  3. ∞ ∞ -范数,所有向量元素中的最大值。
    ∣ ∣ x ∣ ∣ ∞ = max ⁡ i ∣ x i ∣ ||x||_∞=\max_i|x_i| x=imaxxi
  4. − ∞ −∞ −-范数,所有向量元素中的最小值。
    ∣ ∣ x ∣ ∣ − ∞ = min ⁡ i ∣ x i ∣ ||x||_-∞=\min_i|x_i| x=iminxi
  5. p p p-范数,所有向量元素绝对值的p次方和的1/p次幂。
    ∣ ∣ x ∣ ∣ 2 = ( ∑ i n ∣ x i ∣ p ) p ||x||_2=\sqrt[p]{(∑_{i}^{n}|xi|^p)} x2=p(inxip)

在Python中,我们利用norm函数来计算范数,具体如下:

norm(x, ord=None, axis=None, keepdims=False)是numpy库里linalg现行代数模块中计算矩阵向量范数的方法。

ord 矩阵范数 向量范数
None Frobenius norm 2-norm
‘fro’ Frobenius norm
‘nuc’ nuclear norm 核范数是奇异值的和
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 ∑ ( a b s ( x ) o r d ) o r d \sqrt[ord]{\sum(abs(x)^{ord})} ord(abs(x)ord)

参数
----------
x : 输入数组,如果axis是None,那么x必须是一维或二维
ord : 可选{非零整数, inf, -inf, ‘fro’, ‘nuc’},具体如上表所示
axis : 可选{整数,2元组, None}
   如果“axis”是一个整数,它指定“x”的轴计算向量的范数。如果“axis”是一个二元组,则指定包含二维矩阵的坐标轴,以及这些矩阵的矩阵范数计算。如果“axis”为空,那么是对整体所有的数计算。
keepdims : 布尔值, optional
   当 True时, 返回维度为1的结果。
   当False时,结果将是根据原始的“x”的维度正确广播。

注意:严格来说,当 ord <= 0 时,不符合数学上的范数公式,但它仍然适用于各种数值目的。

import numpy as np
a = np.arange(12)
print(a)
b = a.reshape((3, 4))
print(b)
print(np.linalg.norm(a))
print(np.linalg.norm(b))
print(np.linalg.norm(b, 'fro'))
print(np.linalg.norm(b, 'nuc'))

print(np.linalg.norm(a, np.inf))
print(np.linalg.norm(a, -np.inf))
print(np.linalg.norm(a, 1))

print(np.linalg.norm(b, np.inf, axis=1))
print(np.linalg.norm(b, -np.inf, axis=0))
print(np.linalg.norm(b, 1))
[ 0  1  2  3  4  5  6  7  8  9 10 11]
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
22.4944437584
22.4944437584
22.4944437584
24.3646384993
11.0
0.0
66.0
[  3.   7.  11.]
[ 0.  1.  2.  3.]
21.0

你可能感兴趣的:(Python,numpy)