梯度下降法
梯度下降法(英語:Gradient descent)是一個一階最優化算法,通常也稱為最速下降法。 要使用梯度下降法找到一個函數的局部極小值,必須向函數上當前點對應梯度(或者是近似梯度)的反方向的規定步長距離點進行迭代搜索。如果相反地向梯度正方向迭代進行搜索,則會接近函數的局部極大值點;這個過程則被稱為梯度上升法。
梯度下降的形象解釋
現在有一個山谷,你想要到達山谷的最低端,你此時在A點,那么此時就可以利用梯度下降來找到最低點。你每次以你當前的方向為基准。選擇一個最陡峭的方向,朝着山下降的方向向下走,每次走一段距離,重復執行該步驟,你總能夠到達山頂。
梯度下降算法原理
原理介紹:
微分
微分其實就可以看作是函數圖像在某點的斜率。有單變量微分和多變量微分
梯度
梯度的本意是一個向量(矢量),表示某一函數在該點處的方向導數沿着該方向取得最大值,即函數在該點處沿着該方向(此梯度的方向)變化最快,變化率最大(為該梯度的模)。
梯度是一個向量。對於某個點的梯度其實就是對每個變量求偏導構成的向量。
梯度下降算法的數學原理
公式解釋:\(\Theta_0\) 表示當前所在的位置,\(\Theta_1\)表示下一個位置,\(\alpha\)表示步長,\(J\)函數就是當前的梯度。減號表示步長的反向,即下坡。
在機器學習中\(\alpha\)表示學習率或者步長,我們需要通過\(\alpha\)來控制每一步所走的距離,既不能太快,也不能太慢。
梯度下降應用實例
現在我們有一個單變量的函數:
對函數求微分:
設定\(\Theta_0=1\),學習率\(\alpha=0.4\)
根據梯度下降的公式
我們不斷迭代:
經過\(4\)次迭代,最終結果也接近了函數的最小值。
多變量函數的求解過程和單變量的求解如出一轍。
梯度下降求解線性回歸
房屋價格與面積(數據在下面表格中)
序號 | 面積 | 價格 |
---|---|---|
1 | 150 | 6450 |
2 | 200 | 7450 |
3 | 250 | 8450 |
4 | 300 | 9450 |
5 | 350 | 11450 |
6 | 400 | 15450 |
7 | 600 | 18450 |
使用梯度下降求解線性回歸(求\(\Theta_0,\Theta_1\))
我們的目的是使得我們的估計值和實際值相差最小,因此我們定義一個代價函數,這里我們使用均方誤差代價函數:
即:
而其中\(h_\Theta(x)=\Theta_0+\Theta_1x\)
讓函數分別對\(\Theta_0,\Theta_1\)求偏導。
其中:
接下來就是代碼時間了
import math
m=7 #數據集大小
Theta0=300
Theta1=100
#初始坐標
alpha=0.000000001#學習率
area=[150,200,250,300,350,400,600];#數據集
price=[6450,7450,8450,9450,11450,15450,18450];
def gradientx(Theta0,Theta1):#對Theta0的偏導
ans=0
for i in range(0,7):
ans=ans+Theta0+Theta1*area[i]-price[i]
ans=ans/m
return ans
def gradienty(Theta0,Theta1):#對Theta1的偏導
ans=0
for i in range(0,7):
ans=ans+(Theta0+Theta1*area[i]-price[i])*area[i]
ans=ans/m
return ans
nowTheta0 = Theta0-alpha*gradientx(Theta0, Theta1)#下一個點的坐標
nowTheta1 = Theta1-alpha*gradienty(Theta0, Theta1)
#print(nowTheta0,nowTheta1)
while math.fabs(nowTheta1-Theta1)>0.000000001:#梯度下降
nowa = nowTheta0-alpha*gradientx(nowTheta0,nowTheta1)
nowb = nowTheta1-alpha*gradienty(nowTheta0, nowTheta1)
nowTheta0=nowa
nowTheta1=nowb
nowa = Theta0-alpha*gradientx(Theta0, Theta1)
nowb = Theta1-alpha*gradienty(Theta0, Theta1)
Theta0=nowa
Theta1=nowb
print(nowTheta0,nowTheta1 )
#299.85496413867725 32.638872688242515
繪圖
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import pyplot
area=[150,200,250,300,350,400,600]#數據集
price=[6450,7450,8450,9450,11450,15450,18450]
pyplot.scatter(area,price)
x=np.arange(100,700,100)
y=32.37648991481203*x+299.85496413867725
pyplot.plot(x,y)
pyplot.xlabel('area')
pyplot.ylabel('price')
pyplot.show()
結果:
我們可以看到梯度下降求解出的線性回歸很好的與結果吻合了。
擬合過程(每次的\(\Theta_0\)和\(\Theta_1\)):