Python用于科学计算中各种数组操作的工具包numpy的linalg模块中提供函数norm用于计算向量和矩阵的范数。该函数的调用接口为
norm(x,ord)
\text{norm(x,ord)}
norm(x,ord)
其中,参数x表示向量或矩阵,ord表示范数类型,缺省值为2-范数。即对向量
x
=
(
x
1
x
2
⋮
x
n
)
\boldsymbol{x}=\begin{pmatrix}x_1\\x_2\\\vdots\\x_n\end{pmatrix}
x=
x1x2⋮xn
计算范数
∥
x
∥
2
=
∑
i
=
1
n
∣
x
i
∣
2
\lVert\boldsymbol{x}\rVert_2=\sqrt{\sum_{i=1}^n|x_i|^2}
∥x∥2=i=1∑n∣xi∣2
对矩阵
A
=
(
a
11
a
12
⋯
a
1
n
a
21
a
22
⋯
a
2
n
⋮
⋮
⋱
⋮
a
m
1
a
m
2
⋯
a
m
n
)
\boldsymbol{A}=\begin{pmatrix}a_{11}&a_{12}&\cdots&a_{1n}\\a_{21}&a_{22}&\cdots&a_{2n}\\\vdots&\vdots&\ddots&\vdots\\a_{m1}&a_{m2}&\cdots&a_{mn}\end{pmatrix}
A=
a11a21⋮am1a12a22⋮am2⋯⋯⋱⋯a1na2n⋮amn
,范数为
∥
A
∥
2
=
∑
i
=
1
m
∑
j
=
1
n
∣
a
i
j
∣
2
.
\lVert\boldsymbol{A}\rVert_2=\sqrt{\sum_{i=1}^m\sum_{j=1}^n|a_{ij}|^2}.
∥A∥2=i=1∑mj=1∑n∣aij∣2.
其它类型范数读者可查阅numpy手册。例如,若参数ord取numpy的inf(表示无穷
∞
\infty
∞),对向量
x
\boldsymbol{x}
x而言,计算的范数为
∥
x
∥
∞
=
max
1
≤
i
≤
n
{
∣
x
i
∣
}
,
\lVert\boldsymbol{x}\rVert_{\infty}=\max_{1\leq i\leq n}\{|x_i|\},
∥x∥∞=1≤i≤nmax{∣xi∣},
而对矩阵
A
\boldsymbol{A}
A而言,计算的是范数
∥
A
∥
∞
=
max
1
≤
i
≤
m
{
∑
j
=
1
n
∣
a
i
j
∣
}
.
\lVert\boldsymbol{A}\rVert_{\infty}=\max_{1\leq i\leq m}\left\{\sum_{j=1}^n|a_{ij}|\right\}.
∥A∥∞=1≤i≤mmax{j=1∑n∣aij∣}.
例1 用Python计算函数
f
(
x
1
,
x
2
)
=
x
1
4
+
x
2
4
−
4
x
1
2
x
2
2
,
(
x
1
x
2
)
∈
R
2
f(x_1,x_2)=x_1^4+x_2^4-4x_1^2x_2^2,\begin{pmatrix}x_1\\x_2\end{pmatrix}\in\text{ℝ}^2
f(x1,x2)=x14+x24−4x12x22,(x1x2)∈R2在
(
x
1
x
2
)
=
(
1
2
1
2
)
\begin{pmatrix}x_1\\x_2\end{pmatrix}=\begin{pmatrix}\frac{1}{2}\\\frac{1}{2}\end{pmatrix}
(x1x2)=(2121)处的梯度范数
∥
∇
f
(
1
2
,
1
2
)
∥
2
\lVert\nabla f(\frac{1}{2},\frac{1}{2})\rVert_2
∥∇f(21,21)∥2和
∥
∇
f
(
1
2
,
1
2
)
∥
∞
\lVert\nabla f(\frac{1}{2},\frac{1}{2})\rVert_\infty
∥∇f(21,21)∥∞。Hesse阵范数
∥
∇
2
f
(
1
2
,
1
2
)
∥
2
\lVert\nabla^2f(\frac{1}{2},\frac{1}{2})\rVert_2
∥∇2f(21,21)∥2和
∥
∇
2
f
(
1
2
,
1
2
)
∥
∞
\lVert\nabla^2f(\frac{1}{2},\frac{1}{2})\rVert_\infty
∥∇2f(21,21)∥∞。
解:不难算得函数
f
(
x
1
,
x
2
)
f(x_1,x_2)
f(x1,x2)的梯度为
∇
f
(
x
1
,
x
2
)
=
(
4
x
1
3
−
8
x
1
x
2
2
4
x
2
3
−
8
x
1
2
x
2
)
\nabla f(x_1,x_2)=\begin{pmatrix}4x_1^3-8x_1x_2^2\\4x_2^3-8x_1^2x_2\end{pmatrix}
∇f(x1,x2)=(4x13−8x1x224x23−8x12x2)
∇
f
(
1
2
,
1
2
)
=
(
1
2
1
2
)
\nabla f(\frac{1}{2},\frac{1}{2})=\begin{pmatrix}\frac{1}{2}\\\frac{1}{2}\end{pmatrix}
∇f(21,21)=(2121)。Hesse阵为
∇
2
f
(
x
1
,
x
2
)
=
(
12
x
1
2
−
8
x
2
2
−
16
x
1
x
2
−
16
x
1
x
2
12
x
2
2
−
8
x
1
2
)
\nabla^2f(x_1,x_2)=\begin{pmatrix}12x_1^2-8x_2^2&-16x_1x_2\\-16x_1x_2&12x_2^2-8x_1^2\end{pmatrix}
∇2f(x1,x2)=(12x12−8x22−16x1x2−16x1x212x22−8x12)
∇
2
f
(
1
2
,
1
2
)
=
(
1
−
4
−
4
1
)
\nabla^2f(\frac{1}{2},\frac{1}{2})=\begin{pmatrix}1&-4\\-4&1\end{pmatrix}
∇2f(21,21)=(1−4−41)。因此,
∥
∇
f
(
1
2
,
1
2
)
∥
2
=
(
1
2
)
2
+
(
1
2
)
2
=
1
2
及
∥
∇
f
(
1
2
,
1
2
)
∥
∞
=
max
{
1
2
,
1
2
}
=
1
2
\lVert\nabla f(\frac{1}{2},\frac{1}{2})\rVert_2=\sqrt{\left(\frac{1}{2}\right)^2+\left(\frac{1}{2}\right)^2}=\sqrt{\frac{1}{2}}\text{及}\lVert\nabla f(\frac{1}{2},\frac{1}{2})\rVert_\infty=\max\{\frac{1}{2},\frac{1}{2}\}=\frac{1}{2}
∥∇f(21,21)∥2=(21)2+(21)2=21及∥∇f(21,21)∥∞=max{21,21}=21
∥
∇
2
f
(
1
2
,
1
2
)
∥
2
=
1
2
+
4
2
+
1
2
+
4
2
=
34
及
∥
∇
2
f
(
1
2
,
1
2
)
∥
∞
=
max
{
1
+
4
,
4
+
1
}
=
5.
\lVert\nabla^2f(\frac{1}{2},\frac{1}{2})\rVert_2=\sqrt{1^2+4^2+1^2+4^2}=\sqrt{34}\text{及}\lVert\nabla^2f(\frac{1}{2},\frac{1}{2})\rVert_\infty=\max\{1+4,4+1\}=5.
∥∇2f(21,21)∥2=12+42+12+42=34及∥∇2f(21,21)∥∞=max{1+4,4+1}=5.
下列代码验算上述结果。
import numpy as np #导入numpy
f1=lambda x:np.array([4*x[0]**3-8*x[0]*x[1]**2, #设置梯度函数
4*x[1]**3-8*x[0]**2*x[1]])
f2=lambda x:np.array([[12*x[0]**2-8*x[1]**2,-16*x[0]*x[1]], #设置Hesse阵函数
[-16*x[0]*x[1],12*x[1]**2-8*x[0]**2]])
x=np.array([1/2,1/2]) #设置向量x
print(np.linalg.norm(f1(x))) #计算梯度2-范数
print(np.linalg.norm(f1(x),np.inf)) #计算梯度∞-范数
print(np.linalg.norm(f2(x))) #计算Hesse阵2-范数
print(np.linalg.norm(f2(x),np.inf)) #计算Hesse阵∞-范数
程序的第2~3行设置梯度函数 ∇ f ( x 1 , x 2 ) \nabla f(x_1,x_2) ∇f(x1,x2)为f1,第4~5行设置Hesse阵函数 ∇ 2 f ( x 1 , x 2 ) \nabla^2f(x_1,x_2) ∇2f(x1,x2)为f2。第6行设置向量 ( 1 2 1 2 ) \begin{pmatrix}\frac{1}{2}\\\frac{1}{2}\end{pmatrix} (2121)为x。第7、8行分别计算 ∥ ∇ f ( 1 2 , 1 2 ) ∥ 2 \lVert\nabla f(\frac{1}{2},\frac{1}{2})\rVert_2 ∥∇f(21,21)∥2和 ∥ ∇ f ( 1 2 , 1 2 ) ∥ ∞ \lVert\nabla f(\frac{1}{2},\frac{1}{2})\rVert_\infty ∥∇f(21,21)∥∞。注意调用norm函数时传递ord参数前者缺省,后者为numpy的inf。相仿地,第9、10行计算 ∥ ∇ 2 f ( 1 2 , 1 2 ) ∥ 2 \lVert\nabla^2f(\frac{1}{2},\frac{1}{2})\rVert_2 ∥∇2f(21,21)∥2和 ∥ ∇ 2 f ( 1 2 , 1 2 ) ∥ ∞ \lVert\nabla^2f(\frac{1}{2},\frac{1}{2})\rVert_\infty ∥∇2f(21,21)∥∞。运行程序,输出
0.7071067811865476
0.5
5.830951894845301
5.0
其中0.7071067811865476是
1
2
\sqrt{\frac{1}{2}}
21的近似值,5.830951894845301是
34
\sqrt{34}
34的近似值。
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!