我正在尝试使用感知器算法进行分类工作,但我认为缺少某些东西。这是通过逻辑回归实现的决策边界:
在测试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
:与逻辑回归的训练分类性能一致,该代码在概念上可能不是错误的。
问题:是否可以使系数与逻辑回归有如此大的不同:
(Intercept) test1 test2
1.718449 4.012903 3.743903
最佳答案
这实际上是一个CrossValidated问题,而不是StackOverflow问题,但我将继续回答。
是的,由于您无法直接比较这两种技术之间的系数幅度,因此正常情况下并期望得到非常不同的系数。
使用logit(物流)模型时,您使用的是二项式分布和基于S型成本函数的logit-link。系数仅在这种情况下才有意义。您在Logit中也有一个拦截项。
对于感知器模型,这都不是正确的。因此,系数的解释完全不同。
现在,这并不是说哪种型号更好。您的问题中没有可比的绩效指标,因此我们无法确定。要确定您应该进行交叉验证,还是至少使用保留样本。
关于r - R中的手动感知器示例-结果是否可接受?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38023678/