• 神经网络——手写简单的GD(一维和二维)


    一维函数   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.01 次迭代: x 值为  3.59999999999999962 次迭代: x 值为  2.15999999999999973 次迭代: x 值为  1.29599999999999984 次迭代: x 值为  0.77759999999999985 次迭代: x 值为  0.466559999999999866 次迭代: x 值为  0.27993599999999997 次迭代: x 值为  0.167961599999999938 次迭代: x 值为  0.100776959999999969 次迭代: x 值为  0.0604661759999999710 次迭代: x 值为  0.03627970559999997611 次迭代: x 值为  0.02176782335999998712 次迭代: x 值为  0.01306069401599999213 次迭代: x 值为  0.00783641640959999514 次迭代: x 值为  0.00470184984575999715 次迭代: x 值为  0.00282110990745599816 次迭代: x 值为  0.001692665944473598817 次迭代: x 值为  0.001015599566684159318 次迭代: x 值为  0.000609359740010495619 次迭代: x 值为  0.000365615844006297320 次迭代: x 值为  0.000219369506403778421 次迭代: x 值为  0.0001316217038422670322 次迭代: x 值为  7.897302230536021e-0523 次迭代: x 值为  4.7383813383216124e-0524 次迭代: x 值为  2.8430288029929674e-0525 次迭代: x 值为  1.7058172817957805e-0526 次迭代: x 值为  1.0234903690774682e-0527 次迭代: x 值为  6.1409422144648085e-0628 次迭代: x 值为  3.684565328678885e-0629 次迭代: x 值为  2.210739197207331e-0630 次迭代: x 值为  1.3264435183243986e-0631 次迭代: x 值为  7.958661109946391e-0732 次迭代: x 值为  4.775196665967835e-0733 次迭代: x 值为  2.865117999580701e-0734 次迭代: x 值为  1.7190707997484204e-0735 次迭代: x 值为  1.0314424798490522e-0736 次迭代: x 值为  6.188654879094313e-0837 次迭代: x 值为  3.7131929274565874e-0838 次迭代: x 值为  2.2279157564739522e-0839 次迭代: x 值为  1.3367494538843712e-0840 次迭代: x 值为  8.020496723306227e-0941 次迭代: x 值为  4.8122980339837355e-0942 次迭代: x 值为  2.887378820390241e-0943 次迭代: x 值为  1.7324272922341446e-0944 次迭代: x 值为  1.0394563753404867e-0945 次迭代: x 值为  6.236738252042921e-1046 次迭代: x 值为  3.742042951225752e-1047 次迭代: x 值为  2.2452257707354512e-1048 次迭代: x 值为  1.3471354624412707e-1049 次迭代: x 值为  8.082812774647624e-1150 次迭代: 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]

    原文链接:https://www.cnblogs.com/noluye/p/11108513.html 

  • 相关阅读:
    直接拿来用 九个超实用的PHP代码片段(二)
    微信开发值得推荐的开源项目
    PHP文件下载原理
    简化PHP开发的10个工具
    CI Weekly #1 | 这份周刊,带你了解 CI/CD 、DevOps、自动化测试
    fir.im Weekly
    fir.im Weekly
    fir.im Weekly
    用 flow.ci 让 Hexo 持续部署
    fir.im Weekly
  • 原文地址:https://www.cnblogs.com/cfancy/p/12658138.html
Copyright © 2020-2023  润新知