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)∥∞。\par
{\heiti{解}}:不难算得函数 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的近似值。