实验目的
1、 理解等高线的几何含义、如何发现一个函数的最小解;
2、 掌握一门绘制函数图形的编程工具;
实验内容
给定下述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,其中 ,
x
=
(
x
1
,
x
2
)
T
∈
R
2
x=(x_1,x_2)^\mathrm{T} \in\mathbb{R}^2
x=(x1,x2)T∈R2 。试编写程序完成下述工作:
1) 为不同的a,b取值,绘制该函数的3D表面。请问 a,b取值对该表面形状有大的影响吗?,所谓大影响就是形状不再相似。对a,b的取值区间,能否大致给出一个分类,像下面这样给出一张表:
b ∈ ( − ∞ , 0 ) b\in(-\infty,0) b∈(−∞,0) | b = 0 b=0 b=0 | b ∈ ( 0 , + ∞ ) b\in(0,+\infty) b∈(0,+∞) |
---|---|---|
![]() | ![]() | ![]() |
from pylab import figure,show
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
def RosenBrock(a,b):
fig = figure()
delta = 0.5
ax = Axes3D(fig)
#生成x轴数据列表
x = np.arange(-100, 100, delta)
#生成y轴数据列表
y = np.arange(-100, 100, delta)
#执行网格化
X, Y = np.meshgrid(x, y)
Z = np.square(a-X) + b*np.square(Y - X**2)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='hot')
show()
return fig
#自动画图并保存
for j in range(0,101,10):
for k in range(0,101,10):
fig = RosenBrock(j,k)
fig.savefig("F:\\DataWhale\\8月组队学习\\集成学习\\ensemble-learning-main\\CH1-机器学习的数学基础\\CH1-机器学习的数学基础\\fig\\{0}_{1}.jpg".format(j,k))
2) 编写一个算法来找到它的全局最小值及相应的最小解,并在3D图中标出。分析一下你的算法时空效率、给出运行时间。
采用梯度下降法,但注意梯度爆炸容易导致数据溢出,代码如下:
import numpy as np
#import matplotlib as plt
from pylab import figure,show
from mpl_toolkits.mplot3d import Axes3D
import time
def RosenBrock(x, y ,a=1 ,b=1):
return np.square(a-x) + b*np.square(y - x**2)
def RosenBrock_Grad(x, y, a=1, b=1):
c = np.array([2 * (x - a) - 4 * b * x * (y - np.square(x)),
2 * b * (y - np.square(x))])
return c
def Gradient_Descent(x_init,alpha=0.001, epsilon=1e-6, max_iterations=100000):
x = x_init
print(1,x,RosenBrock_Grad(x[0],x[1]))
for i in range(max_iterations):
x = x - alpha * RosenBrock_Grad(x[0],x[1])
if np.linalg.norm(RosenBrock_Grad(x[0],x[1])) < epsilon:
return x, i + 1
return x, max_iterations
def RosenBrock_Plot():
#画rosenbrock
fig = figure()
delta =0.1
ax = Axes3D(fig)
x = np.arange(-20, 20, delta)
y = np.arange(-20, 20, delta)
X, Y = np.meshgrid(x, y)
Z = RosenBrock(X,Y)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='hot',alpha=0.3)
ax.set_xlabel('x1')
ax.set_ylabel('x2')
ax.set_zlabel('f')
#画最优值点
start_time = time.time()
x_init = np.zeros(2)
x_min, max_iterations = Gradient_Descent(x_init)
print("最小点:",x_min)
print("迭代次数:",max_iterations)
end_time = time.time()
running_time = end_time-start_time
print("优化的时间:%.5f秒!" % running_time)
ax.scatter(x_min[0],x_min[1],RosenBrock(x_min[0],x_min[1]),c='r')
show()
RosenBrock_Plot()
结果如下:
梯度下降法代码参考博客集成学习学习笔记——数学基础(1)