知识要点总结
高等数学:比较重要的是求导运算,由此引出梯度、海塞矩阵等高维空间的推广,这些是数学优化的重要基础,包括其中的梯度下降法、牛顿法、拟牛顿法、镜像梯度法等常用算法都会设计到这部分运算。另外一个比较重要的部分是极限,包括数列极限和函数极限,与此相关的还有级数和广义积分,这些知识在分析算法收敛性时至关重要,同时广泛应用在概率论的一些基本定理的证明,尤其是数字特征、极限定理、大数定律这些相关的知识。
线性代数:比较重要的是矩阵的基本运算以及特征值相关的知识,矩阵作为一种表达高维空间的重要“语言”,通常给问题求解带来很大便利。
概率论:比较重要的是常见分布的性质以及各类数字特征的性质,而大数定律和中心极限定理则构成数理统计的基石,时变随机变量又产生随机过程这个研究领域。
作业提交
给定下述Rosenbrock函数, f ( x ) = ( a − x 1 ) 2 + b ( x 2 − x 1 2 ) 2 f(x)=(a-x_1 )^2+b(x_2-x_1^2 )^2 f(x)=(a−x1)2+b(x2−x12)2。试编写程序完成下述工作:
问题1
为不同的a,b取值,绘制该函数的3D表面。请问 a,b取值对该表面形状有大的影响吗?所谓大影响就是形状不再相似。
解:画图函数代码如下:
# Make data.
X = np.arange(-10, 10, 0.25)
Y = np.arange(-10, 10, 0.25)
X, Y = np.meshgrid(X, Y)
a=-2
b=-2
Z=(a-X)**2+b*(Y-X**2)**2
fig = plt.figure(figsize=(5,5))
ax = fig.gca(projection='3d')
# Plot the surface.
surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm,
linewidth=0, antialiased=False)
# Customize the z axis.
# ax.set_zlim(-300, 700)
ax.zaxis.set_major_locator(LinearLocator(10))
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))
# Add a color bar which maps values to colors.
fig.colorbar(surf, shrink=0.5, aspect=5)
plt.show()
绘制结果:(a=-2 b=-2)
下面我们研究
a
a
a和
b
b
b对图像形状的影响,分别设置
a
=
−
1
,
0
,
1
a=-1,0,1
a=−1,0,1以及
b
=
−
1
,
0
,
1
b=-1,0,1
b=−1,0,1,我们发现
a
a
a的符号不会对图像形状产生明显影响,而
b
b
b的符号影响较大,会使图像的开口方向发生改变。具体来说,
b
<
0
b<0
b<0时曲面开口向下,
b
≥
0
b\ge0
b≥0时曲面开口向上。这里展示
b
=
−
1
,
0
,
1
b=-1,0,1
b=−1,0,1的三幅图像:
结果1:(a=-1 b=-1)
结果2:(a=-1 b=0)
结果3:(a=-1 b=1)
问题2
编写一个算法来找到它的全局最小值及相应的最小解,并在3D图中标出。分析一下你的算法时空效率、给出运行时间。
解:由(1)中得出结论可知:只有当
b
≥
0
b\ge0
b≥0时,函数形状开口向上,才能得出最小解。这里我们设置
a
=
b
=
2
a=b=2
a=b=2,使用梯度下降法进行求解,并且使用呈
O
(
1
/
t
)
O(1/\sqrt{t})
O(1/t)衰减的步长。
主要代码如下:
# 目标函数
def fun (X,a,b):
z= (a-X[0])**2+b*(X[1]-X[0]**2)**2
return z
# 计算梯度
def grad(X,a,b):
dx = -2*(a-X[0])+2*b*(X[0]-X[1]**2)
dy = -4*b*X[1]*(X[0]-X[1]**2)
return np.array([dx,dy])
# 梯度下降法
def gradient_descent(X,a,b,max_iters=1000,learning_rate=0.1, precision=0.001):
for i in range(max_iters):
grad_now= grad(X,a,b)
#print(grad_now)
if np.linalg.norm(grad_now, ord=2) < precision:
break
X = X-learning_rate/np.sqrt(i+1)*grad_now
#print(X)
return(X,fun(X,a,b))
这里我们设置max_iters= 100000 100000 100000,learning_rate= 0.01 0.01 0.01,解得最优解 X = [ 2.00001588 , 1.41421951 ] X=[2.00001588, 1.41421951] X=[2.00001588,1.41421951],最优函数值为 13.373178698313575 13.373178698313575 13.373178698313575。梯度下降法对于凸函数可以在多项式时间内求得全局最优解。