要求解的二阶函数是himmelblau
这个函数有四个最小值点是0,我们要使用梯度下降的方法去寻找这四个最小值点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
import numpy as np from mpl_toolkits.mplot3d import Axes3D from matplotlib import pyplot as plt import tensorflow as tf ### 将函数画出来开始 ### def himmelblau(x): return (x[0] ** 2 + x[1] - 11) ** 2 + (x[0] + x[1] ** 2 - 7) ** 2 x = np.arange(-6, 6, 0.1) y = np.arange(-6, 6, 0.1) print('x,y range:', x.shape, y.shape) X, Y = np.meshgrid(x, y) print('X,Y maps:', X.shape, Y.shape) Z = himmelblau([X, Y]) fig = plt.figure('himmelblau') ax = fig.gca(projection='3d') ax.plot_surface(X, Y, Z) ax.view_init(60, -30) ax.set_xlabel('x') ax.set_ylabel('y') plt.show() ### 将函数画出来结束 ### ## 求解开始 ## # [1., 0.], [-4, 0.], [4, 0.] x = tf.constant([4., 0.]) # 初始化开始搜索的点 for step in range(200): with tf.GradientTape() as tape: tape.watch([x]) y = himmelblau(x) grads = tape.gradient(y, [x])[0] x -= 0.01*grads if step % 20 == 0: print ('step {}: x = {}, f(x) = {}' .format(step, x.numpy(), y.numpy())) ## 求解结束 ## |
输出的函数图:
迭代结果:
可以看到迭代大约40次的时候就可以得到比较精确的结果呢,通过修改初始化的点我们可以发现梯度下降求解到这四个最小值的不同的点。