最优化方法Python计算:向量和矩阵的范数

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= x1x2xn 计算范数
∥ x ∥ 2 = ∑ i = 1 n ∣ x i ∣ 2 \lVert\boldsymbol{x}\rVert_2=\sqrt{\sum_{i=1}^n|x_i|^2} x2=i=1nxi2
对矩阵 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= a11a21am1a12a22am2a1na2namn ,范数为
∥ 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}. A2=i=1mj=1naij2 .
其它类型范数读者可查阅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=1inmax{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=1immax{j=1naij}.
例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+x244x12x22,(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)=(4x138x1x224x238x12x2)
∇ 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)=(12x128x2216x1x216x1x212x228x12)
∇ 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)=(1441)。因此,
∥ ∇ 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 的近似值。
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值