Redes neuronales. Creando una Neurona Artificial en R desde Cero
Imagina una neurona artificial como una pequeña balanza de decisiones. Recibe diferentes pistas, les asigna una importancia (peso), añade su propio criterio (sesgo) y, finalmente, decide si activa o no una respuesta.
Para este artículo, crearemos un ejemplo muy visual: programaremos una neurona que decida si un aguacate está listo para comer (1) o no (0) basándose en dos entradas visuales: Color (oscuro o verde) y Firmeza (blando o duro).

Paso 1: El motor matemático (Activación)
Para que nuestra neurona no devuelva números locos, usamos la función sigmoide. Esta función matemática comprime cualquier resultado de la balanza y lo transforma en una probabilidad limpia entre 0 y 1.
R
# Componente 1: Compresor de probabilidad (Sigmoide)
mi_sigmoide <- function(valor_z) {
1 / (1 + exp(-valor_z))
}
Paso 2: Estructurando la Neurona
Nuestra función principal tomará los datos, multiplicará las pistas por su importancia, sumará el sesgo y pasará el resultado por el compresor.
R
# Componente 2: La Neurona Artificial básica
mi_neurona <- function(datos_X, pesos_W, sesgo_b) {
# Multiplicación matricial rápida de entradas y pesos + sesgo
combinacion_lineal <- sum(datos_X * pesos_W) + sesgo_b
# Retornamos la probabilidad final
return(mi_sigmoide(combinacion_lineal))
}
Paso 3: El Algoritmo de Aprendizaje (Entrenamiento)
Aquí ocurre la magia. Al principio, la neurona fallará porque sus pesos son aleatorios. El algoritmo revisará los datos una y otra vez (épocas), calculará el error y corregirá el rumbo usando el gradiente descendente.
R
# 1. Datos de entrenamiento (1 = Óptimo/Maduro, 0 = Inmaduro/Pasado)
# Columnas: [Color Oscuro (0/1), Textura Suave (0/1)]
aguacates_X <- matrix(c(
0, 0, # Verde y duro (No)
0, 1, # Verde y blando (No)
1, 0, # Oscuro y duro (No)
1, 1 # Oscuro y blando (¡Sí!)
), ncol = 2, byrow = TRUE)
respuestas_Y <- c(0, 0, 0, 1)
# 2. Inicialización a ciegas
set.seed(42) # Para que tus lectores obtengan el mismo resultado
mis_pesos <- runif(2, -1, 1)
mi_sesgo <- runif(1, -1, 1)
tasa_aprendizaje <- 0.1
ciclos <- 2000
# Vector para guardar el historial del error y graficarlo después
historial_error <- numeric(ciclos)
# 3. Bucle de optimización
for (ciclo in 1:ciclos) {
error_total_ciclo <- 0
for (i in 1:nrow(aguacates_X)) {
x_actual <- aguacates_X[i, ]
y_real <- respuestas_Y[i]
# Predicción y cálculo del error
prediccion <- mi_neurona(x_actual, mis_pesos, mi_sesgo)
error_individual <- y_real - prediccion
error_total_ciclo <- error_total_ciclo + error_individual^2
# Ajuste de parámetros según la derivada de la sigmoide
factor_ajuste <- tasa_aprendizaje * error_individual * prediccion * (1 - prediccion)
mis_pesos <- mis_pesos + factor_ajuste * x_actual
mi_sesgo <- mi_sesgo + factor_ajuste
}
historial_error[ciclo] <- error_total_ciclo / nrow(aguacates_X)
}
Paso 4: Generando los Gráficos
Este bloque de código te generará de forma nativa la curva de aprendizaje de tu neurona. Puedes exportarla como PNG o JPEG

# 1. Abrimos el lienzo y dibujamos la línea principal
plot(historial_error, type = "l", col = "#2ca02c", lwd = 3,
main = "Curva de Aprendizaje de la Neurona",
xlab = "Épocas (Iteraciones de entrenamiento)",
ylab = "Error Cuadrático Medio")
# 2. Ahora que el lienzo está activo, añadimos la cuadrícula de fondo
grid(lwd = 1, col = "gray80")
# 3. Finalmente, rellenamos el área bajo la curva para el efecto visual
polygon(c(1, 1:ciclos, ciclos), c(0, historial_error, 0),
col = rgb(44, 160, 44, 40, maxColorValue = 255), border = NA)
¿Cómo se ve el resultado final?
Si pones a prueba la neurona entrenada con este código:
for (i in 1:nrow(aguacates_X)) {
final <- mi_neurona(aguacates_X[i,], mis_pesos, mi_sesgo)
cat("Aguacate", i, "-> Probabilidad de estar listo:", round(final * 100, 1), "%\n")
}
Aguacate 1 -> Probabilidad de estar listo: 0.4 %
Aguacate 2 -> Probabilidad de estar listo: 13.2 %
Aguacate 3 -> Probabilidad de estar listo: 13.2 %
Aguacate 4 -> Probabilidad de estar listo: 84.2 %
Verás que el cuarto escenario (oscuro y blando) arrojará una certeza cercana al 99%, demostrando que tu neurona ha aprendido la lógica a la perfección.
Deja una respuesta