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}}|}
  2. 2-范数,又名谱范数,计算方法为 A T A A^TA 矩阵的最大特征值的开平方。
    A 2 = max ( λ ) ||A||_2=\sqrt{\max{(\lambda)}}
  3. -范数,又名行和范数。顾名思义,即矩阵行向量中绝对值之和的最大值。
    A 1 = max j i = 1 n a i j ||A||_1=\max_j{\sum_{i=1}^{n}{|a_{ij}}|}
  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}}|}}

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

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

在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})}

参数
----------
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

猜你喜欢

转载自blog.csdn.net/Muzi_Water/article/details/85329445