簡單的梯度下降展示 python

2021-09-26 21:21:23 字數 4017 閱讀 8267

概念

梯度下降是迭代法的一種,可以用於求解最小二乘問題(線性和非線性都可以)。

二維的

# 梯度下降 == 導數值下降

import matplotlib.pyplot as plt

import numpy as np

# f(x) = x^2, 目標函式

# f'(x) = 2*x 梯度函式:一階導數函式

# f(x1, x2...xn)

# 梯度下降演算法是乙個方法,是幫助我們找極值點的方法cost

deftargetfunc

(x):

return

(x-100)**

2pass

defgradientfunc

(x):

return

2*x -

200pass

listx =

# 猜測的過程

defgradientcal

(initx, targetfunc, gradientfunc, rating=

0.1, tolent=

0.000000001):

''' :param initx: 猜測的點

:param targetfunc: 目標函式

:param gradientfunc: 梯度函式

:param rating: 步進係數

:param tolent: 收斂條件

:return: 返回極值點x值

'''result = targetfunc(initx)

# 計算出initx這個點的實際值

# 核心梯度下降公式 rating自己確定

newx = initx - rating*gradientfunc(initx)

#新x點

newresult = targetfunc(newx)

# 新結果

reresult = np.

abs(result - newresult)

# 相差範圍

while reresult > tolent:

initx = newx

result = newresult

# 生成新點

newx = initx - rating * gradientfunc(initx)

newresult = targetfunc(newx)

reresult = np.

abs(result - newresult)

return initx

if __name__ ==

"__main__"

:print

(gradientcal(-10

, targetfunc, gradientfunc)

) x = np.arange(-20

,201,1

) y =

(x -

100)**2

# 畫曲線

plt.plot(x, y)

plt.grid(linestyle=

'--'

)# 畫點

三維的(同理)

# 梯度下降 == 導數值下降

import matplotlib.pyplot as plt

import numpy as np

from mpl_toolkits.mplot3d import axes3d

# 梯度下降演算法是乙個方法,是幫助我們找極值點的方法cost

deftargetfunc

(x,y)

:return

(x)**2+

(y)**

2def

xfunc

(x):

return2*x

defyfunc

(y):

return2*y

listx =

listy =

# 猜測的過程

defgradientcal

(initx,inity, targetfunc, xfunc,yfunc, rating=

0.1, tolent=

0.000000001):

''' :param initx: 猜測的點

:param targetfunc: 目標函式

:param gradientfunc: 梯度函式

:param rating: 步進係數

:param tolent: 收斂條件

:return: 返回極值點x值

'''result = targetfunc(initx,inity)

# 計算出initx這個點的實際值

newx = initx - rating*xfunc(initx)

newy = inity - rating*yfunc(inity)

newresult = targetfunc(newx,newy)

reresult = np.

abs(result - newresult)

while reresult > tolent:

initx = newx

inity = newy

result = newresult

newx = initx - rating * xfunc(initx)

newy = inity - rating * yfunc(inity)

newresult = targetfunc(newx, newy)

reresult = np.

abs(result - newresult)

pass

return initx

pass

if __name__ ==

"__main__"

:print

(gradientcal(-30

,-40, targetfunc, xfunc,yfunc)

) x = np.arange(-50

,50,1

) y = np.arange(-50

,50,1

) fig = plt.figure(

) ax = axes3d(fig)

x, y = np.meshgrid(x, y)

r = np.add(x **

2, y **2)

a = np.array(listx)

b = np.array(listy)

plt.grid(linestyle=

'--'

)# cmap='rainbow',顏色對映 alpha設定透明度

# 畫點

ax.scatter(np.array(listx)

, np.array(listy)

, np.array(listx)**2

+np.array(listy)**2

, s=

20, c =

'r')

# 畫曲面

python實現簡單的梯度下降法

如下 梯度下降法模擬 import numpy as np import matplotlib.pyplot as plt plot x np.linspace 1,6,141 計算損失函式對應的導數,即對y x 2.5 2 1求導 defdj theda return 2 theda 2.5 計算...

Python 梯度下降

code import random import numpy as np import matplotlib.pyplot as plt 最速下降法 rosenbrock函式 函式 f x 100 x 2 x 1 2 2 1 x 1 2 梯度 g x 400 x 2 x 1 2 x 1 2 1 x...

梯度下降演算法的簡單Python原理實現

梯度下降 導數值下降 import matplotlib.pyplot as plt import numpy as np 目標函式 f x x 2 梯度函式 一階導數函式 f x 2 x 梯度下降演算法是乙個方法,是幫助我們找極值點的方法cost 梯度下降 導數值下降 import matplot...