См. Ниже исправленный алгоритм, так как в алогрите были некоторые ошибки (вычисление функции активации [я взял функцию активации Хевисайда], размерность).Я пометил их в #m
справа от кода.Также как я заменил ggplot2
на base::plot
функцию внутри алгоритма вычислений из-за ggplot2
внутренней механики.Пожалуйста, смотрите результаты, как показано ниже:
train_data <- structure(list(x_1 = c(0, 1, 4, 5, 6, 8, 2, 3, 5, 9, 12, 14,
15, 16, 17, 20, 19, 16, 18, 19, 0, 2, 3, 4, 5, 6), x_2 = c(1,
4, 13, 2, 14, 15, 3, 7, 8, 11, 12, 20, 16, 14, 5, 6, 8, 9, 12,
10, 11, 16, 17, 20, 20, 19), y_d = c(1, 1, 0, 1, 0, 0, 1, 1,
1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0)), class = "data.frame",
row.names = c(NA, -26L))
plot(train_data$x_1, train_data$x_2, type = "n")
perceptron <- function(x, y, rate, epoch){
weight_vector <- rep(0, ncol(x) + 1) #m
error <- rep(0, epoch)
for (i in 1:epoch) {
for (j in 1:length(y)) { #m
output <- sum(weight_vector[2:length(weight_vector)] *
as.numeric(x[j, ])) + weight_vector[1] #m
if (output < 0) {
ypred <- -1
points(x[j, 1], x[j, 2], col = "red", pch = 19, cex = 2)
} else {
ypred <- 1
points(x[j, 1], x[j, 2], col = "blue", pch = 19, cex = 2)
}
weightdiff <- rate * (y[j] - ypred) * c(1, as.numeric(x[j, ])) #m
weight_vector <- weight_vector + weightdiff
if((y[j] - ypred) != 0.0){
error[i] <- error[i] + 1
}
}
}
return(error)
}
x <- train_data[, c(1,2)]
y <- train_data[, 3]
perceptron(x, y, 0.01, 100)
Вывод:
[1] 13 13 13 15 10 11 11 11 14 14 11 11 10 12 10 11 11 12 13 11 12 10 11 11 12 13 11 12 13 11 11 12 10 12 10
[36] 12 10 12 10 10 10 11 12 11 12 11 12 11 12 11 12 11 12 11 12 12 11 11 12 12 11 11 12 12 11 11 10 11 12 11
[71] 10 12 12 11 11 10 11 12 11 12 10 12 12 10 12 11 10 11 10 12 10 12 10 10 11 10 12 10 12 10
Графика: