感知机——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

感知机——R实现_第1张图片

:构建最优化问题:


按照算法求解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和书中的结果不一样呢?这是迭代的顺序不一致,可见,感知机学习算法由于采用不同的初值或者选取不同的误分类点,解可以不同。

此为感知机学习算法的原始形式,后补上对偶形式。

感知机理论可见: 统计学习方法笔记(二)感知机学习

欢迎交流~~



你可能感兴趣的:(R,Programming)