梯度下降python实现

# 梯度下降 == 导数值下降
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

resultList = []
def targetFunc(xs):
    return (xs[0]-100)**2 + xs[1]+3

def gradientFunc(xs):
    print('当前的斜率')
    print(np.array([2*xs[0]-200,1]))
    return np.array([2*xs[0]-200,1])



def gradientCal(xs, targetFunc, gradientFunc, rating=0.1, tolent=0.000000001, times = 500000):
    '''
    :param xs: 猜测的点
    :param targetFunc: 目标函数
    :param gradientFunc: 梯度函数
    :param rating: 步进系数
    :param tolent: 收敛条件
    :return: 返回极值点x值
    '''
    result = targetFunc(xs)           # 计算出initX这个点的实际值
    gradientResult = gradientFunc(xs) # 计算出initX这个点的导数,也是斜率,梯度
    resultList.append(xs)
    newXs = xs - rating*gradientFunc(xs)
    newResult = targetFunc(newXs)
    reResult = np.abs(result - newResult)
    t = 0
    while reResult > tolent and t < times:
        t += 1
        xs = newXs
        result = newResult
        resultList.append(xs)
        newXs = np.array([temp - rating * gradientFunc(xs)[i] if temp > tolent else temp  for temp,i in zip(newXs, range(len(newXs))) ])
        newResult = targetFunc(newXs)
        reResult = np.sum(np.abs(result - newResult))
        print(reResult)
        pass

    return xs

listXs = np.array([1000,10])

print(gradientCal(listXs, targetFunc, gradientFunc))
xs, ys = np.meshgrid(np.linspace(-1000,1000,1001), np.linspace(-1000,1000,1001))
z = targetFunc([xs, ys])
print(z)
ax = plt.gca(projection='3d')
ax.plot_surface(xs,ys,z)
plt.show()

运行结果如下


当前的斜率
[1800    1]
当前的斜率
[1800    1]
当前的斜率
[1.44e+03 1.00e+00]
当前的斜率
[1.44e+03 1.00e+00]
186624.10000000003
当前的斜率
[1.152e+03 1.000e+00]
当前的斜率
[1.152e+03 1.000e+00]
119439.46000000002
当前的斜率
[921.6   1. ]
当前的斜率
[921.6   1. ]
76441.29039999997
当前的斜率
[737.28   1.  ]
当前的斜率
[737.28   1.  ]
48922.46185600001
当前的斜率
[589.824   1.   ]
当前的斜率
[589.824   1.   ]
31310.41158783999
当前的斜率
[471.8592   1.    ]
当前的斜率
[471.8592   1.    ]
20038.699416217605
当前的斜率
[377.48736   1.     ]
当前的斜率
[377.48736   1.     ]
12824.803626379264
当前的斜率
[301.989888   1.      ]
当前的斜率
[301.989888   1.      ]
8207.910320882727
当前的斜率
[241.5919104   1.       ]
当前的斜率
[241.5919104   1.       ]
5253.098605364947
当前的斜率
[193.27352832   1.        ]
当前的斜率
[193.27352832   1.        ]
3362.0191074335653
当前的斜率
[154.61882266   1.        ]
当前的斜率
[154.61882266   1.        ]
2151.7282287574803
当前的斜率
[123.69505812   1.        ]
当前的斜率
[123.69505812   1.        ]
1377.1420664047873
当前的斜率
[98.9560465  1.       ]
当前的斜率
[98.9560465  1.       ]
881.406922499064
当前的斜率
[79.1648372  1.       ]
当前的斜率
[79.1648372  1.       ]
564.1364303994022
当前的斜率
[63.33186976  1.        ]
当前的斜率
[63.33186976  1.        ]
361.0833154556169
当前的斜率
[50.66549581  1.        ]
当前的斜率
[50.66549581  1.        ]
231.12932189159437
当前的斜率
[40.53239665  1.        ]
当前的斜率
[40.53239665  1.        ]
147.95876601062088
当前的斜率
[32.42591732  1.        ]
当前的斜率
[32.42591732  1.        ]
94.72961024679705
当前的斜率
[25.94073385  1.        ]
当前的斜率
[25.94073385  1.        ]
60.66295055795021
当前的斜率
[20.75258708  1.        ]
当前的斜率
[20.75258708  1.        ]
38.86028835708812
当前的斜率
[16.60206967  1.        ]
当前的斜率
[16.60206967  1.        ]
24.906584548536486
当前的斜率
[13.28165573  1.        ]
当前的斜率
[13.28165573  1.        ]
15.9762141110633
当前的斜率
[10.62532459  1.        ]
当前的斜率
[10.62532459  1.        ]
10.260777031080433
当前的斜率
[8.50025967 1.        ]
当前的斜率
[8.50025967 1.        ]
6.602897299891506
当前的斜率
[6.80020774 1.        ]
当前的斜率
[6.80020774 1.        ]
4.261854271930584
当前的斜率
[5.44016619 1.        ]
当前的斜率
[5.44016619 1.        ]
2.7635867340355986
当前的斜率
[4.35213295 1.        ]
当前的斜率
[4.35213295 1.        ]
1.8046955097827375
当前的斜率
[3.48170636 1.        ]
当前的斜率
[3.48170636 1.        ]
1.191005126260988
当前的斜率
[2.78536509 1.        ]
当前的斜率
[2.78536509 1.        ]
0.7982432808070161
当前的斜率
[2.22829207 1.        ]
当前的斜率
[2.22829207 1.        ]
0.5468756997164963
当前的斜率
[1.78263366 1.        ]
当前的斜率
[1.78263366 1.        ]
0.38600044781854237
当前的斜率
[1.42610693 1.        ]
当前的斜率
[1.42610693 1.        ]
0.2830402866038799
当前的斜率
[1.14088554 1.        ]
当前的斜率
[1.14088554 1.        ]
0.2171457834264796
当前的斜率
[0.91270843 1.        ]
当前的斜率
[0.91270843 1.        ]
0.1749733013929493
当前的斜率
[0.73016675 1.        ]
当前的斜率
[0.73016675 1.        ]
0.14798291289148224
当前的斜率
[0.5841334 1.       ]
当前的斜率
[0.5841334 1.       ]
0.1307090642505493
当前的斜率
[0.46730672 1.        ]
当前的斜率
[0.46730672 1.        ]
0.1196538011203554
当前的斜率
[0.37384537 1.        ]
当前的斜率
[0.37384537 1.        ]
0.11257843271702761
当前的斜率
[0.2990763 1.       ]
当前的斜率
[0.2990763 1.       ]
0.10805019693889406
当前的斜率
[0.23926104 1.        ]
当前的斜率
[0.23926104 1.        ]
0.10515212604089186
当前的斜率
[0.19140883 1.        ]
当前的斜率
[0.19140883 1.        ]
0.10329736066617201
当前的斜率
[0.15312707 1.        ]
当前的斜率
[0.15312707 1.        ]
0.10211031082634747
当前的斜率
[0.12250165 1.        ]
当前的斜率
[0.12250165 1.        ]
0.10135059892886389
当前的斜率
[0.09800132 1.        ]
当前的斜率
[0.09800132 1.        ]
0.10086438331447489
当前的斜率
[0.07840106 1.        ]
当前的斜率
[0.07840106 1.        ]
0.10055320532126188
当前的斜率
[0.06272085 1.        ]
当前的斜率
[0.06272085 1.        ]
0.10035405140560805
当前的斜率
[0.05017668 1.        ]
当前的斜率
[0.05017668 1.        ]
0.10022659289958824
当前的斜率
[0.04014134 1.        ]
当前的斜率
[0.04014134 1.        ]
0.10014501945573784
当前的斜率
[0.03211307 1.        ]
当前的斜率
[0.03211307 1.        ]
0.10009281245167045
当前的斜率
[0.02569046 1.        ]
当前的斜率
[0.02569046 1.        ]
0.1000593999690702
当前的斜率
[0.02055237 1.        ]
当前的斜率
[0.02055237 1.        ]
0.10003801598020434
当前的斜率
[0.01644189 1.        ]
当前的斜率
[0.01644189 1.        ]
0.10002433022733115
当前的斜率
[0.01315351 1.        ]
当前的斜率
[0.01315351 1.        ]
0.10001557134549088
当前的斜率
[0.01052281 1.        ]
当前的斜率
[0.01052281 1.        ]
0.10000996566111464
当前的斜率
[0.00841825 1.        ]
当前的斜率
[0.00841825 1.        ]
0.10000637802311285
当前的斜率
[0.0067346 1.       ]
当前的斜率
[0.0067346 1.       ]
0.10000408193479249
当前的斜率
[0.00538768 1.        ]
当前的斜率
[0.00538768 1.        ]
0.10000261243826714
当前的斜率
[0.00431014 1.        ]
当前的斜率
[0.00431014 1.        ]
0.10000167196049059
当前的斜率
[0.00344811 1.        ]
当前的斜率
[0.00344811 1.        ]
0.10000107005471381
当前的斜率
[0.00275849 1.        ]
当前的斜率
[0.00275849 1.        ]
0.10000068483501767
当前的斜率
[0.00220679 1.        ]
当前的斜率
[0.00220679 1.        ]
0.10000043829441019
当前的斜率
[0.00176543 1.        ]
当前的斜率
[0.00176543 1.        ]
0.10000028050842324
当前的斜率
[0.00141235 1.        ]
当前的斜率
[0.00141235 1.        ]
0.10000017952539153
当前的斜率
[0.00112988 1.        ]
当前的斜率
[0.00112988 1.        ]
0.10000011489625038
当前的斜率
[9.0390265e-04 1.0000000e+00]
当前的斜率
[9.0390265e-04 1.0000000e+00]
0.10000007353360019
当前的斜率
[7.2312212e-04 1.0000000e+00]
当前的斜率
[7.2312212e-04 1.0000000e+00]
0.10000004706150367
当前的斜率
[5.78497696e-04 1.00000000e+00]
当前的斜率
[5.78497696e-04 1.00000000e+00]
0.10000003011936265
当前的斜率
[4.62798157e-04 1.00000000e+00]
当前的斜率
[4.62798157e-04 1.00000000e+00]
0.10000001927639257
当前的斜率
[3.70238525e-04 1.00000000e+00]
当前的斜率
[3.70238525e-04 1.00000000e+00]
0.10000001233689026
当前的斜率
[2.9619082e-04 1.0000000e+00]
当前的斜率
[2.9619082e-04 1.0000000e+00]
0.10000000789561092
当前的斜率
[2.36952656e-04 1.00000000e+00]
当前的斜率
[2.36952656e-04 1.00000000e+00]
0.10000000505318951
当前的斜率
[1.89562125e-04 1.00000000e+00]
当前的斜率
[1.89562125e-04 1.00000000e+00]
0.10000000323404201
当前的斜率
[1.516497e-04 1.000000e+00]
当前的斜率
[1.516497e-04 1.000000e+00]
0.10000000206978754
当前的斜率
[1.2131976e-04 1.0000000e+00]
当前的斜率
[1.2131976e-04 1.0000000e+00]
0.10000000132466358
当前的斜率
[9.7055808e-05 1.0000000e+00]
当前的斜率
[9.7055808e-05 1.0000000e+00]
0.1000000008477846
当前的斜率
[7.76446464e-05 1.00000000e+00]
当前的斜率
[7.76446464e-05 1.00000000e+00]
0.10000000054258251
当前的斜率
[6.21157171e-05 1.00000000e+00]
当前的斜率
[6.21157171e-05 1.00000000e+00]
0.10000000034725254
当前的斜率
[4.96925737e-05 1.00000000e+00]
当前的斜率
[4.96925737e-05 1.00000000e+00]
0.10000000022224143
当前的斜率
[3.97540589e-05 1.00000000e+00]
当前的斜率
[3.97540589e-05 1.00000000e+00]
0.1000000001422352
当前的斜率
[3.18032472e-05 1.00000000e+00]
当前的斜率
[3.18032472e-05 1.00000000e+00]
0.10000000009102994
当前的斜率
[2.54425977e-05 1.00000000e+00]
当前的斜率
[2.54425977e-05 1.00000000e+00]
0.10000000005825971
当前的斜率
[2.03540782e-05 1.00000000e+00]
当前的斜率
[2.03540782e-05 1.00000000e+00]
0.10000000003728626
当前的斜率
[1.62832626e-05 1.00000000e+00]
当前的斜率
[1.62832626e-05 1.00000000e+00]
0.10000000002386322
当前的斜率
[1.302661e-05 1.000000e+00]
当前的斜率
[1.302661e-05 1.000000e+00]
0.10000000001527276
当前的斜率
[1.0421288e-05 1.0000000e+00]
当前的斜率
[1.0421288e-05 1.0000000e+00]
0.10000000000977405
当前的斜率
[8.33703044e-06 1.00000000e+00]
当前的斜率
[8.33703044e-06 1.00000000e+00]
0.10000000000625509
当前的斜率
[6.66962436e-06 1.00000000e+00]
当前的斜率
[6.66962436e-06 1.00000000e+00]
0.10000000000400355
当前的斜率
[5.33569948e-06 1.00000000e+00]
当前的斜率
[5.33569948e-06 1.00000000e+00]
0.10000000000256293
当前的斜率
[4.26855959e-06 1.00000000e+00]
当前的斜率
[4.26855959e-06 1.00000000e+00]
0.10000000000164011
当前的斜率
[3.41484767e-06 1.00000000e+00]
当前的斜率
[3.41484767e-06 1.00000000e+00]
0.10000000000104903
当前的斜率
[2.73187814e-06 1.00000000e+00]
当前的斜率
[2.73187814e-06 1.00000000e+00]
0.10000000000067155
当前的斜率
[2.18550252e-06 1.00000000e+00]
当前的斜率
[2.18550252e-06 1.00000000e+00]
0.10000000000042997
当前的斜率
[1.74840201e-06 1.00000000e+00]
当前的斜率
[1.74840201e-06 1.00000000e+00]
0.10000000000027542
当前的斜率
[1.39872162e-06 1.00000000e+00]
当前的斜率
[1.39872162e-06 1.00000000e+00]
0.10000000000017595
当前的斜率
[1.11897731e-06 1.00000000e+00]
当前的斜率
[1.11897731e-06 1.00000000e+00]
0.10000000000011244
当前的斜率
[8.95181842e-07 1.00000000e+00]
当前的斜率
[8.95181842e-07 1.00000000e+00]
0.10000000000007203
当前的斜率
[7.16145479e-07 1.00000000e+00]
当前的斜率
[7.16145479e-07 1.00000000e+00]
0.10000000000004627
当前的斜率
[5.72916377e-07 1.00000000e+00]
当前的斜率
[5.72916377e-07 1.00000000e+00]
0.10000000000002984
当前的斜率
[4.58333091e-07 1.00000000e+00]
当前的斜率
[4.58333091e-07 1.00000000e+00]
0.10000000000001874
当前的斜率
[3.66666484e-07 1.00000000e+00]
1.199040866595169e-14
[1.00000000e+02 1.87905247e-14]
[[10203.       10202.596004 10202.192016 ...  9803.792016  9803.396004
   9803.      ]
 [10203.002    10202.598004 10202.194016 ...  9803.794016  9803.398004
   9803.002   ]
 [10203.004    10202.600004 10202.196016 ...  9803.796016  9803.400004
   9803.004   ]
 ...
 [10204.996    10204.592004 10204.188016 ...  9805.788016  9805.392004
   9804.996   ]
 [10204.998    10204.594004 10204.190016 ...  9805.790016  9805.394004
   9804.998   ]
 [10205.       10204.596004 10204.192016 ...  9805.792016  9805.396004
   9805.      ]]

Process finished with exit code 0

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值