Redes Neuronales

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

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *