1. 程式人生 > >感知機2 -- 隨機梯度下降算法

感知機2 -- 隨機梯度下降算法

-- 面向 pre 樣本 .net 距離 utf 先後 統計學習

聲明:

1,本篇為個人對《2012.李航.統計學習方法.pdf》的學習總結。不得用作商用,歡迎轉載,但請註明出處(即:本帖地址)

2,因為本人在學習初始時有非常多數學知識都已忘記。因此為了弄懂當中的內容查閱了非常多資料。所以裏面應該會有引用其它帖子的小部分內容,假設原作者看到能夠私信我。我會將您的帖子的地址付到以下。

3,假設有內容錯誤或不準確歡迎大家指正。

4,假設能幫到你,那真是太好了。

概述

隨意選取一超平面w0、b0,然後用隨機梯度下降算法不斷極小化L(w, b)。

Ps: 極小化的過程不是一次使M中的全部誤分類點的梯度下降,而是隨機選取一個誤分類點使其梯度下降。

過程概述

1,對於L(w, b) = -yi(w·xi+ b)。L(w, b)的梯度例如以下:

▽w L(w, b) = - yixi

▽b L(w, b) =- yi

2,隨機選取一個誤分類點(xi, yi),對w,b更新:

w= w + ηyixi

b= b + ηyi

(η為步長。在統計學習中又稱學習率)

這樣,通過叠代能夠期待L(w,b)不斷下降,直到為0。

算法的第一種形式(感知機算法的原始形式)

輸入:

訓練數據集 T={(x1,y1),(x2,y2),...,(xn,yn)},當中x1∈Rn,yi={+1,-1},i=1, 2, ..., n,學習率η(0 < η<= 1)

輸出:

w, b。感知機模型 f(x) = sign(w·x + b)

過程:

1, 選取初值w, b

2, 在訓練集中取數據(xi,yi)

3。 若 yi(w·xi+ b) <= 0 即分類不對。則:

w= w + ηyixi

b= b + ηyi

註:由於此時分類不正確,所以yi= -1

4, 轉至步驟2,直到訓練數據集中無誤分類點

總結:

直觀上解釋上面的過程就是:

若一個實例點被誤分類,即:位於超平面的錯誤一側時,需調整w, b 的值,使分離超平面向該誤分類點的一側移動。以降低該誤分類點與超平面的距離。直至超平面越過該誤分類點使其被正確分類。

例:

輸入:

訓練數據集 x1= (3, 3)。x2 = (4, 3),為正實例點(被正確分類)。x3 = (1, 1)為負實例點

求:

f(x)= sign(w·x + b)

ps:這裏的w = (w(1),w(2)),x = (x(1), x(2))

解:

1。 令η=1,並取初值w0 = 0, b0= 0

2, 對x1= (3, 3)。yi(w·xi + b) = 0,未能被正確分類,因此更新w, b

w = w + ηy1x1 = (3, 3)

b= b + ηy1 = 1

獲得線性模型:w·x + b = 3x(1) + 3x(2) + 1

3, 檢查該線性模型:

對於x1和x2,∵正確分類,∴不改動w,b

對於x3= (1, 1)。∵y3(w·x3 + b) < 0。∴被誤分類,∴須要改動w, b

到此說明下:

a。 上面出現的yi不是f(x) = w·x + b的f(x),而是代表某個點xi是否被正確分類的值:

正確分類 :yi = 1

不對分類:yi = -1

所以。y1 = 1, y2 = 1, y3 = -1

所以,在上面的第三步中

對x1 和 x2

yi(w·xi + b) = 1*(3xi(1) + 3xi(2) + 1) > 0,被正確分類

對x3

y3(w·x3 + b) = -1*(3x3(1) + 3x3(2) + 1) = -1*(3*1 + 3*1 + 1) < 0,未被正確分類

b。 既然yi不是f(x),那y坐標用什麽表示?

答案是:

xi(1) 表示xi點的x坐標

xi(2) 表示xi點的y坐標

c。 w·x1為內積

於是對於w = (0, 0),x1 = (3, 3):

w·x1 = 0*3 + 0*3 = 0

繼續第三步,更新w, b:

w = w + ηy3x3 = (3, 3) + -1 * (1, 1) = (2, 2)

b= b + ηy3 = 1 + -1 = 0

於是,線性模型更新為:

w·x + b = 2x(1)+ 2x(2)

4。 叠代上述過程,直到:

w = (1, 1),b = -3

即,線性模型為:

x(1)+ x(2) – 3

此時對全部的點均有yi(w·xi+ b) > 0。無誤分類點,於是損失函數達到最小。

終於求得:

分離超平面:x(1)+ x(2) – 3

感知機模型:f(x) =sign(x(1) + x(2) – 3)

附,叠代過程:

叠代次數

誤分類點

w

b

w·x + b

0

0

0

0

1

x1

(3, 3)

1

3x(1) + 3x(2) + 1

2

x3

(2, 2)

0

2x(1) + 2x(2)

3

x3

(1, 1)

-1

x(1) + x(2) - 1

4

x3

(0, 0)

-2

-2

5

x1

(3, 3)

-1

3x(1) + 3x(2) - 1

6

x3

(2, 2)

-2

2x(1) + 2x(2) - 2

7

x3

(1, 1)

-3

x(1) + x(2) – 3

8

無(模型確定)

(1, 1)

-3

x(1) + x(2) – 3

註:

上述過程中誤分類點先後取:

x1,x3,x3,x3,x1,x3,x3

得到 w = (1, 1), b = -3

若誤分類點先後取:

x1,x3,x3。x3,x2,x3,x3,x3,x1,x3,x3

那w = (2, 1), b = -5

可見:

感知機學習算法假設採用不同的初值或叠代不同的誤分類點,那結果也不同。

感知機算法的收斂性

到這裏有個問題:

怎麽知道對一個數據集,我們可採用感知機學習策略?

答案就是:

在經過有限次搜索後。可找到將訓練數據全然正確分類的超平面,也就是說算法具有收斂性。

Ps1:算法收斂意味著訓練數據集線性可分

Ps2:線性支持向量機可解決上例有多個解的問題

算法的另外一種形式(感知機算法的對偶形式)

在原始形式中有公式:

w= w + ηyixi

b= b + ηyi

那麽如果一共改動了n次,則w,b關於(xi(1),xi(2))的增量分別為:

aiyixi和 aiyi (ai= niη)

即:

技術分享

若η=1,則ai就是第i個點因為誤分類而進行更新的次數。即ai = ni

ai越大 => 實例點更新次數越多 =>越難正確分類,換句話說:這種實例對學習結果影響更大!

然後,感知機算法的對偶形式的算法例如以下:

輸入:

線性可分數據集 T={(x1,y1),(x2,y2),...,(xn,yn)},當中x1∈Rn。yi={+1,-1},i=1, 2, ..., n。學習率η(0 < η<= 1)

輸出:

感知機模型 f(x) = sign( aiyixi·x + b)

過程:

1, 令a = 0。b = 0

2。 在訓練集中取數據(xi,yi)

3, 若技術分享

則:

ai= ai + η

b= b + ηyi

4。 轉至2直到無誤分類數據

而因為對偶形式的訓練實例僅以內積形式出現

所以我們預先將訓練集中實例間的內積計算出來並以矩陣形式存儲,即:產生Gram矩陣(格拉姆矩陣)

G = [ xi, yi ]n*n

樣例

輸入:

正樣本點x1= (3, 3)。x2 = (4,3)

負樣本點x3= (1, 1)

求:

感知機模型

解:

1, 令ai= 0。i = 1, 2, 3。b = 0,η=1

2, 計算Gram矩陣

技術分享

技術分享

x1·x1 x1·x2 x1·x3

G = x2·x1 x2·x2 x2·x3

x3·x1 x3·x2 x3·x3

3, 誤分條件

yi( aiyixi·x + b) <= 0

時。參數更新

ai = ai +1

b = b + yi

4, 開始叠代

由於這裏僅僅有3個點

所以:

技術分享

= yi((a1y1x1·xi + a2y2x2·xi + a3y3x3·xi) + b)

= yi((a1x1·xi + a2x2·xi - a3x3·xi)+ b)

4.1,遍歷全部的點。然而在對點x1(第一次叠代)時

由於1*(0 + 0*0 – 0*0) = 0 誤分類

所以。

a1 = a1 +1 = 0 + 1 = 1

b = b + y1 = 0 + 1 =1

如今:

a1 = 1, a2= 0, a3 = 0, b = 1

4.2, 遍歷全部的點

對點x1

y1*(1 *x1·x1+ 0 – 0 + 1) = 1*(18 + 1) > 0 被正確分類

x2同理,也被正確分類

對點x3

y3*(1 * x1·x3 + 0 – 0 + 1) = -1 * (6 +1) < 0 誤分類

所以。

a3 = a3 +1 = 0 + 1 = 1

b = b + y3 = 1 - 1 =0

如今:

a1 = 1, a2= 0, a3 = 1, b = 0

4.3, 遍歷全部的點。這一步中x1和x2被正確分類,而x3

y3*(1 *x1·x3+ 0 – 0 * x3·x3 + 0) = -1 * (6 -2) < 0 誤分類

所以,

a3 = a3 +1 = 1 + 1 = 2

b = b + y3 = 0 - 1 =-1

如今:

a1 = 1, a2= 0, a3 = 2, b = -1

4.4, 同理,這一步中x1和x2被正確分類。而x3被誤分類

所以,

a3 = a3 +1 = 3

b = b + y3 = -2

如今:

a1 = 1, a2= 0, a3 = 3, b = -2

4.5, 這一步中剛遍歷到x1時就發現其被誤分類

所以,

a1 = a1 +1 = 1 + 1 = 2

b = b + y1 = -2 + 1 =-1

如今:

a1 = 2, a2= 0, a3 = 3, b = -1

4.6,同理,遍歷到x3時發現被誤分類

更新a3和b之後,如今:

a1 = 2, a2= 0, a3 = 4, b = -2

4.7,同理,遍歷到x3時發現被誤分類

更新a3和b之後。如今:

a1 = 2, a2= 0, a3 = 5, b = -3

4.8。全被正確分類

5,得出結果:

w = 2x1 + 0x2-5x3 = 2(3,3) – 5(1,1) = (1,1)

b = -3

所以超平面為:

x(1) + x(2)-3 = 0

所以感知機模型為:

f(x) = sign(x(1) + x(2)-3)

隨機梯度下降算法中感知機原始模式的代碼演示樣例

#-*-coding:utf-8-*-
# LANG=en_US.UTF-8
# 梯度下降算法 -- 感知機原始模式
# 文件名稱:stochastic_gradient_descent.py

_list = [
    [1, 1, -1],
    [3, 3, 1],
    [4, 3, 1],
]

w1 = w2 = 0
b = 0
n = 1
_len = len(_list)

while [ 1 ]:
    num = 0

    for i in _list:
        x1 = i[0]
        x2 = i[1]
        y = i[2]
        judge = y * (w1*x1 + w2*x2 + b)
        if judge <= 0:
            w1 = w1 + y*x1
            w2 = w2 + y*x2
            b = b + y
        else:
            num += 1

    if num == _len:
        print("f(x) = sign( (%s,%s)*x + %s )" % (w1, w2, b) )
        break


感知機2 -- 隨機梯度下降算法