什麼是梯度
在高數的微積分中,我們學習過對多元函式求偏導,偏導數反映的是函式沿座標軸方向的變化率,梯度就是偏導數構成的乙個向量.
當變化方向與梯度相同或相反時,函式的變化率最大,當變化方向與梯度方向正交時,函式的變化率為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...