范数

范数(norm)是数学中的一种基本概念。在泛函分析中,它定义在赋范线性空间中,并满足一定的条件,即①非负性;②齐次性;③三角不等式。它常常被用来度量某个向量空间(或矩阵)中的每个向量的长度或大小。

np.linalg.norm

(1)np.linalg.inv():矩阵求逆
(2)np.linalg.det():矩阵求行列式(标量)

linalg=linear(线性)+algebra(代数),norm则表示范数。首先需要注意的是范数是对向量(或者矩阵)的度量,是一个标量(scalar):

首先help(np.linalg.norm)查看其文档:

x_norm=np.linalg.norm(x, ord=None, axis=None, keepdims=False)

①x: 表示矩阵(也可以是一维)
②ord:范数类型

向量的范数:

参数 说明 计算方法
默认 二范数:$\mathscr{l}_2$ $\sqrt{x_{1}^{2}+x_{2}^{2}+…+x_{n}^{2}}$
ord=2 二范数:$\mathscr{l}_2$ $\sqrt{x_{1}^{2}+x_{2}^{2}+…+x_{n}^{2}}$
ord=1 一范数:$\mathscr{l}_1$ $|x_1|+|x_2|+…+|x_n|$
ord=np.inf 无穷范数:$\mathscr{l}_{\infty}$ $max({x_1, x_2, …, x_n})$

矩阵的范数:

ord=1:列和的最大值

ord=2:|λE-ATA|=0,求特征值,然后求最大特征值得算术平方根

ord=$\infty$:行和的最大值

ord=None:默认情况下,是求整体的矩阵元素平方和,再开根号。(没仔细看,以为默认情况下就是矩阵的二范数,修正一下,默认情况下是求整个矩阵元素平方和再开根号)

1
2
3
4
5
6
7
8
9
>>> x = np.array([3, 4])
>>> np.linalg.norm(x)
5.
>>> np.linalg.norm(x, ord=2)
5.
>>> np.linalg.norm(x, ord=1)
7.
>>> np.linalg.norm(x, ord=np.inf)
4

二范数的一个等价方法:

1
2
3
4
5
6
7
8
9
import numpy as np

x=np.array([[0, 3, 4], [2, 6, 4]])

y2=np.sum(x**2, axis=1, keepdims=True)**0.5

z2=x/y2

print('x=', x, 'y2=', y2, 'z2=', z2, sep='\n')
1
2
3
4
5
6
7
8
9
x=
[[0 3 4]
[2 6 4]]
y2=
[[ 5. ]
[ 7.48331477]]
z2=
[[ 0. 0.6 0.8 ]
[ 0.26726124 0.80178373 0.53452248]]

范数理论的一个小推论告诉我们:$\ell _1 \geq \ell _2 \geq \ell _\infty$

③axis:处理类型

axis=1表示按行向量处理,求多个行向量的范数

axis=0表示按列向量处理,求多个列向量的范数

axis=None表示矩阵范数。

④keepding:是否保持矩阵的二维特性

True表示保持矩阵的二维特性,False相反

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import numpy as np
x = np.array([
[0, 3, 4],
[1, 6, 4]])
#默认参数ord=None,axis=None,keepdims=False
print("默认参数(矩阵整体元素平方和开根号,不保留矩阵二维特性):",np.linalg.norm(x))
print("矩阵整体元素平方和开根号,保留矩阵二维特性:",np.linalg.norm(x,keepdims=True))

print("矩阵每个行向量求向量的2范数:",np.linalg.norm(x,axis=1,keepdims=True))
print("矩阵每个列向量求向量的2范数:",np.linalg.norm(x,axis=0,keepdims=True))

print("矩阵1范数:",np.linalg.norm(x,ord=1,keepdims=True))
print("矩阵2范数:",np.linalg.norm(x,ord=2,keepdims=True))
print("矩阵∞范数:",np.linalg.norm(x,ord=np.inf,keepdims=True))

print("矩阵每个行向量求向量的1范数:",np.linalg.norm(x,ord=1,axis=1,keepdims=True))
1
2
3
4
5
6
7
8
9
10
默认参数(矩阵整体元素平方和开根号,不保留矩阵二维特性): 8.83176086633
矩阵整体元素平方和开根号,保留矩阵二维特性: [[ 8.83176087]]
矩阵每个行向量求向量的2范数: [[ 5. ]
[ 7.28010989]]
矩阵每个列向量求向量的2范数: [[ 1. 6.70820393 5.65685425]]
矩阵1范数: [[ 9.]]
矩阵2范数: [[ 8.70457079]]
矩阵∞范数: [[ 11.]]
矩阵每个行向量求向量的1范数: [[ 7.]
[ 11.]]

补充

估计线性模型中的系数:b=a*x

1
a=np.linalg.lstsq(x,b)

求方阵的逆矩阵

1
np.linalg.inv(A)

广义逆矩阵

1
np.linalg.pinv(A)

求矩阵的行列式

1
np.linalg.det(A)

解形如AX=b的线性方程组

1
np.linalg.solve(A,b)

求矩阵的特征值

1
np.linalg.eigvals(A)

求特征值和特征向量

1
np.linalg.eig(A)

Svd分解

1
np.linalg.svd(A)

参考文章

  1. 范数-百度百科

  2. np.linalg.norm

  3. np.linalg.norm(求范数)

  4. numpy 基础 —— np.linalg

  5. python 库 Numpy 中如何求取向量范数 np.linalg.norm(求范数)(向量的第二范数为传统意义上的向量长度),(如何求取向量的单位向量)

  6. 【CSDN】numpy线性代数np.linalg