人工智慧 梯度下降法Python實現

2021-10-04 18:10:58 字數 3666 閱讀 9781

什麼是梯度

在高數的微積分中,我們學習過對多元函式求偏導,偏導數反映的是函式沿座標軸方向的變化率,梯度就是偏導數構成的乙個向量.

當變化方向與梯度相同或相反時,函式的變化率最大,當變化方向與梯度方向正交時,函式的變化率為0.

∇ f(x,y,z)= (∂ x,∂ y ,∂z) ,每一點的梯度都會因x,y,z的值不一樣而變化,因此在每乙個點我們都要求一次梯度值.

梯度下降和上公升

在機器學習中,我們在求最小值時使用梯度下降法,求最大值時使用梯度上公升法.

為了盡快的得到最小值或者最大值,我們盡量讓每一步運算的變化率都足夠大,因此,在每一次運算時,我們要使函式變化的方向與梯度相同或相反,即△x= ∂ x*a, 這裡a是乙個常數,也就是步長.

當a為正時,函式變化方向與梯度方向相同,函式增加的最快,當a為負時,函式變化方向與梯度方向相反,函式減少得最快.a數值越大,函式變化得也越快,但a不能太大,過大就有可能因為變化太多錯過了最值.

a的最優值往往要在多次嘗試後才能確定.

梯度法求二次函式的最小值:

a=

0.2##迭代精度

## 引數初始值

x1=1

x2=1

all=[0

]x1=

x2=[

]##fx函式

defy

(x1,x2)

:return x1*x1+

2*x2*x2-

4*x1-

2*x1*x2

## 各未知數偏導

defdx1

(x1,x2)

:return

2*x1-4-

2*x2

defdx2

(x1,x2)

:return

4*x2-

2*x1

##進行梯度下降

deftidu

(x1,x2,a)

: temp=y(x1,x2)

allwhile

(all[-

1]-all[-

2]!=0

):#當最後兩個結果不相等時進入while迴圈

a1=x1-dx1(x1,x2)

*a

a2=x2-dx2(x1,x2)

*a now=y(a1,a2)

x1=a1

x2=a2

alldefmain()

: tidu(x1,x2,a)

print

(all

)##列印所有的f(x)值

print

(x1[-1

])##列印最小點

print

(x2[-1

])main(

)

結果如下圖,藍色框住的是最小點,紅色是最小值.

店鋪多元回歸求解係數:

import numpy as np

import random

import math

from sympy import

*## 利用函式求偏導數

x1,x2,b=symbols(

'x1 x2 b')y=

(469

-x1*

10-x2*

80-b)*(

469-x1*

10-x2*

80-b)

print

(diff(y,x1)

)print

(diff(y,x2)

)print

(diff(y,b)

)##迭代精度

a=0.0000004

##初始值

x1=45

##a1

x2=1

##a2

x3=70

##barea=[10

,8,8

,5,7

,8,7

,9,6

,9]distance=[80

,0,200

,200

,300

,230,40

,0,330

,180

]money=

[469

,366

,371

,208

,246

,297

,263

,436

,198

,364

]##偏導數

defdx1

(x1,x2,x3)

: s1=

0for i in

range

(len

(area)):

s1+=

(x3+area[i]

*x1+distance[i]

*x2-money[i])*

20return

-s1

defdx2

(x1,x2,x3)

: s2=

0for i in

range

(len

(area)):

s2+=

(x3+area[i]

*x1+x2*distance[i]

-money[i])*

160return

-s2

defdx3

(x1,x2,x3)

: s3=

0for i in

range

(len

(area)):

s3+=2*

(x3+x1*area[i]

+distance[i]

*x2-money[i]

)return

-s3##殘差

deffx

(x1,x2,x3)

: s4=

0for i in

range

(len

(area)):

a=money[i]

-(x1*area[i]

+x2*distance[i]

+x3)

s4+=

abs(a)

return s4

## 梯度下降

all=[0

]x=deftidu

(x1,x2,x3)

: temp=fx(x1,x2,x3)

allwhile

(all[-

1]!=all[-

2]):

a1=x1+a*dx1(x1,x2,x3)

a2=x2+a*dx2(x1,x2,x3)

a3=x3+a*dx3(x1,x2,x3)

temp=fx(a1,a2,a3)

x1=a1

x2=a2

x3=a3

alltidu(x1,x2,x3)

print

(all

)print

(x)

最終結果:

最後的結果與最小二乘法計算出的結果和excel算出來的結果相比還是有很大誤差的.

Python 梯度下降法

接上篇部落格 題目描述 自定義乙個可微並且存在最小值的一元函式,用梯度下降法求其最小值。並繪製出學習率從0.1到0.9 步長0.1 時,達到最小值時所迭代的次數的關係曲線,根據該曲線給出簡單的分析。coding utf 8 created on tue jun 4 10 19 03 2019 aut...

梯度下降法和隨機梯度下降法

批量梯度下降法 batch gradient descent 在更新引數時使用所有的樣本來進行更新 隨機梯度下降法 stochastic gradient descent 求梯度時沒有用所有的m個樣本的資料,而是僅僅選取乙個樣本j來求梯度。小批量梯度下降法 mini batch gradient d...

梯度下降法

梯度下降法 是乙個一階 最優化演算法 通常也稱為 最速下降法 我之前也沒有關注過這類演算法。最近,聽史丹福大學的機器學習課程時,碰到了用梯度下降演算法求解線性回歸問題,於是看了看這類演算法的思想。今天只寫了一些入門級的知識。我們知道,函式的曲線如下 程式設計實現 c code cpp view pl...