最优化方法Python计算:向量和矩阵的范数
向量和矩阵的范数计算
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=
x1x2⋮xn
计算范数
∥x∥2=∑i=1n∣xi∣2\lVert\boldsymbol{x}\rVert_2=\sqrt{\sum_{i=1}^n|x_i|^2}∥x∥2=i=1∑n∣xi∣2
对矩阵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=
a11a21⋮am1a12a22⋮am2⋯⋯⋱⋯a1na2n⋮amn
,范数为
∥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}.∥A∥2=i=1∑mj=1∑n∣aij∣2.
其它类型范数读者可查阅numpy手册。例如,若参数ord取numpy的inf(表示无穷∞\infty∞),对向量x\boldsymbol{x}x而言,计算的范数为
∥x∥∞=max1≤i≤n{∣xi∣},\lVert\boldsymbol{x}\rVert_{\infty}=\max_{1\leq i\leq n}\{|x_i|\},∥x∥∞=1≤i≤nmax{∣xi∣},
而对矩阵A\boldsymbol{A}A而言,计算的是范数
∥A∥∞=max1≤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∥∞=1≤i≤mmax{j=1∑n∣aij∣}.
例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+x24−4x12x22,(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_2∥∇f(21,21)∥2和∥∇f(12,12)∥∞\lVert\nabla f(\frac{1}{2},\frac{1}{2})\rVert_\infty∥∇f(21,21)∥∞。Hesse阵范数∥∇2f(12,12)∥2\lVert\nabla^2f(\frac{1}{2},\frac{1}{2})\rVert_2∥∇2f(21,21)∥2和∥∇2f(12,12)∥∞\lVert\nabla^2f(\frac{1}{2},\frac{1}{2})\rVert_\infty∥∇2f(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)=(4x13−8x1x224x23−8x12x2)
∇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)=(12x12−8x22−16x1x2−16x1x212x22−8x12)
∇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)=(1−4−41)。因此,
∥∇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_2∥∇f(21,21)∥2和∥∇f(12,12)∥∞\lVert\nabla f(\frac{1}{2},\frac{1}{2})\rVert_\infty∥∇f(21,21)∥∞。注意调用norm函数时传递ord参数前者缺省,后者为numpy的inf。相仿地,第9、10行计算∥∇2f(12,12)∥2\lVert\nabla^2f(\frac{1}{2},\frac{1}{2})\rVert_2∥∇2f(21,21)∥2和∥∇2f(12,12)∥∞\lVert\nabla^2f(\frac{1}{2},\frac{1}{2})\rVert_\infty∥∇2f(21,21)∥∞。运行程序,输出
0.7071067811865476
0.5
5.830951894845301
5.0
其中0.7071067811865476是12\sqrt{\frac{1}{2}}21的近似值,5.830951894845301是34\sqrt{34}34的近似值。
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)