概念
梯度下降是迭代法的一種,可以用於求解最小二乘問題(線性和非線性都可以)。
二維的
# 梯度下降 == 導數值下降
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...