R中的手动Perceptron示例是可接受的结果吗?

时间:2016-06-25 00:05:01

标签: r machine-learning

我正在尝试使用感知器算法进行分类工作,但我认为缺少某些东西。这是使用逻辑回归实现的决策边界:

enter image description here

在测试1和2表现更好之后,红点进入了大学。

This is the data,这是R:

中逻辑回归的代码
dat = read.csv("perceptron.txt", header=F)
colnames(dat) = c("test1","test2","y")
plot(test2 ~ test1, col = as.factor(y), pch = 20, data=dat)
fit = glm(y ~ test1 + test2, family = "binomial", data = dat)
coefs = coef(fit)
(x = c(min(dat[,1])-2,  max(dat[,1])+2))
(y = c((-1/coefs[3]) * (coefs[2] * x + coefs[1])))
lines(x, y)

感知器“手动”实现的代码如下:

# DATA PRE-PROCESSING:
dat = read.csv("perceptron.txt", header=F)
dat[,1:2] = apply(dat[,1:2], MARGIN = 2, FUN = function(x) scale(x)) # scaling the data
data = data.frame(rep(1,nrow(dat)), dat) # introducing the "bias" column
colnames(data) = c("bias","test1","test2","y")
data$y[data$y==0] = -1 # Turning 0/1 dependent variable into -1/1.
data = as.matrix(data) # Turning data.frame into matrix to avoid mmult problems.

# PERCEPTRON:
set.seed(62416)
no.iter = 1000                           # Number of loops
theta = rnorm(ncol(data) - 1)            # Starting a random vector of coefficients.
theta = theta/sqrt(sum(theta^2))         # Normalizing the vector.
h = theta %*% t(data[,1:3])              # Performing the first f(theta^T X)

for (i in 1:no.iter){                    # We will recalculate 1,000 times
  for (j in 1:nrow(data)){               # Each time we go through each example.
      if(h[j] * data[j, 4] < 0){         # If the hypothesis disagrees with the sign of y,
      theta = theta + (sign(data[j,4]) * data[j, 1:3]) # We + or - the example from theta.
      }
      else
      theta = theta                      # Else we let it be.
  }
  h = theta %*% t(data[,1:3])            # Calculating h() after iteration.
}
theta                                    # Final coefficients
mean(sign(h) == data[,4])                # Accuracy

有了这个,我得到以下系数:

     bias     test1     test2 
 9.131054 19.095881 20.736352 

,准确度为88%,与使用glm()逻辑回归函数计算的一致:mean(sign(predict(fit))==data[,4]) 89% - 从逻辑上讲,无法对所有线性分类这些点,从上面的情节可以看出。事实上,只迭代10次并绘制精确度,~90%只需1次迭代即可到达:

enter image description here

与逻辑回归的训练分类表现一致,代码可能在概念上没有错误。

问题:可以使系数与逻辑回归如此不同:

(Intercept)       test1       test2 
   1.718449    4.012903    3.743903 

1 个答案:

答案 0 :(得分:1)

这实际上是一个CrossValidated问题,而不是StackOverflow问题,但我会继续回答。

是的,它是正常的并且预计会得到非常不同的系数,因为你无法直接比较这两种技术之间的系数大小。

使用logit(logistic)模型,您可以使用基于sigmoid成本函数的二项分布和logit-link。系数仅在此上下文中有意义。您在logit中也有一个拦截术语。

对于感知器模型而言,这都不是真的。因此,系数的解释完全不同。

现在,没有说明哪种型号更好。您的问题中没有可比的性能指标可供我们确定。确定您应该进行交叉验证或至少使用保留样本。