梯度下降法求解線性回歸

2022-08-30 10:24:13 字數 3681 閱讀 1075

梯度下降法(英語:gradient descent)是乙個一階最優化演算法,通常也稱為最速下降法。 要使用梯度下降法找到乙個函式的區域性極小值,必須向函式上當前點對應梯度(或者是近似梯度)的反方向的規定步長距離點進行迭代搜尋。如果相反地向梯度正方向迭代進行搜尋,則會接近函式的區域性極大值點;這個過程則被稱為梯度上公升法。

現在有乙個山谷,你想要到達山谷的最低端,你此時在a點,那麼此時就可以利用梯度下降來找到最低點。你每次以你當前的方向為基準。選擇乙個最陡峭的方向,朝著山下降的方向向下走,每次走一段距離,重複執行該步驟,你總能夠到達山頂。

原理介紹:

微分其實就可以看作是函式影象在某點的斜率。有單變數微分和多變數微分

$\frac=2x$

$\frac (x^2y)=2xy$

$\frac(x^2y)=x^2$ 梯度的本意是乙個向量(向量),表示某一函式在該點處的方向導數沿著該方向取得最大值,即函式在該點處沿著該方向(此梯度的方向)變化最快,變化率最大(為該梯度的模)。

梯度是乙個向量。對於某個點的梯度其實就是對每個變數求偏導構成的向量。

$j(\theta)=1+2\theta_1-3\theta_2+4\theta_3$

$\delta j(\theta)= = <2,-3,4>$ $\theta_1$=$\theta_0$ -$\alpha \delta j(\theta)$

公式解釋:\(\theta_0\) 表示當前所在的位置,\(\theta_1\)表示下乙個位置,\(\alpha\)表示步長,\(j\)函式就是當前的梯度。減號表示步長的反向,即下坡。

在機器學習中\(\alpha\)表示學習率或者步長,我們需要通過\(\alpha\)來控制每一步所走的距離,既不能太快,也不能太慢。

現在我們有乙個單變數的函式:

$j(\theta)=\theta^2$

對函式求微分:

$j'(\theta)=2\theta$

設定\(\theta_0=1\),學習率\(\alpha=0.4\)

根據梯度下降的公式

$\theta_1=\theta_0-\alpha*j'(\theta)$

我們不斷迭代:

$\theta_0=1$

$\theta_1=0.2$

$\theta_2=0.04$

$\theta_3=0.008$

$\theta_4=0.0016$

經過\(4\)次迭代,最終結果也接近了函式的最小值。

多變數函式的求解過程和單變數的求解如出一轍。

房屋**與面積(資料在下面**中)

序號面積**1

1506450

2200

7450

3250

8450

4300

9450

5350

11450

6400

15450

7600

18450

使用梯度下降求解線性回歸(求\(\theta_0,\theta_1\))

$h_\theta(x)=\theta_0+\theta_1x$

我們的目的是使得我們的估計值和實際值相差最小,因此我們定義乙個代價函式,這裡我們使用均方誤差代價函式:

$j(\theta)=\frac\sum_^m(h_\theta(x_i)-y_i)^2$

即:$j(\theta)=\frac\sum_^m(\theta_0+\theta_1x_i-y_i)^2$

而其中\(h_\theta(x)=\theta_0+\theta_1x\)

讓函式分別對\(\theta_0,\theta_1\)求偏導。

$\delta j(\theta)= $

其中:$\frac=\frac\sum_^m(h_\theta(x_i)-y_i)$

$\frac=\frac\sum_^m(h_\theta(x_i)-y_i)x_i$

接下來就是**時間了

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\)):

機器學習之梯度下降法求解線性回歸

最小二乘法的優點 準確率比較高,缺點 當有兩個或者兩個以上的變數時,就會出現計算量大,過於複雜。這時我們將用梯度下降的方法來畫出擬合圖。梯度下降 import pandas as pd import numpy as np import matplotlib.pyplot as plt points...

線性回歸與梯度下降法

原文 最近在看斯坦福的 機器學習 的公開課,這個課程是2009年的,有點老了,不過講的還是很好的,廓清了一些我以前關於機器學習懵懂的地方。我的一位老師曾經說過 什麼叫理解?理解就是你能把同乙個事情用自己的語言表達出來,並且能讓別人聽得懂。本著這樣的原則,同時也為了證明自己是 理解 的,於是決定打算在...

20191008 線性回歸 梯度下降法

不斷的迭代,還是波士頓房價 獲取資料 資料清洗預處理 劃分資料集 特徵工程 預估器流程 coef intercept 模型評估 from sklearn.datasets import load boston from sklearn.model selection import train tes...