梯度下降實際就是導數值下降 。
梯度下降演算法是乙個方法,是幫助我們找極值點的方法cost
接下來用python實現最土的梯度下降演算法,
#首先引入numpy模組和圖形介面模組
import matplotlib.pyplot as plt
import numpy as np
#定義三個函式 乙個數目標函式 乙個是對目標函式x1求一次導數和x2求一次導數
def targetfunc(x1, x2):
return (x1+x2)**2
pass
def gradientfunc(x1, x2):
a = 2 * x1 + 2*x2 + x2**2,
return a
pass
def gradientfunc2(x1,x2):
b = 2*x2 + 2*x1 + x1**2
return b
pass
listx =
#猜測的過程 猜的值 目標函式 梯度函式 步進係數 收斂條件
def gradientcal(initx1, initx2, targetfunc, gradientfunc, rating=0.01, tolent=0.000001, times = 500000):
result = targetfunc(initx1,initx2) #計算出initx1,initx2這個點的實際值
newx1 = initx1 - rating * gradientfunc(initx1,initx2)
newx2 = initx2 - rating * gradientfunc2(initx1,initx2)
newresult = targetfunc(newx1, newx2)
reresult = np.abs(result - newresult)
t = 0
while reresult > tolent and t < times:
t += 1
initx1 = newx1
initx2 = newx2
result = newresult
newx1 = newx1 - rating*gradientfunc(newx1,newx2) #不斷更新新的點根據步進係數
newx2 = newx2 - rating*gradientfunc2(newx2,newx1)
newresult1 = targetfunc(newx1,newx2)
reresult = np.abs(result - newresult)
pass
return initx1, initx2
pass
if __name__ == '__main__':
print(gradientcal(10, 10, targetfunc, gradientfunc2))
x1 = np.arange(-10, 10+1, 1)
x2 = np.arange(-10, 10+1, 1)
y = (x1+x2)**2
plt.plot(x1, y)
plt.plot(x2, y)
plt.grid(linestyle='--')
plt.scatter(np.array(listx), (np.array(listx)**2), s=20)
plt.show()
print(listx)
pass
用python編寫梯度下降演算法
這次我選的python版本是2.7,因為我之前用python3試了幾次,發現在畫3d圖的時候會報錯,我暫時還沒找到解決辦法,所以改用了2.7。資料集我選了乙個包含兩個變數,三個引數的資料集,這樣可以畫出3d圖形對結果進行驗證。symbols 函式 首先要安裝sympy庫才可以使用。用法 x1 sym...
梯度下降演算法的python實現
import sys training data set each element in x represents x0,x1,x2 x 1,0.3 1,1.3 1,2.3 1,3.2 1,4.4 y i is the output of y theta0 x 0 theta1 x 1 theta2...
梯度下降演算法及Python實現
梯度下降是乙個用來求函式最小值的演算法,其背後的思想是 開始時我們隨機選擇乙個引數的組合,計算代價函式,然後我們尋找下乙個能讓代價函式值下降最多的引數組合。我們持續這麼做直到到達乙個區域性最小值,因為我們並沒有嘗試完所有的引數組合,所以不能確定我們得到的區域性最小值是否便是全域性最小值,選擇不同的初...