# 梯度下降 == 导数值下降
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