用python編寫梯度下降演算法

2021-10-08 22:38:58 字數 3285 閱讀 9539

這次我選的python版本是2.7,因為我之前用python3試了幾次,發現在畫3d圖的時候會報錯,我暫時還沒找到解決辦法,所以改用了2.7。

資料集我選了乙個包含兩個變數,三個引數的資料集,這樣可以畫出3d圖形對結果進行驗證。

symbols()函式:首先要安裝sympy庫才可以使用。用法:

>>

> x1 = symbols(

'x2'

)>>

> x1 +

1x2 +

1

在這個例子中,x1和x2是不一樣的,x2代表的是乙個函式的變數,而x1代表的是python中的乙個變數,它可以表示函式的變數,也可以表示其他的任何量,它替代x2進行函式的計算。實際使用的時候我們可以將x1,x2都命名為x,但是我們要知道他們倆的區別。

再看看這個例子:

>>

> x = symbols(

'x')

>>

> expr = x +

1>>

> x =

2>>

>

print

(expr)

x +1

作為python變數的x被2這個數值覆蓋了,所以它現在不再表示函式變數x,而expr依然是函式變數x+1的別名,所以結果依然是x+1。

subs()函式:既然普通的方法無法為函式變數賦值,那就肯定有函式來實現這個功能,用法:

>>

>(1

+ x*y)

.subs(x, pi)

#乙個引數時的用法

pi*y +

1>>

>(1

+ x*y)

.subs(

)#多個引數時的用法1+

2*pi

diff()函式:求偏導數,用法:result=diff(fun,x),這個就是求fun函式對x變數的偏導數,結果result也是乙個變數,需要賦值才能得到準確結果。

from __future__ import division

from sympy import symbols, diff, expand

import numpy as np

import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import axes3d

data =

#初始化資料集

theta0, theta1, theta2 = symbols(

'theta0 theta1 theta2'

, real=

true

)# y=theta0+theta1*x1+theta2*x2,定義引數

costfuc =

0* theta0

for i in

range(10

):costfuc +=

(theta0 + theta1 * data[

'x1'

][i]

+ theta2 * data[

'x2'

][i]

- data[

'y']

[i])**2

costfuc /=

20#初始化代價函式

dtheta0 = diff(costfuc, theta0)

dtheta1 = diff(costfuc, theta1)

dtheta2 = diff(costfuc, theta2)

rtheta0 =

1rtheta1 =

1rtheta2 =

1#為引數賦初始值

costvalue = costfuc.subs(

)newcostvalue =

0#用cost的值的變化程度來判斷是否已經到最小值了

count =

0alpha =

0.0001

#設定學習率,一定要設定的比較小,否則無法到達最小值

while

(costvalue - newcostvalue >

0.00001

or newcostvalue - costvalue >

0.00001

)and count <

1000

: count +=

1 costvalue = newcostvalue

rtheta0 = rtheta0 - alpha * dtheta0.subs(

) rtheta1 = rtheta1 - alpha * dtheta1.subs(

) rtheta2 = rtheta2 - alpha * dtheta2.subs(

) newcostvalue = costfuc.subs(

)rtheta0 =

round

(rtheta0,4)

rtheta1 =

round

(rtheta1,4)

rtheta2 =

round

(rtheta2,4)

#給結果保留4位小數,防止數值溢位

print

(rtheta0, rtheta1, rtheta2)

fig = plt.figure(

)ax = axes3d(fig)

ax.scatter(data[

'x1'

], data[

'x2'

], data[

'y']

)# 繪製散點圖

xx = np.arange(20,

100,1)

yy = np.arange(1,

5,0.05

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

z = x * rtheta1 + y * rtheta2 + rtheta0

ax.plot_su***ce(x, y, z, rstride=

1, cstride=

1, cmap=plt.get_cmap(

'rainbow'))

plt.show(

)#繪製3d圖進行驗證

側面圖可以看得比較清楚,擬合效果還算不錯。

用Python實現梯度下降演算法

梯度下降實際就是導數值下降 梯度下降演算法是乙個方法,是幫助我們找極值點的方法cost 接下來用python實現最土的梯度下降演算法,首先引入numpy模組和圖形介面模組 import matplotlib.pyplot as plt import numpy as np 定義三個函式 乙個數目標函...

梯度下降演算法 梯度下降演算法為何叫梯度下降?

首先,我們知道乙個演算法的名字可以很好地去解釋乙個演算法,那麼梯度下降演算法是什麼呢?很明顯的,就是用梯度這個工具來解決問題的一種演算法。解決什麼問題呢?如何在乙個函式曲面的某一點,找到乙個函式值變化最大的方向。比如 我們站在山上的某一點,我們想要以最快的速度上山,但是我們的步子大小是一定的,那麼最...

梯度下降演算法 梯度下降演算法公式推導

場景假設 梯度下降法的基本思想可以模擬為乙個下山的過程。假設這樣乙個場景 乙個人被困在山上,需要從山上下來 找到山的最低點 但此時山上的濃霧很大,導致可視度很低 因此,下山的路徑就無法確定,必須利用自己周圍的資訊一步一步地找到下山的路。這個時候,便可利用梯度下降演算法來幫助自己下山。怎麼做呢,首先以...