Я пытался создать свой собственный алгоритм персептрона.Но, похоже, что алгоритм останавливается в первой эпохе, и в результате не существует правильной классификации.Ниже приведена моя реализация алгоритма персептрона в R.
x1 <- runif(30,-1,1)
x2 <- runif(30,-1,1)
x <- cbind(x1,x2)
w = matrix(0,3,1) # initialize weights for x1, x2, bias
b <- c(0,0) # bias = 0
xb<- cbind(x,b) # importing bias (x1,x2,b)
y <- ifelse(x2>0.5+x1,+1,-1) #y target
perceptron = function(xb,y,w, learning.rate=0.5){
k = 1000 # count epochs
error <- matrix(, nrow = nrow(xb), ncol = k, byrow = TRUE)
#xb[,3] is the col of biases
for (j in 1:k) {
for (i in 1:nrow(x)) {
yc <- sum(xb[i,] * w) #ycomputed
error[i,k] <- y[i] - yc
if (y[i] != yc) {
w <- w + learning.rate * error[i,k] * x[i,]
xb[i,3] <- xb[i,3] + learning.rate * error[i,k] #b <- b + learning.rate * (y[i]-yc)
}
else {
w <- w
xb[i,3] <- xb[i,3]
}
}
return(list(w,xb[,3],error[,k]))
if (w[k] == w[k-1]){
break
}
}
}
Кроме того, с моей стороны, похоже, возникла вычислительная ошибка, начиная с:
w <- w +learning.rate * error [i, k] * x [i,] </p>
Для вышеизложенного на консоли появляется этот комментарий: «Ошибка в cat (» 1: В w + learning.rate* error * x [i,]: \ n длинная длина объекта не кратна короткой длине объекта ",: аргумент 2 (тип 'список') не может быть обработан 'cat' Кроме того: было 30 предупреждений (используйте предупреждения(), чтобы увидеть их) ". Я не могу понять из этого, потому что на мой взгляд, это не проблема, так как это вектор (w), умноженный на число (learning.rate * error * x[я,]). Спасибо за то, что уделили мне время и ответили на мой вопрос.