線性回歸 梯度下降

2021-07-10 11:28:09 字數 3625 閱讀 7615

線性回歸演算法屬於監督學習的一種,主要用於模型為連續函式的數值**。

過程總得來說就是初步建模後,通過訓練集合確定模型引數,得到最終**函式,此時輸入自變數即可得到**值。

1、初步建模。確定假設函式 h(x) (最終**用)

2、建立價值函式 j(θ) (也叫目標函式、損失函式等,求引數 θ 用)

3、求引數 θ 。對價值函式求偏導(即梯度),再使用梯度下降演算法求出最終引數 θ值

4、將引數 θ 值代入假設函式

x :自變數,即特徵值

y :因變數,即結果

h(x) :假設函式

j(θ) :價值函式

n :自變數個數,即特徵值數量

m :訓練集資料條數

α :學習速率,即梯度下降時的步長

根據訓練集的資料特點建立假設函式,這裡我們建立如下基本線性函式

這裡需要說明的一點是公式的最後一步,如果把各組引數和自變數組織成矩陣,也可以利用矩陣方式計算。

我們說到矩陣,預設是指的列矩陣。這裡先將引數矩陣轉置行矩陣,然後就可以和x列矩陣做內積以得結果。

為了讓我們的假設函式更好的擬合實際情況,我們可以使用最小二乘法(lms)建立價值函式,然後將訓練集資料代入,然後想辦法讓該函式的所有結果盡可能小。

這裡前面的1/2只是為了後面求導計算時方便而特地加上的。

怎麼讓其值盡可能小呢?

方法就是求該價值函式對θ的偏導數,再利用梯度下降演算法進行收斂。

使用梯度下降演算法,不斷修正各θ的值,直到收斂。

判斷是否收斂,可以用如下方法:

1、直到θ值變化不再明顯(差值小於某給定值);

2、將訓練集代入假設函式,判斷所有假設函式值之和的變化情況,直到變化不再明顯;

3、當然,特殊情況下也可以強制限制迭代次數(可用於最大迴圈上限,防止死迴圈)。

下面就是迭代中用到的公式:

α為學習速率,即每次迭代的步長,如果太小則迭代速度過慢,如果太大則因為跨度太大無法有效找到期望的最小值,該值需要根據實際情況進行調整。

要使用**實現的話,出現一堆導數可不成,所以要先求最右邊的偏導數部分,將價值函式代入:

其實這裡引數的數量和自變數的數量是一致的,也就是j=n。

所以梯度下降公式就變成了這樣:

再代入訓練集合的話公式就是:

(公式左邊theta上面的尖號表示這是期望值)

這就得到了傳說中的 批量梯度下降 演算法。

但該演算法在訓練集合非常大的情況下將會非常低效,因為每次更新theta值時都要將整個訓練集的資料代入計算。

所以通常實際情況中會使用改進的 增量梯度下降(隨機梯度下降) 演算法:

該演算法每次更新只會使用訓練集中的一組資料。

這樣雖然犧牲了每次迭代時的最優下降路線,但是從整體來看路線還是下降的,只是中間走了寫彎路而已,但是效率卻大大改善了。

將最終的θ值代入最初的假設函式,即得到了最終的**函式。

增量梯度下降,python**實現:

# -*- coding:utf-8 -*-

"""增量梯度下降

y=1+0.5x

"""import sys

# 訓練資料集

# 自變數x(x0,x1)

x = [(1,1.15),(1,1.9),(1,3.06),(1,4.66),(1,6.84),(1,7.95)]

# 假設函式 h(x) = theta0*x[0] + theta1*x[1]

# y為理想theta值下的真實函式值

y = [1.37,2.4,3.02,3.06,4.22,5.42]

# 兩種終止條件

loop_max = 10000

# 最大迭代次數

epsilon = 0.0001

# 收斂精度

alpha = 0.005

# 步長

diff = 0

# 每一次試驗時當前值與理想值的差距

error0 = 0

# 上一次目標函式值之和

error1 = 0

# 當前次目標函式值之和

m = len(x) # 訓練資料條數

#init the parameters to zero

theta = [0,0]

count = 0

finish = 0

while count1

# 遍歷訓練資料集,不斷更新theta值

for i in range(m):

# 訓練集代入,計算假設函式值h(x)與真實值y的誤差值

diff = (theta[0] + theta[1]*x[i][1]) - y[i]

# 求引數theta,增量梯度下降演算法,每次只使用一組訓練資料

theta[0] = theta[0] - alpha * diff * x[i][0]

theta[1] = theta[1] - alpha * diff * x[i][1]

# 此時已經遍歷了一遍訓練集,求出了此時的theta值

# 判斷是否已收斂

if abs(theta[0]-error0) < epsilon and abs(theta[1]-error1) < epsilon:

print

'theta:[%f, %f]'%(theta[0],theta[1]),'error1:',error1

finish = 1

else:

error0,error1 = theta

if finish:

break

print

'finish count:%s' % count

執行的最終結果是:

theta:[1.066522, 0.515434] error1: 0.515449819658 

finish count:564 

理想的真實值θ1= 1 ,θ2= 0.5

計算出來的是θ1=1.066522,θ2= 0.515434

迭代了 564 次

需要注意一點,實際過程中需要反覆調整 收斂精度 和 學習速率 這兩個引數,才可得到滿意的收斂結果!

另外,如果函式有區域性極值問題,則可以將θ隨機初始化多次,尋找多個結果,然後從中找最優解。

正規方程法 這裡先不做討論了~

-- eof --

線性回歸梯度下降

梯度下降 一種最優化演算法,就是沿著函式的梯度方向尋找函式的最小值 線性回歸模型 最終的目標就是利用 梯度下降法 求出使 誤差函式 最小的線性函式的系數值 梯度下降演算法有兩種 1.批量梯度下降 batch gradient descent 2.隨機梯度下降 stochastic gradient ...

線性回歸 梯度下降

利用回歸方程對乙個或多個自變數和因變數之間進行建模的分析方式損失 計算損失用最小二乘法。優化。優化有兩種方式。一種是正規方程解法通常只適用於極少量資料,一般不會用 二是梯度下降的方式通常使用梯度下降 梯度下降的簡介。梯度就是倒導數 切線。沿著切線的方向下降的最快。梯度下降有兩個引數,起始點和學習率 ...

線性回歸與梯度下降

以下內容是根據史丹福大學ng教授的機器學習公開課總結的內容 監督學習 即訓練資料中既包含了輸入資料又包含了對應於這個是輸入資料的正確的輸出結果。回歸問題 當給出了輸入資料後,正確的輸出結果。首先考慮乙個問題 我們需要 自己房屋的 現在擁有的資料只是幾十個房屋樣本 如下圖所示。怎樣根據這些房屋的面積以...