感知機 —— 算法(原始形式)

算法流程

輸入:訓練數據集T={(x1,y1),(x2,y2),,(xN,yN),}T= \left\{ (x_1,y_1), (x_2,y_2),···,(x_N,y_N),\right\},其中xiχ=Rnx_i \in\chi=\mathbf{R}^nyiY={1,+1},i=1,2,,Ny_i\in Y=\left\{-1,+1\right\},i=1,2,···,N;學習率η(0<η1)\eta(0<\eta \le1)
輸出:w,bw,b;感知機模型f(x)=sign(wx+b)f(x)=sign(w·x+b)

  • 解的過程:

    (1)選取初值w0,b0w_0,b_0
    (2)在訓練集中選取數據(xi,yi)(x_i,y_i)
    (3)如果yi(wxi+b)0y_i(w·x_i+b)\le0ww+ηyixiw\gets w+\eta y_ix_i bb+ηyib\gets b+\eta y_i
    (4)轉至(2),直至訓練集中沒有誤分類點

  • 註釋:當一個點實例點被誤分類,即位於分離超平面的錯誤一側時,則調整w,bw,b的值,使分離超平面向該分類點的一側移動,以減少該誤分類點與超平面間的距離,直至超平面超過誤分類點使其被正確分類。

算法示例

例2.1:在訓練集中,其正實例點是x1=(3,3)Tx_1=(3,3)^Tx2=(4,3)Tx_2=(4,3)^T,其負實例點是x3=(1,1)Tx_3=(1,1)^T,試用感知機學習算法的原始形式求感知機模型f(x)=sign(wx+b)f(x)=sign(w·x+b)。這裏,w=(w(1),w(2))Tw=(w^{(1)},w^{(2)})^Tx=(x(1),x(2))Tx=(x^{(1)},x^{(2)})^T

  • 思路:
    構建最優化問題:minw,bL(w,b)=xiMyi(wxi+b)\min_{w,b}L(w,b)=-\sum_{x_i \in M}y_i(w·x_i+b)
    按照上述算法流程求解w,bη=1w,b。\eta=1

  • 解:
    (1)取初值w0=0,b0=0w_0=0,b_0=0
    (2)取點x1=(3,3)T,y1(w0x1+b0)=0x_1=(3,3)^T,y_1(w_0·x_1+b_0)=0,即滿足yi(wxi+b)0y_i(w·x_i+b)\le0,未能被正確分類,故更新w,bw,b w1=w0+y1x1=(3,3)T,b1=b0+1w_1=w_0+y_1x_1=(3,3)^T,b_1=b_0+1
    得到線性模型:w1x+b1=[33]x+1=3x(1)+3x(2)+1w_1·x+b_1=\begin{bmatrix} 3 \\ 3 \end{bmatrix}·x +1=3x^{(1)}+3x^{(2)}+1
    (3)取點x1,x2x_1,x_2,顯然,yi(wxi+b)>0y_i(w·x_i+b)>0,即被正確分類,不修改w,bw,b ;取點x3=(1,1)T,y3(w1x3+b1)<0x_3=(1,1)^T,y_3(w_1·x_3+b_1)<0,即滿足滿足yi(wxi+b)0y_i(w·x_i+b)\le0,未能被正確分類,故更新w,bw,b
    w2=w1+y3x3=[33]+(1)[11]=[22]=(2,2)Tw_2=w_1+y_3x_3=\begin{bmatrix} 3 \\ 3 \end{bmatrix}+(-1)·\begin{bmatrix} 1 \\ 1 \end{bmatrix}=\begin{bmatrix} 2 \\ 2 \end{bmatrix}=(2,2)^T
    b2=b1+y3=1+(1)=0b_2=b_1+y_3=1+(-1)=0
    得到線性模型:
    w2x+b2=[22]x+1=2x(1)+2x(2)+1w_2·x+b_2=\begin{bmatrix} 2 \\ 2 \end{bmatrix}·x +1=2x^{(1)}+2x^{(2)}+1
    (4)每次更新w,bw,b 就要從新遍歷整個訓練集,如此繼續下去,直到
    w7=(1,1)T,b7=3w_7=(1,1)^T,b_7=-3
    w7x+b7=[11]+(3)=x(1)+x(2)3w_7·x+b_7=\begin{bmatrix} 1 \\ 1 \end{bmatrix} +(-3)=x^{(1)}+x^{(2)}-3
    此時,對所有數據點yi(wyxi+b)>0y_i(w_y·x_i+b)>0,即沒有誤分類點,損失函數達到極小。
    分離超平面爲:x(1)+x(2)3=0x^{(1)}+x^{(2)}-3=0
    感知機模型爲:f(x)=sign(x(1)+x(2)3)f(x)=sign(x^{(1)}+x^{(2)}-3)

  • 求解的迭代過程

迭代次數 誤分類點取值順序 ww bb wx+bw·x+b
0 0 0 0
1 x1x_1 (3,3)T(3,3)^T 1 3x(1)+3x(2)+13x^{(1)}+3x^{(2)}+1
2 x3x_3 (2,2)T(2,2)^T 1 2x(1)+x(2)2x^{(1)}+x^{(2)}
3 x3x_3 (1,1)T(1,1)^T 1 x(1)+x(2)1x^{(1)}+x^{(2)}-1
4 x3x_3 (0,0)T(0,0)^T 1 2-2
5 x1x_1 (3,3)T(3,3)^T 1 3x(1)+3x(2)13x^{(1)}+3x^{(2)}-1
6 x3x_3 (2,2)T(2,2)^T 1 2x(1)+x(2)22x^{(1)}+x^{(2)}-2
7 x3x_3 (1,1)T(1,1)^T 1 x(1)+x(2)3x^{(1)}+x^{(2)}-3
8 00 (1,1)T(1,1)^T 1 x(1)+x(2)3x^{(1)}+x^{(2)}-3
  • 注:上述是在計算中誤分類點先後取x1,x3,x3,x3,,x1,x3,x3x_1,x_3,x_3,x_3,,x_1,x_3,x_3得到的分離超平面和感知機;如果在計算中誤分類點先後取x1,x3,x3,x3,,x2,x3,x3,x3,x1,x3,x3x_1,x_3,x_3,x_3,,x_2,x_3,x_3,x_3,x_1,x_3,x_3得到的分離超平面是2x(1)+x(2)52x^{(1)}+x^{(2)}-5

算法的代碼實現

import numpy.matlib 
import numpy as np 

w = np.zeros((1,2))
print(w)
b = 0
print(b)
while True:
    for index in data:
        x=0
        y=0
        for in_data in index:
            print("++++++")
            x = in_data
            y = index[in_data]
        print(x)
        value = np.array(x).reshape(2,1)
        print(value)
        print(np.dot(w,value))
        f = y*(np.dot(w,value) + b)
        print(f)
        if f[0][0]<=0:
            w = w + y*np.array(x)
            b = b+y
            print(w,b)
            flg = 1
            break

    if flg == 1:
        flg = 0
        continue
    else:
        break
print("==========")
print(w)
print(b)
[[ 0.  0.]]
0
++++++
(3, 3)
[[3]
 [3]]
[[ 0.]]
[[ 0.]]
[[ 3.  3.]] 1
++++++
(3, 3)
[[3]
 [3]]
[[ 18.]]
[[ 19.]]
++++++
(4, 3)
[[4]
 [3]]
[[ 21.]]
[[ 22.]]
++++++
(1, 1)
[[1]
 [1]]
[[ 6.]]
[[-7.]]
[[ 2.  2.]] 0
++++++
(3, 3)
[[3]
 [3]]
[[ 12.]]
[[ 12.]]
++++++
(4, 3)
[[4]
 [3]]
[[ 14.]]
[[ 14.]]
++++++
(1, 1)
[[1]
 [1]]
[[ 4.]]
[[-4.]]
[[ 1.  1.]] -1
++++++
(3, 3)
[[3]
 [3]]
[[ 6.]]
[[ 5.]]
++++++
(4, 3)
[[4]
 [3]]
[[ 7.]]
[[ 6.]]
++++++
(1, 1)
[[1]
 [1]]
[[ 2.]]
[[-1.]]
[[ 0.  0.]] -2
++++++
(3, 3)
[[3]
 [3]]
[[ 0.]]
[[-2.]]
[[ 3.  3.]] -1
++++++
(3, 3)
[[3]
 [3]]
[[ 18.]]
[[ 17.]]
++++++
(4, 3)
[[4]
 [3]]
[[ 21.]]
[[ 20.]]
++++++
(1, 1)
[[1]
 [1]]
[[ 6.]]
[[-5.]]
[[ 2.  2.]] -2
++++++
(3, 3)
[[3]
 [3]]
[[ 12.]]
[[ 10.]]
++++++
(4, 3)
[[4]
 [3]]
[[ 14.]]
[[ 12.]]
++++++
(1, 1)
[[1]
 [1]]
[[ 4.]]
[[-2.]]
[[ 1.  1.]] -3
++++++
(3, 3)
[[3]
 [3]]
[[ 6.]]
[[ 3.]]
++++++
(4, 3)
[[4]
 [3]]
[[ 7.]]
[[ 4.]]
++++++
(1, 1)
[[1]
 [1]]
[[ 2.]]
[[ 1.]]
==========
[[ 1.  1.]]
-3
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章