感知機——R實現
阿新 • • 發佈:2019-01-29
對於訓練資料集,其中正例點是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)
(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和書中的結果不一樣呢?這是迭代的順序不一致,可見,感知機學習演算法由於採用不同的初值或者選取不同的誤分類點,解可以不同。
此為感知機學習演算法的原始形式,後補上對偶形式。
歡迎交流~~