快速复习以下数学知识:
1.多元函数
(1)n维空间: 【元素+对应关系】
设 n n n 为取定的一个正整数,我们用 R n \mathbf{R}^{n} Rn 表示 n n n 元有序实数组 ( x 1 , x 2 , ⋯ , \left(x_{1}, x_{2}, \cdots,\right. (x1,x2,⋯, x n ) \left.x_{n}\right) xn) 的全体所构成的集合, 即
R n = R × R × ⋯ × R = { ( x 1 , x 2 , ⋯ , x n ) ∣ x i ∈ R , i = 1 , 2 , ⋯ , n } \mathbf{R}^{n}=\mathbf{R} \times \mathbf{R} \times \cdots \times \mathbf{R}=\left\{\left(x_{1}, x_{2}, \cdots, x_{n}\right) \mid x_{i} \in \mathbf{R}, i=1,2, \cdots, n\right\} Rn=R×R×⋯×R={(x1,x2,⋯,xn)∣xi∈R,i=1,2,⋯,n}
R n \mathbf{R}^{n} Rn 中的元素 ( x 1 , x 2 , ⋯ , x n ) \left(x_{1}, x_{2}, \cdots, x_{n}\right) (x1,x2,⋯,xn) 有时也用单个字母 x \boldsymbol{x} x 来表示, 即 x = ( x 1 , x 2 , ⋯ , \boldsymbol{x}=\left(x_{1}, x_{2}, \cdots,\right. x=(x1,x2,⋯, x n ) . \left.x_{n}\right) . xn). 当所有的 x i ( i = 1 , 2 , ⋯ , n ) x_{i}(i=1,2, \cdots, n) xi(i=1,2,⋯,n) 都为零时,称这样的元素为 R n \mathbf{R}^{n} Rn 中的零元,记为0或 O。
为了在集合 R n \mathbf{R}^{n} Rn 中的元索之间建立联系,在 R n \mathbf{R}^{n} Rn 中定义线代运算如下:
设 x = ( x 1 , x 2 , ⋯ , x n ) , y = ( y 1 , y 2 , ⋯ , y n ) x=\left(x_{1}, x_{2}, \cdots, x_{n}\right), y=\left(y_{1}, y_{2}, \cdots, y_{n}\right) x=(x1,x2,⋯,xn),y=(y1,y2,⋯,yn) 为 R n \mathbf{R}^{n} Rn 中任意两个元素 , λ ∈ R , \lambda \in \mathbf{R} ,λ∈R规定:
x + y = ( x 1 + y 1 , x 2 + y 2 , ⋯ , x n + y n ) , λ x = ( λ x 1 , λ x 2 , ⋯ , λ x n ) \begin{array}{l} x+y=\left(x_{1}+y_{1}, x_{2}+y_{2}, \cdots, x_{n}+y_{n}\right), \\ \lambda x=\left(\lambda x_{1}, \lambda x_{2}, \cdots, \lambda x_{n}\right) \end{array} x+y=(x1+y1,x2+y2,⋯,xn+yn),λx=(λx1,λx2,⋯,λxn)
这样定义了线性运算的集合 R n \mathbf{R}^{n} Rn 称为 n n n 维空间.
R n \mathbf{R}^{n} Rn 中点 x = ( x 1 , x 2 , ⋯ , x n ) \boldsymbol{x}=\left(x_{1}, x_{2}, \cdots, x_{n}\right) x=(x1,x2,⋯,xn) 和点 y = ( y 1 , y 2 , ⋯ , y n ) \boldsymbol{y}=\left(y_{1}, y_{2}, \cdots, y_{n}\right) y=(y1,y2,⋯,yn) 间的距离, 记作 ρ ( x , y ) , \rho(x, y), ρ(x,y), 规定
ρ ( x , y ) = ( x 1 − y 1 ) 2 + ( x 2 − y 2 ) 2 + ⋯ + ( x n − y n ) 2 \rho(x, y)=\sqrt{\left(x_{1}-y_{1}\right)^{2}+\left(x_{2}-y_{2}\right)^{2}+\cdots+\left(x_{n}-y_{n}\right)^{2}} ρ(x,y)=(x1−y1)2+(x2−y2)2+⋯+(xn−yn)2
(3)梯度向量
梯度方向是函数增大最快的方向,负梯度方向是函数减小最快的方向。
梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。
定义:设二元函数 z = f ( x , y ) z=f(x, y) z=f(x,y) 在平面区域D上具有一阶连续偏导数,则对于每一个点P(x, y)都可定出一个向量 { ∂ f ∂ x , ∂ f ∂ y } = f x ( x , y ) i ˉ + f y ( x , y ) j ˉ , \left\{\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}\right\}=f_{x}(x, y) \bar{i}+f_{y}(x, y) \bar{j}, {∂x∂f,∂y∂f}=fx(x,y)iˉ+fy(x,y)jˉ, 该函数就称为函数 z = f ( x , y ) z=f(x, y) z=f(x,y) 在点P ( x , y ) (\mathrm{x}, \mathrm{y}) (x,y) 的梯度,记作gradf ( x , y ) (\mathrm{x}, \mathrm{y}) (x,y) 或 ∇ f ( x , y ) \nabla f(x, y) ∇f(x,y),即有:
gradf ( x , y ) = ∇ f ( x , y ) = { ∂ f ∂ x , ∂ f ∂ y } = f x ( x , y ) i ˉ + f y ( x , y ) j ˉ \operatorname{gradf}(\mathrm{x}, \mathrm{y})=\nabla f(x, y)=\left\{\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}\right\}=f_{x}(x, y) \bar{i}+f_{y}(x, y) \bar{j} gradf(x,y)=∇f(x,y)={∂x∂f,∂y∂f}=fx(x,y)iˉ+fy(x,y)jˉ
其中 ∇ = ∂ ∂ x i ˉ + ∂ ∂ y j ˉ \nabla=\frac{\partial}{\partial x} \bar{i}+\frac{\partial}{\partial y} \bar{j} ∇=∂x∂iˉ+∂y∂jˉ 称为(二维的)向量微分算子或Nabla算子, ∇ f = ∂ f ∂ x i ˉ + ∂ f ∂ y j ˉ \nabla f=\frac{\partial f}{\partial x} \bar{i}+\frac{\partial f}{\partial y} \bar{j} ∇f=∂x∂fiˉ+∂y∂fjˉ 。
(4)雅克比矩阵(Jacobian矩阵)
假设 F : R n → R m F: \mathbb{R}_{n} \rightarrow \mathbb{R}_{m} F:Rn→Rm 是一个从n维欧氏空间映射到到m维欧氏空间的函数。
这个函数由m个实函数组成:
y 1 ( x 1 , ⋯ , x n ) , ⋯ , y m ( x 1 , ⋯ , x n ) y_{1}\left(x_{1}, \cdots, x_{n}\right), \cdots, y_{m}\left(x_{1}, \cdots, x_{n}\right) y1(x1,⋯,xn),⋯,ym(x1,⋯,xn) 。这些函数的偏导数(如果存在)可以组成一个m行n列的矩阵,这个矩阵就是所谓的雅可 比矩阵:
[ ∂ y 1 ∂ x 1 ⋯ ∂ y 1 ∂ x n ⋮ ⋱ ⋮ ∂ y m ∂ x 1 ⋯ ∂ y m ∂ x n ] \left[\begin{array}{ccc} \frac{\partial y_{1}}{\partial x_{1}} & \cdots & \frac{\partial y_{1}}{\partial x_{n}} \\ \vdots & \ddots & \vdots \\ \frac{\partial y_{m}}{\partial x_{1}} & \cdots & \frac{\partial y_{m}}{\partial x_{n}} \end{array}\right] ⎣⎢⎡∂x1∂y1⋮∂x1∂ym⋯⋱⋯∂xn∂y1⋮∂xn∂ym⎦⎥⎤
(5)海森矩阵(Hessian matrix)
在数学中,海森矩阵(Hessian matrix 或 Hessian)是一个自变量为向量的实值函数的二阶偏导数组成的方块矩阵,假設有一实数函数
f ( x 1 , x 2 , … , x n ) f\left(x_{1}, x_{2}, \ldots, x_{n}\right) f(x1,x2,…,xn)
如果 f f f 所有的二阶偏导数都存在,那么 f f f 的海森矩阵的第 i j i j ij 项,即:
H ( f ) i j ( x ) = D i D j f ( x ) H(f)_{i j}(x)=D_{i} D_{j} f(x) H(f)ij(x)=DiDjf(x)
其中 x = ( x 1 , x 2 , … , x n ) , x=\left(x_{1}, x_{2}, \ldots, x_{n}\right), x=(x1,x2,…,xn), 即
H ( f ) = [ ∂ 2 f ∂ x 1 2 ∂ 2 f ∂ x 1 ∂ x 2 ⋯ ∂ 2 f ∂ x 1 ∂ x n ∂ 2 f ∂ x 2 ∂ x 1 ∂ 2 f ∂ x 2 2 ⋯ ∂ 2 f ∂ x 2 ∂ x n ⋮ ⋮ ⋱ ⋮ ∂ 2 f ∂ x n ∂ x 1 ∂ 2 f ∂ x n ∂ x 2 ⋯ ∂ 2 f ∂ x n 2 ] H(f)=\left[\begin{array}{cccc} \frac{\partial^{2} f}{\partial x_{1}^{2}} & \frac{\partial^{2} f}{\partial x_{1} \partial x_{2}} & \cdots & \frac{\partial^{2} f}{\partial x_{1} \partial x_{n}} \\ \frac{\partial^{2} f}{\partial x_{2} \partial x_{1}} & \frac{\partial^{2} f}{\partial x_{2}^{2}} & \cdots & \frac{\partial^{2} f}{\partial x_{2} \partial x_{n}} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial^{2} f}{\partial x_{n} \partial x_{1}} & \frac{\partial^{2} f}{\partial x_{n} \partial x_{2}} & \cdots & \frac{\partial^{2} f}{\partial x_{n}^{2}} \end{array}\right] H(f)=⎣⎢⎢⎢⎢⎢⎡∂x12∂2f∂x2∂x1∂2f⋮∂xn∂x1∂2f∂x1∂x2∂2f∂x22∂2f⋮∂xn∂x2∂2f⋯⋯⋱⋯∂x1∂xn∂2f∂x2∂xn∂2f⋮∂xn2∂2f⎦⎥⎥⎥⎥⎥⎤
实际上,Hessian矩阵是梯度向量g(x)对自变量x的Jacobian矩阵。
(1)向量空间
引出:线性方程组中n个m维向量的集合
(2)向量及其内积
【由二维空间引出】
向量内积(点积):结果是一个实数。
import numpy
#a=array([a1,a2,⋯,an])
#用代码表示两向量a⃗,b⃗的内积
c=dot(numpy.transpose(a),b)
#或
c=dot(a.T,b)
线性相关与线性无关:
向量的秩:极大线性无关组数量
Schmidt正交化:线性无关的向量->正交向量
(3)范数
向量映射为一个实数。向量的长度。
(4)矩阵
一个矩阵代表一个变换。
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
def plot3d(a,b):
x1 = np.linspace(-5, 5, 100)
x2 = np.linspace(-5, 5, 100)
x1, x2 = np.meshgrid(x1, x2)
y = (a - x1) ** 2 + b * (x2 - x1**2) ** 2
fig = plt.figure(figsize=(9,6))
ax = fig.gca(projection='3d')
surf = ax.plot_surface(x1, x2, y, rstride=2, cstride=2, cmap=plt.cm.coolwarm, linewidth=0.5, antialiased=True)
ax.set_xlabel('x1')
ax.set_ylabel('x2')
ax.set_zlabel('y')
for a in range(-2,3):
for b in range(-2,3):
plot3d(a,b)
plt.title("Rosenbrock(a = {},b = {})".format(a,b))
plt.show()
改变a,b取值观察可得,
b<0时,函数形状类似:
b=0时,函数形状:
a<0
a>0
b>0时,函数形状:
而a的取值对函数形状影响不大。
(2)求全局最小值
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
def func(x1,x2):
a = 1
b = 0
y = (a - x1) ** 2 + b * (x2 - x1**2) ** 2
return y
def Px1func(x1,x2): #x1偏导
return 2*(1-x1) - 2*(x2 - x1**2)*2*x1
def Px2func(x1,x2): #x2偏导
return 2*(x2 - x1**2)
def plot3d(a,b):
x1 = np.linspace(-3, 3, 50)
x2 = np.linspace(-3, 3, 50)
x1, x2 = np.meshgrid(x1, x2)
y = (a - x1) ** 2 + b * (x2 - x1**2) ** 2
fig = plt.figure(figsize=(9,6))
ax = fig.gca(projection='3d')
surf = ax.plot_surface(x1, x2, y, rstride=2, cstride=2, cmap=plt.cm.coolwarm, linewidth=0.5, antialiased=True)
ax.set_xlabel('x1')
ax.set_ylabel('x2')
ax.set_zlabel('y')
return ax
# 梯度下降法
step = 0.0001
#初始点
x10 = 2
x20 = 1
tag_x1 = [x10]
tag_x2 = [x20]
tag_y = [func(x10,x20)] #绘制点
new_x1 = x10
new_x2 = x20
flag = False
while not flag:
new_x1 -= step*Px1func(x10,x20)
new_x2 -= step*Px2func(x10,x20) #分别作梯度下降
if func(x10,x20) - func(new_x1,new_x2) < 1e-10: #精度
flag = True
x10 = new_x1
x20 = new_x2 #更新点
tag_x1.append(x10)
tag_x2.append(x20)
tag_y.append(func(x10,x20))
#绘制点/输出坐标
#初始
ax = plot3d(1,0)
ax.plot(tag_x1,tag_x2,tag_y,'r.')
plt.title('(x1,x2,y)~('+str(x10)+","+str(x20)+","+str(func(x10,x20))+')')
plt.show()