用Python實現梯度下降演算法

2021-09-26 21:15:11 字數 1841 閱讀 4899

梯度下降實際就是導數值下降 。

梯度下降演算法是乙個方法,是幫助我們找極值點的方法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實現

梯度下降是乙個用來求函式最小值的演算法,其背後的思想是 開始時我們隨機選擇乙個引數的組合,計算代價函式,然後我們尋找下乙個能讓代價函式值下降最多的引數組合。我們持續這麼做直到到達乙個區域性最小值,因為我們並沒有嘗試完所有的引數組合,所以不能確定我們得到的區域性最小值是否便是全域性最小值,選擇不同的初...