Python用于科学计算中各种数组操作的工具包numpy的linalg模块中提供函数norm用于计算向量和矩阵的范数。该函数的调用接口为
norm(x,ord)\text{norm(x,ord)}norm(x,ord)
其中,参数x表示向量或矩阵,ord表示范数类型,缺省值为2-范数。即对向量x=(x1x2⋮xn)\boldsymbol{x}=\begin{pmatrix}x_1\\x_2\\\vdots\\x_n\end{pmatrix}x= x1x2xn 计算范数
∥x∥2=∑i=1n∣xi∣2\lVert\boldsymbol{x}\rVert_2=\sqrt{\sum_{i=1}^n|x_i|^2}x2=i=1nxi2
对矩阵A=(a11a12⋯a1na21a22⋯a2n⋮⋮⋱⋮am1am2⋯amn)\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= a11a21am1a12a22am2a1na2namn ,范数为
∥A∥2=∑i=1m∑j=1n∣aij∣2.\lVert\boldsymbol{A}\rVert_2=\sqrt{\sum_{i=1}^m\sum_{j=1}^n|a_{ij}|^2}.A2=i=1mj=1naij2 .
其它类型范数读者可查阅numpy手册。例如,若参数ord取numpy的inf(表示无穷∞\infty),对向量x\boldsymbol{x}x而言,计算的范数为
∥x∥∞=max⁡1≤i≤n{∣xi∣},\lVert\boldsymbol{x}\rVert_{\infty}=\max_{1\leq i\leq n}\{|x_i|\},x=1inmax{xi},
而对矩阵A\boldsymbol{A}A而言,计算的是范数
∥A∥∞=max⁡1≤i≤m{∑j=1n∣aij∣}.\lVert\boldsymbol{A}\rVert_{\infty}=\max_{1\leq i\leq m}\left\{\sum_{j=1}^n|a_{ij}|\right\}.A=1immax{j=1naij}.
例1 用Python计算函数f(x1,x2)=x14+x24−4x12x22,(x1x2)∈R2f(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{ℝ}^2f(x1,x2)=x14+x244x12x22,(x1x2)R2(x1x2)=(1212)\begin{pmatrix}x_1\\x_2\end{pmatrix}=\begin{pmatrix}\frac{1}{2}\\\frac{1}{2}\end{pmatrix}(x1x2)=(2121)处的梯度范数∥∇f(12,12)∥2\lVert\nabla f(\frac{1}{2},\frac{1}{2})\rVert_2f(21,21)2∥∇f(12,12)∥∞\lVert\nabla f(\frac{1}{2},\frac{1}{2})\rVert_\inftyf(21,21)。Hesse阵范数∥∇2f(12,12)∥2\lVert\nabla^2f(\frac{1}{2},\frac{1}{2})\rVert_22f(21,21)2∥∇2f(12,12)∥∞\lVert\nabla^2f(\frac{1}{2},\frac{1}{2})\rVert_\infty2f(21,21)
:不难算得函数f(x1,x2)f(x_1,x_2)f(x1,x2)的梯度为
∇f(x1,x2)=(4x13−8x1x224x23−8x12x2)\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)=(4x138x1x224x238x12x2)
∇f(12,12)=(1212)\nabla f(\frac{1}{2},\frac{1}{2})=\begin{pmatrix}\frac{1}{2}\\\frac{1}{2}\end{pmatrix}f(21,21)=(2121)。Hesse阵为
∇2f(x1,x2)=(12x12−8x22−16x1x2−16x1x212x22−8x12)\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)=(12x128x2216x1x216x1x212x228x12)
∇2f(12,12)=(1−4−41)\nabla^2f(\frac{1}{2},\frac{1}{2})=\begin{pmatrix}1&-4\\-4&1\end{pmatrix}2f(21,21)=(1441)。因此,
∥∇f(12,12)∥2=(12)2+(12)2=12及∥∇f(12,12)∥∞=max⁡{12,12}=12\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
∥∇2f(12,12)∥2=12+42+12+42=34及∥∇2f(12,12)∥∞=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(x1,x2)\nabla f(x_1,x_2)f(x1,x2)为f1,第4~5行设置Hesse阵函数∇2f(x1,x2)\nabla^2f(x_1,x_2)2f(x1,x2)为f2。第6行设置向量(1212)\begin{pmatrix}\frac{1}{2}\\\frac{1}{2}\end{pmatrix}(2121)为x。第7、8行分别计算∥∇f(12,12)∥2\lVert\nabla f(\frac{1}{2},\frac{1}{2})\rVert_2f(21,21)2∥∇f(12,12)∥∞\lVert\nabla f(\frac{1}{2},\frac{1}{2})\rVert_\inftyf(21,21)。注意调用norm函数时传递ord参数前者缺省,后者为numpy的inf。相仿地,第9、10行计算∥∇2f(12,12)∥2\lVert\nabla^2f(\frac{1}{2},\frac{1}{2})\rVert_22f(21,21)2∥∇2f(12,12)∥∞\lVert\nabla^2f(\frac{1}{2},\frac{1}{2})\rVert_\infty2f(21,21)。运行程序,输出

0.7071067811865476
0.5
5.830951894845301
5.0

其中0.7071067811865476是12\sqrt{\frac{1}{2}}21 的近似值,5.830951894845301是34\sqrt{34}34 的近似值。
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐