1. 程式人生 > >感知機——R實現

感知機——R實現

對於訓練資料集,其中正例點是x1=(3,3)T,x2=(4,3)T,負例點為x3=(1,1)T,用感知機學習演算法的原始形式求感知機模型f(x)=w·x+b。這裡w=(w(1),w(2))T,x=(x(1),x(2))T


:構建最優化問題:


按照演算法求解w, b。η=1

(1)取初值w0=0, b0=0

(2)對於(3,3):-(0+0)+0=0未被正確分類。更新w,b

               w1=w0+1*y1·x1 = (0,0)T+1(3,3)T=(3,3)T

               b1=b0+y1=1

         得到線性模型w1x+b1 = 3x(1)+3x(2)

+1

(3)返回(2)繼續尋找yi(w·xi+b)≤0的點,更新w,b。

x1和x2都yi(w·xi+b)大於0,x3被錯誤分類。

w2 = w1 + 1* y3* x3 = (3, 3)T + 1* (-1)*(1, 1)T = (2, 2)T

b2 = b1+ y3 = 1 -1 = 0

得到線性模型 w2x+ b2 = 2x(1)+2x(2)

直到對於所有的點yi(w·xi+b)>0,沒有誤分類點,損失函式達到最小。

分離超平面為x(1)+x(2)-3=0

結果不是唯一,與初始值有關

R程式碼:

x <- matrix(c(3,3,4,3,1,1), nrow = 3, byrow = TRUE)
y <- c(1,1,-1)
w <- matrix(c(0,0), nrow = 2, byrow = TRUE)
b <- 0
m <- length(y)

count = 0;
while (count < m){
  for (i in 1:m){
    if ((x[i,] %*% w * y[i]) <=0){
      y1 = matrix(c(y[i], y[i]), nrow = 2, byrow = TRUE)
      w = w + (1 * x[i,] * y1)
      b = b + 1 * y[i]
    }
    else{
      count = count + 1
    }
  }
}
x1 = c(0:0.1:5)
x2 = -(b + w[1] * x1)/w[2]
lines(x1,x2)

最終返回結果

> b
[1] -1
> w
     [,1]
[1,]    1
[2,]    1

即超平面為x(1)+x(2)-1=0,為什麼b和書中的結果不一樣呢?這是迭代的順序不一致,可見,感知機學習演算法由於採用不同的初值或者選取不同的誤分類點,解可以不同。

此為感知機學習演算法的原始形式,後補上對偶形式。

歡迎交流~~