一维函数 f(x)=x2+1
代码示例
1 ''' 2 一维问题的梯度下降法实例 3 ''' 4 5 def func_1d(x): 6 """ 7 目标函数 8 :param x: 自变量,标量 9 :return: 因变量,标量 10 """ 11 return x ** 2 + 1 12 13 14 def grad_1d(x): 15 """ 16 目标函数的梯度 17 :param x: 自变量,标量 18 :return: 因变量,标量 19 """ 20 return x * 2 21 22 def gradient_descent_1d(grad, cur_x=0.1, lr=0.01,precision=0.0001,max_iters=10000): 23 """ 24 一维问题的梯度下降法 25 :param grad: 目标函数的梯度 26 :param cur_x: 当前 x 值,通过参数可以提供初始值 27 :param lr: 学习率,也相当于设置的步长 28 :param precision: 设置收敛精度 29 :param max_iters: 最大迭代次数 30 :return: 局部最小值 x* 31 """ 32 for i in range(max_iters): 33 grad_cur = grad(cur_x) 34 if abs(grad_cur) < precision: 35 break 36 cur_x = cur_x - grad_cur * lr #更新参数 37 print("第", i, "次迭代: x 值为 ", cur_x) 38 39 print("局部最小值 x =",cur_x) 40 return cur_x 41 42 43 if __name__ == '__main__': 44 gradient_descent_1d(grad_1d, cur_x=10, lr=0.2, precision=0.0000000001, max_iters=10000)
第 0 次迭代: x 值为 6.0 第 1 次迭代: x 值为 3.5999999999999996 第 2 次迭代: x 值为 2.1599999999999997 第 3 次迭代: x 值为 1.2959999999999998 第 4 次迭代: x 值为 0.7775999999999998 第 5 次迭代: x 值为 0.46655999999999986 第 6 次迭代: x 值为 0.2799359999999999 第 7 次迭代: x 值为 0.16796159999999993 第 8 次迭代: x 值为 0.10077695999999996 第 9 次迭代: x 值为 0.06046617599999997 第 10 次迭代: x 值为 0.036279705599999976 第 11 次迭代: x 值为 0.021767823359999987 第 12 次迭代: x 值为 0.013060694015999992 第 13 次迭代: x 值为 0.007836416409599995 第 14 次迭代: x 值为 0.004701849845759997 第 15 次迭代: x 值为 0.002821109907455998 第 16 次迭代: x 值为 0.0016926659444735988 第 17 次迭代: x 值为 0.0010155995666841593 第 18 次迭代: x 值为 0.0006093597400104956 第 19 次迭代: x 值为 0.0003656158440062973 第 20 次迭代: x 值为 0.0002193695064037784 第 21 次迭代: x 值为 0.00013162170384226703 第 22 次迭代: x 值为 7.897302230536021e-05 第 23 次迭代: x 值为 4.7383813383216124e-05 第 24 次迭代: x 值为 2.8430288029929674e-05 第 25 次迭代: x 值为 1.7058172817957805e-05 第 26 次迭代: x 值为 1.0234903690774682e-05 第 27 次迭代: x 值为 6.1409422144648085e-06 第 28 次迭代: x 值为 3.684565328678885e-06 第 29 次迭代: x 值为 2.210739197207331e-06 第 30 次迭代: x 值为 1.3264435183243986e-06 第 31 次迭代: x 值为 7.958661109946391e-07 第 32 次迭代: x 值为 4.775196665967835e-07 第 33 次迭代: x 值为 2.865117999580701e-07 第 34 次迭代: x 值为 1.7190707997484204e-07 第 35 次迭代: x 值为 1.0314424798490522e-07 第 36 次迭代: x 值为 6.188654879094313e-08 第 37 次迭代: x 值为 3.7131929274565874e-08 第 38 次迭代: x 值为 2.2279157564739522e-08 第 39 次迭代: x 值为 1.3367494538843712e-08 第 40 次迭代: x 值为 8.020496723306227e-09 第 41 次迭代: x 值为 4.8122980339837355e-09 第 42 次迭代: x 值为 2.887378820390241e-09 第 43 次迭代: x 值为 1.7324272922341446e-09 第 44 次迭代: x 值为 1.0394563753404867e-09 第 45 次迭代: x 值为 6.236738252042921e-10 第 46 次迭代: x 值为 3.742042951225752e-10 第 47 次迭代: x 值为 2.2452257707354512e-10 第 48 次迭代: x 值为 1.3471354624412707e-10 第 49 次迭代: x 值为 8.082812774647624e-11 第 50 次迭代: x 值为 4.849687664788574e-11 局部最小值 x = 4.849687664788574e-11
二维 f(x,y) = -e-(x^2+y^2)
代码示例:
1 """ 2 二维问题的梯度下降示例 3 """ 4 import math 5 import numpy as np 6 7 def func_2d(x): 8 """ 9 目标函数 10 :param x: 自变量,二维向量 11 :return: 因变量,标量 12 """ 13 return - math.exp(-(x[0] ** 2 + x[1] ** 2)) 14 15 def grad_2d(x): 16 """ 17 目标函数的梯度 18 :param x: 自变量,二维向量 19 :return: 因变量,二维向量 20 """ 21 deriv0 = 2 * x[0] * math.exp(-(x[0] ** 2 + x[1] ** 2)) 22 deriv1 = 2 * x[1] * math.exp(-(x[0] ** 2 + x[1] ** 2)) 23 24 return np.array([deriv0,deriv1]) 25 26 27 def gradient_descent_2d(grad, cur_x = np.array([0.1,0.1]), lr=0.01, precision=0.0001, max_iters=10000): 28 """ 29 二维问题的梯度下降 30 :param grad: 目标函数的梯度 31 :param cur_x: 当前 x 值,通过参数可以提供初始值 32 :param lr: 学习率,也相当于设置的步长 33 :param precision: 设置收敛精度 34 :param max_iters: 最大迭代次数 35 :return: 局部最小值 x* 36 """ 37 print(f"{cur_x} 作为初始值开始迭代...") 38 for i in range(max_iters): 39 grad_cur = grad(cur_x) 40 if np.linalg.norm(grad_cur,ord=2) < precision: 41 break #当梯度趋近为 0 时,视为收敛 42 cur_x = cur_x - grad_cur * lr 43 print("第", i, "次迭代:x 值为 ", cur_x) 44 45 print("局部最小值 x = ", cur_x) 46 47 48 if __name__ == '__main__': 49 gradient_descent_2d(grad_2d, cur_x=np.array([1, -1]), lr=0.2, precision=0.000001, max_iters=10000)
[ 1 -1] 作为初始值开始迭代... 第 0 次迭代:x 值为 [ 0.94586589 -0.94586589] 第 1 次迭代:x 值为 [ 0.88265443 -0.88265443] 第 2 次迭代:x 值为 [ 0.80832661 -0.80832661] 第 3 次迭代:x 值为 [ 0.72080448 -0.72080448] 第 4 次迭代:x 值为 [ 0.61880589 -0.61880589] 第 5 次迭代:x 值为 [ 0.50372222 -0.50372222] 第 6 次迭代:x 值为 [ 0.3824228 -0.3824228] 第 7 次迭代:x 值为 [ 0.26824673 -0.26824673] 第 8 次迭代:x 值为 [ 0.17532999 -0.17532999] 第 9 次迭代:x 值为 [ 0.10937992 -0.10937992] 第 10 次迭代:x 值为 [ 0.06666242 -0.06666242] 第 11 次迭代:x 值为 [ 0.04023339 -0.04023339] 第 12 次迭代:x 值为 [ 0.02419205 -0.02419205] 第 13 次迭代:x 值为 [ 0.01452655 -0.01452655] 第 14 次迭代:x 值为 [ 0.00871838 -0.00871838] 第 15 次迭代:x 值为 [ 0.00523156 -0.00523156] 第 16 次迭代:x 值为 [ 0.00313905 -0.00313905] 第 17 次迭代:x 值为 [ 0.00188346 -0.00188346] 第 18 次迭代:x 值为 [ 0.00113008 -0.00113008] 第 19 次迭代:x 值为 [ 0.00067805 -0.00067805] 第 20 次迭代:x 值为 [ 0.00040683 -0.00040683] 第 21 次迭代:x 值为 [ 0.0002441 -0.0002441] 第 22 次迭代:x 值为 [ 0.00014646 -0.00014646] 第 23 次迭代:x 值为 [ 8.78751305e-05 -8.78751305e-05] 第 24 次迭代:x 值为 [ 5.27250788e-05 -5.27250788e-05] 第 25 次迭代:x 值为 [ 3.16350474e-05 -3.16350474e-05] 第 26 次迭代:x 值为 [ 1.89810285e-05 -1.89810285e-05] 第 27 次迭代:x 值为 [ 1.13886171e-05 -1.13886171e-05] 第 28 次迭代:x 值为 [ 6.83317026e-06 -6.83317026e-06] 第 29 次迭代:x 值为 [ 4.09990215e-06 -4.09990215e-06] 第 30 次迭代:x 值为 [ 2.45994129e-06 -2.45994129e-06] 第 31 次迭代:x 值为 [ 1.47596478e-06 -1.47596478e-06] 第 32 次迭代:x 值为 [ 8.85578865e-07 -8.85578865e-07] 第 33 次迭代:x 值为 [ 5.31347319e-07 -5.31347319e-07] 第 34 次迭代:x 值为 [ 3.18808392e-07 -3.18808392e-07] 局部最小值 x = [ 3.18808392e-07 -3.18808392e-07]