文章目录
- 一、向量范数
- 1. 定义及性质
- 2. 常见的向量范数
- l 1 l_1 l1范数(曼哈顿范数) ∥ x ∥ 1 = ∑ i = 1 n ∣ x i ∣ \|x\|_1 = \sum_{i=1}^{n} |x_i| ∥x∥1=i=1∑n∣xi∣
- l 2 l_2 l2范数(欧几里得范数) ∥ x ∥ 2 = ∑ i = 1 n x i 2 \|x\|_2 = \sqrt{\sum_{i=1}^{n} x_i^2} ∥x∥2=i=1∑nxi2
- l ∞ l_\infty l∞ 范数(无穷范数) ∥ x ∥ ∞ = max 1 ≤ i ≤ n ∣ x i ∣ \|x\|_\infty = \max_{1 \leq i \leq n} |x_i| ∥x∥∞=1≤i≤nmax∣xi∣
- l p l_p lp范数(p范数) ∥ x ∥ p = ( ∑ i = 1 n ∣ x i ∣ p ) 1 p \|x\|_p = \left(\sum_{i=1}^{n} |x_i|^p \right)^{\frac{1}{p}} ∥x∥p=(i=1∑n∣xi∣p)p1
- l 0 l_0 l0范数(0范数) ∥ x ∥ 0 = ∑ i = 1 n [ x i ≠ 0 ] \|x\|_0 = \sum_{i=1}^{n} [x_i \neq 0] ∥x∥0=i=1∑n[xi=0]
- 关系
- 3. PyTorch实现
- 二、矩阵范数
- 1. 定义及性质
- 2. 常见的矩阵范数
- Frobenius范数(弗罗贝尼乌斯范数) ∣ ∣ A ∣ ∣ F = ∑ i = 1 m ∑ j = 1 n ∣ a i j ∣ 2 ||A||_F = \sqrt{\sum_{i=1}^{m}\sum_{j=1}^{n}|a_{ij}|^2} ∣∣A∣∣F=i=1∑mj=1∑n∣aij∣2
- 列和范数(1-范数) ∣ ∣ A ∣ ∣ 1 = max 1 ≤ j ≤ n ∑ i = 1 m ∣ a i j ∣ ||A||_1 = \max_{1\leq j \leq n} \sum_{i=1}^{m} |a_{ij}| ∣∣A∣∣1=1≤j≤nmaxi=1∑m∣aij∣
- 行和范数( ∞ \infty ∞-范数) ∣ ∣ A ∣ ∣ ∞ = max 1 ≤ i ≤ m ∑ j = 1 n ∣ a i j ∣ ||A||_{\infty} = \max_{1\leq i \leq m} \sum_{j=1}^{n} |a_{ij}| ∣∣A∣∣∞=1≤i≤mmaxj=1∑n∣aij∣
- 谱范数(2-范数) ∣ ∣ A ∣ ∣ 2 = max i σ i = λ max ( A T A ) ||A||_2 = \max_{i} \sigma_i = \sqrt{\lambda_{\text{max}}(A^TA)} ∣∣A∣∣2=imaxσi=λmax(ATA)
- 核范数 ∣ ∣ A ∣ ∣ nuc = ∑ i = 1 r σ i = ∑ i = 1 r λ i ( A T A ) ||A||_{\text{nuc}} = \sum_{i=1}^{r} \sigma_i = \sum_{i=1}^{r} \sqrt{\lambda_{i}(A^TA)} ∣∣A∣∣nuc=i=1∑rσi=i=1∑rλi(ATA)
- 3. 计算示例
- 4. PyTorch实现
- 三、谱半径 ρ ( A ) = max i ∣ λ i ∣ \rho(A) = \max_i |\lambda_i| ρ(A)=imax∣λi∣
本文将介绍向量范数(包括0范数、1范数、2范数、p范数、无穷范数)、矩阵范数(包括弗罗贝尼乌斯范数、列和范数、行和范数、谱范数、核范数)与谱半径的数学定义、计算示例及Pytorch实现。
一、向量范数
1. 定义及性质
考虑一个 n n n 维向量 x x x,定义一个实值函数 N ( x ) N(x) N(x),记作 N ( x ) = ∥ x ∥ N(x) = \|x\| N(x)=∥x∥。如果 N ( x ) N(x) N(x) 满足以下条件,那么它就是 x x x 上的一个向量范数(或向量模):
- 非负性:
N
(
x
)
≥
0
N(x) \geq 0
N(x)≥0,且
N
(
x
)
=
0
N(x) = 0
N(x)=0当且仅当
x
x
x 是零向量。
∥
x
∥
≥
0
,
∥
x
∥
=
0
当且仅当
x
=
0
\|x\| \geq 0 ,\|x\| = 0 \text{ 当且仅当 } x = \mathbf{0}
∥x∥≥0,∥x∥=0 当且仅当 x=0
- 范数是非负的,即它不会为负值。当且仅当向量是零向量时,范数为零。
- 齐次性: 对于任意实数
α
\alpha
α(或复数),有
N
(
α
x
)
=
∣
α
∣
⋅
N
(
x
)
N(\alpha x) = |\alpha| \cdot N(x)
N(αx)=∣α∣⋅N(x)。
∥ α x ∥ = ∣ α ∣ ⋅ ∥ x ∥ \| \alpha x \| = |\alpha| \cdot \|x\| ∥αx∥=∣α∣⋅∥x∥- 范数在缩放(乘以常数)下保持一致,即放大或缩小向量会按比例影响其范数。
- 三角不等式: 对于任意向量
x
x
x 和
y
y
y,有
N
(
x
+
y
)
≤
N
(
x
)
+
N
(
y
)
N(x + y) \leq N(x) + N(y)
N(x+y)≤N(x)+N(y)。
∥ x + y ∥ ≤ ∥ x ∥ + ∥ y ∥ \|x + y\| \leq \|x\| + \|y\| ∥x+y∥≤∥x∥+∥y∥- 范数的三角不等式表示通过两边之和的方式度量两个向量之间的距离,它确保了向量空间中的“三角形”不会变得扭曲。
2. 常见的向量范数
对于一个 n n n维向量 x = ( x 1 , x 2 , … , x n ) x = (x_1, x_2, \ldots, x_n) x=(x1,x2,…,xn) ,其范数在不同情况下有不同的应用,比如L1范数在正则化、稀疏表示和特征选择中常被使用,L2范数在机器学习中也经常被用作优化问题的损失函数,无穷范数则常用于误差分析。
l 1 l_1 l1范数(曼哈顿范数) ∥ x ∥ 1 = ∑ i = 1 n ∣ x i ∣ \|x\|_1 = \sum_{i=1}^{n} |x_i| ∥x∥1=i=1∑n∣xi∣
l 2 l_2 l2范数(欧几里得范数) ∥ x ∥ 2 = ∑ i = 1 n x i 2 \|x\|_2 = \sqrt{\sum_{i=1}^{n} x_i^2} ∥x∥2=i=1∑nxi2
l ∞ l_\infty l∞ 范数(无穷范数) ∥ x ∥ ∞ = max 1 ≤ i ≤ n ∣ x i ∣ \|x\|_\infty = \max_{1 \leq i \leq n} |x_i| ∥x∥∞=1≤i≤nmax∣xi∣
l p l_p lp范数(p范数) ∥ x ∥ p = ( ∑ i = 1 n ∣ x i ∣ p ) 1 p \|x\|_p = \left(\sum_{i=1}^{n} |x_i|^p \right)^{\frac{1}{p}} ∥x∥p=(i=1∑n∣xi∣p)p1
l 0 l_0 l0范数(0范数) ∥ x ∥ 0 = ∑ i = 1 n [ x i ≠ 0 ] \|x\|_0 = \sum_{i=1}^{n} [x_i \neq 0] ∥x∥0=i=1∑n[xi=0]
虽然称之为"范数"有些不严谨,因为它不满足标准的范数定义,但在某些上下文中,向量的0范数仍然是一个有用的概念,特别是在稀疏表示和压缩感知等领域。然而L0范数通常不易计算,因为它是一个非凸函数,且其最优化问题通常是一个NP难题。因此,在实际应用中,通常会使用L1范数或L2范数来近似表示向量的稀疏度,或者使用其他方法来实现稀疏表示和特征选择。
关系
-
l
1
l_1
l1 范数、
l
2
l_2
l2 范数、
l
∞
l_\infty
l∞ 范数之间存在关系:
∥ x ∥ ∞ ≤ ∥ x ∥ 2 ≤ n ∥ x ∥ ∞ \|x\|_\infty \leq \|x\|_2 \leq \sqrt{n}\|x\|_\infty ∥x∥∞≤∥x∥2≤n∥x∥∞ ∥ x ∥ ∞ ≤ ∥ x ∥ 1 ≤ n ∥ x ∥ ∞ \|x\|_\infty \leq \|x\|_1 \leq n\|x\|_\infty ∥x∥∞≤∥x∥1≤n∥x∥∞
3. PyTorch实现
-
norm
默认计算 l 2 l_2 l2 范数:import torch vector = torch.tensor([1, 2, 3, 4, 5], dtype=torch.float) # 计算范数 norm = torch.norm(vector) print(norm)
- 输出:
tensor(7.4162)
7.4162 = 1 2 + 2 2 + 3 2 + 4 2 + 5 2 7.4162=\sqrt{1^2+2^2+3^2+4^2+5^2} 7.4162=12+22+32+42+52
- 输出:
-
l 1 l_1 l1 范数:
norm = torch.norm(vector, p=1)
- 输出:
tensor(15.)
15 = 1 + 2 + 3 + 4 + 5 15=1+2+3+4+5 15=1+2+3+4+5
- 输出:
-
l 0 l_0 l0 范数:
norm = torch.norm(vector, p=0)
- 输出:
tensor(5.)
非零元素的个数为 5 非零元素的个数为5 非零元素的个数为5
- 输出:
-
l ∞ l_{\infty} l∞范数:
norm = torch.norm(vector, p=float('inf'))
- 输出:
tensor(5.)
5 = m a x ( 1 , 2 , 3 , 4 , 5 ) 5=max(1,2,3,4,5) 5=max(1,2,3,4,5)
- 输出:
-
代码整合
import torch vector = torch.tensor([1, 2, 3, 4, 5], dtype=torch.float) norm2 = torch.norm(vector) print(norm2) norm1 = torch.norm(vector, p=1) print(norm1) norm0 = torch.norm(vector, p=0) print(norm0) norm = torch.norm(vector, p=float('inf')) print(norm)
二、矩阵范数
【深度学习】Pytorch 系列教程(四):PyTorch数据结构:2、张量的数学运算(2):矩阵运算及其数学原理(基础运算、转置、行列式、迹、伴随矩阵、逆、特征值和特征向量)
1. 定义及性质
矩阵的范数是定义在矩阵空间上的实值函数,用于度量矩阵的大小和变化,它在矩阵分析、数值计算和优化等领域中有着重要的应用。对于一个矩阵 A A A,矩阵范数通常表示为 N ( A ) N(A) N(A) 或 ∣ ∣ A ∣ ∣ ||A|| ∣∣A∣∣,满足以下条件:
-
非负性(Non-negativity):对于任意矩阵 A A A,有 N ( A ) ≥ 0 N(A) \geq 0 N(A)≥0,且等号成立当且仅当 A A A 是零矩阵。
-
齐次性(Homogeneity):对于任意标量 k k k 和矩阵 A A A,有 N ( k A ) = ∣ k ∣ ⋅ N ( A ) N(kA) = |k| \cdot N(A) N(kA)=∣k∣⋅N(A)。
-
三角不等式(Triangle Inequality):对于任意两个矩阵 A A A 和 B B B,有 N ( A + B ) ≤ N ( A ) + N ( B ) N(A + B) \leq N(A) + N(B) N(A+B)≤N(A)+N(B)。
范数可以衡量矩阵在不同方向上的变化程度,帮助分析和处理矩阵的特性。比如在数值计算中,矩阵范数可以用来衡量误差的上界;在优化问题中,矩阵范数可以用来定义矩阵的收敛性和稳定性。
相容范数
- 对于任意两个矩阵 A A A 和 B B B,有 ∣ ∣ A B ∣ ∣ ≤ ∣ ∣ A ∣ ∣ ⋅ ∣ ∣ B ∣ ∣ ||AB|| \leq ||A|| \cdot ||B|| ∣∣AB∣∣≤∣∣A∣∣⋅∣∣B∣∣,这被称为相容性质。
- 对于任意矩阵 A A A 和向量 x x x,有 ∣ ∣ A x ∣ ∣ ≤ ∣ ∣ A ∣ ∣ ⋅ ∣ ∣ x ∣ ∣ ||Ax|| \leq ||A|| \cdot ||x|| ∣∣Ax∣∣≤∣∣A∣∣⋅∣∣x∣∣,这也是相容性质。
算子范数
具体而言,常用的算子范数是
p
p
p范数,其中
p
p
p 是一个实数。
2. 常见的矩阵范数
Frobenius范数(弗罗贝尼乌斯范数) ∣ ∣ A ∣ ∣ F = ∑ i = 1 m ∑ j = 1 n ∣ a i j ∣ 2 ||A||_F = \sqrt{\sum_{i=1}^{m}\sum_{j=1}^{n}|a_{ij}|^2} ∣∣A∣∣F=i=1∑mj=1∑n∣aij∣2
矩阵A的Frobenius范数定义为矩阵元素绝对值的平方和再开根号,对于一个 m × n m\times n m×n的矩阵 A A A, 它的Frobenius范数可以通过以上公式计算。
列和范数(1-范数) ∣ ∣ A ∣ ∣ 1 = max 1 ≤ j ≤ n ∑ i = 1 m ∣ a i j ∣ ||A||_1 = \max_{1\leq j \leq n} \sum_{i=1}^{m} |a_{ij}| ∣∣A∣∣1=1≤j≤nmaxi=1∑m∣aij∣
矩阵A的1-范数定义为其列之和的最大值,即矩阵A的每一列的元素绝对值之和中的最大值。
行和范数( ∞ \infty ∞-范数) ∣ ∣ A ∣ ∣ ∞ = max 1 ≤ i ≤ m ∑ j = 1 n ∣ a i j ∣ ||A||_{\infty} = \max_{1\leq i \leq m} \sum_{j=1}^{n} |a_{ij}| ∣∣A∣∣∞=1≤i≤mmaxj=1∑n∣aij∣
矩阵A的 ∞ \infty ∞-范数定义为其行之和的最大值,即矩阵A的每一行的元素绝对值之和中的最大值。
谱范数(2-范数) ∣ ∣ A ∣ ∣ 2 = max i σ i = λ max ( A T A ) ||A||_2 = \max_{i} \sigma_i = \sqrt{\lambda_{\text{max}}(A^TA)} ∣∣A∣∣2=imaxσi=λmax(ATA)
矩阵A的2-范数是A的最大奇异值,是矩阵A对应的特征值中绝对值最大的特征值的平方根,这个范数通常也被称为谱范数( ≠ \neq =谱半径)。其中, σ i \sigma_i σi 表示矩阵 A 的奇异值,r 是矩阵 A 的秩。
奇异值和特征值
-
定义:特征值和特征向量适用于方阵(即行数等于列数的矩阵),而奇异值适用于任意大小的矩阵。特征值和特征向量是针对方阵而言的,而奇异值是对矩阵的奇异值分解(SVD)而言的。
-
关系:对于一个矩阵 A,它的奇异值等于 A T A A^TA ATA 的特征值的平方根。
-
应用:特征值和奇异值在某些应用中有相似的作用。例如,特征值和特征向量在矩阵对角化、主成分分析(PCA)和谱聚类中有着重要的应用;而奇异值在矩阵压缩、降维、矩阵逆以及数值稳定性方面有着重要的作用。
核范数 ∣ ∣ A ∣ ∣ nuc = ∑ i = 1 r σ i = ∑ i = 1 r λ i ( A T A ) ||A||_{\text{nuc}} = \sum_{i=1}^{r} \sigma_i = \sum_{i=1}^{r} \sqrt{\lambda_{i}(A^TA)} ∣∣A∣∣nuc=i=1∑rσi=i=1∑rλi(ATA)
核范数(nuclear norm)也叫作矩阵的核奇异值范数,它是矩阵的奇异值的和。
核范数在很多领域有着重要的应用,比如矩阵分解、稀疏表示、信号处理和最优化等。在机器学习和深度学习中,核范数也常常用于正则化,帮助模型对权重进行约束以防止过拟合。
3. 计算示例
A
=
[
2
1
−
1
4
]
A = \begin{bmatrix} 2 & 1 \\ -1 & 4 \end{bmatrix}
A=[2−114]计算其各种范数:
∣
∣
A
∣
∣
F
=
∑
i
=
1
m
∑
j
=
1
n
∣
a
i
j
∣
2
=
2
2
+
1
2
+
(
−
1
)
2
+
4
2
=
4.690416
||A||_F = \sqrt{\sum_{i=1}^{m}\sum_{j=1}^{n}|a_{ij}|^2}=\sqrt{2^2+1^2+(-1)^2+4^2}=4.690416
∣∣A∣∣F=i=1∑mj=1∑n∣aij∣2=22+12+(−1)2+42=4.690416
∥
A
∥
∞
=
max
i
∑
j
∣
a
i
j
∣
=
max
{
3
,
5
}
=
5
\|A\|_\infty = \max_i \sum_j |a_{ij}| = \max\{3, 5\} = 5
∥A∥∞=imaxj∑∣aij∣=max{3,5}=5
∥
A
∥
1
=
max
j
∑
i
∣
a
i
j
∣
=
max
{
3
,
5
}
=
5
\|A\|_1 = \max_j \sum_i |a_{ij}| = \max\{3, 5\} = 5
∥A∥1=jmaxi∑∣aij∣=max{3,5}=5
∥
A
∥
2
=
λ
max
(
A
T
A
)
\|A\|_2 = \sqrt{\lambda_{\text{max}}(A^TA)}
∥A∥2=λmax(ATA)
计算 A T A A^TA ATA 的特征值,找到最大特征值 λ max \lambda_{\text{max}} λmax:
A T A = [ 2 − 1 1 4 ] × [ 2 1 − 1 4 ] = [ 5 − 2 − 2 17 ] A^TA = \begin{bmatrix} 2 & -1 \\ 1 & 4 \end{bmatrix} \times\begin{bmatrix} 2 & 1 \\ -1 & 4 \end{bmatrix} =\begin{bmatrix} 5 & -2 \\ -2 & 17 \end{bmatrix} ATA=[21−14]×[2−114]=[5−2−217]
-
计算特征多项式:
∣ A T A − λ I ∣ = ∣ 5 − λ − 2 − 2 17 − λ ∣ |A^TA - λI| = \begin{vmatrix} 5-λ & -2 \\ -2 & 17-λ \\ \end{vmatrix} ∣ATA−λI∣= 5−λ−2−217−λ -
令 ∣ A − λ I ∣ = 0 |A - λI| = 0 ∣A−λI∣=0 可得
( 5 − λ ) ( 17 − λ ) − 2 × 2 = 0 λ 2 − 22 λ − 81 = 0 ( λ − 11 ) 2 = 40 (5-λ)(17-λ) - 2\times 2 = 0 \\ λ^2-22λ-81=0 \\ (λ-11)^2=40 (5−λ)(17−λ)−2×2=0λ2−22λ−81=0(λ−11)2=40 -
解得,特征值为 λ 1 = 11 + 2 10 \lambda_1 = 11+2\sqrt{10} λ1=11+210, λ 2 = 11 − 2 10 \lambda_2 = 11-2 \sqrt{10} λ2=11−210
λ 1 = 11 + 2 10 = 10 + 1 = 4.162277 λ 2 = 11 − 2 10 = 10 − 1 = 2.162277 \sqrt{\lambda_{1}} = \sqrt{11+2\sqrt{10}}= \sqrt{10}+1=4.162277 \\ \sqrt{\lambda_{2}} = \sqrt{11-2\sqrt{10}} =\sqrt{10}-1=2.162277 λ1=11+210=10+1=4.162277λ2=11−210=10−1=2.162277 ∥ A ∥ 2 = λ max = λ 1 = 4.162277 \|A\|_2 = \sqrt{\lambda_{\text{max}}} = \sqrt{\lambda_{1}} =4.162277 ∥A∥2=λmax=λ1=4.162277 ∥ A ∥ n u c = λ 1 + λ 2 = 2 10 = 6.324555 \|A\|_{nuc} = \sqrt{\lambda_{1}}+\sqrt{\lambda_{2}} =2\sqrt{10}=6.324555 ∥A∥nuc=λ1+λ2=210=6.324555 -
Frobenius范数:4.690416
-
∞ \infty ∞-范数(行和范数):5
-
1 1 1-范数(列和范数):5
-
2 2 2-范数(谱范数):4.162277
-
核范数:6.324555
4. PyTorch实现
import torch
A = torch.tensor([[2, 1], [-1, 4]], dtype=torch.float)
# A = torch.tensor([[1, 2], [3, 4]], dtype=torch.float)
frobenius_norm = torch.linalg.norm(A, ord='fro')
l1_norm = torch.linalg.norm(A, ord=1)
l2_norm = torch.linalg.norm(A, ord=2)
inf_norm = torch.linalg.norm(A, ord=float('inf'))
nuc_norm = torch.linalg.norm(A, ord='nuc')
print("\tFrobenius 范数:", frobenius_norm.item())
print("\t无穷范数(行和范数):", inf_norm.item())
print("\t1-范数(列和范数):", l1_norm.item())
print("\t2-范数:", l2_norm.item())
print("\t核范数:", nuc_norm.item())
三、谱半径 ρ ( A ) = max i ∣ λ i ∣ \rho(A) = \max_i |\lambda_i| ρ(A)=imax∣λi∣
谱半径是矩阵的特征值按模最大的那个值。
1. 计算示例
A = [ 2 1 − 1 4 ] A = \begin{bmatrix} 2 & 1 \\ -1 & 4 \end{bmatrix} A=[2−114]
- 计算特征多项式:
∣ A − λ I ∣ = ∣ 2 − λ 1 − 1 4 − λ ∣ |A - λI| = \begin{vmatrix} 2-λ & 1 \\ -1 & 4-λ \\ \end{vmatrix} ∣A−λI∣= 2−λ−114−λ - 令
∣
A
−
λ
I
∣
=
0
|A - λI| = 0
∣A−λI∣=0 可得
( 2 − λ ) ( 4 − λ ) + 1 × 1 = 0 λ 2 − 6 λ + 9 = 0 ( λ − 3 ) 2 = 0 (2-λ)(4-λ) + 1 \times 1 = 0 \\ λ^2-6λ+9=0 \\ (λ-3)^2=0 (2−λ)(4−λ)+1×1=0λ2−6λ+9=0(λ−3)2=0 - 解得,特征值为
λ
1
=
λ
2
=
3
\lambda_1 = \lambda_2 = 3
λ1=λ2=3
ρ ( A ) = max i ∣ λ i ∣ = 3 \rho(A) = \max_i |\lambda_i|=3 ρ(A)=imax∣λi∣=3
2. PyTorch实现
import torch
# 定义矩阵
A = torch.tensor([[2, 1], [-1, 4]], dtype=torch.float)
# 计算特征值
eigenvalues, _ = torch.linalg.eig(A)
# 计算谱半径
spectral_radius = torch.max(torch.abs(eigenvalues))
# 输出结果
print("谱半径:", spectral_radius.item())