Ejercicio 7.0.23 - Estimación con Compuertas Lógicas AND (2 Épocas)

Datos del problema

# Datos de la compuerta lógica AND
X1 <- c(0, 0, 1, 1)
X2 <- c(0, 1, 0, 1) 
Y <- c(0, 0, 0, 1)  # salida AND

datos <- data.frame(X1, X2, Y)
print(datos)
##   X1 X2 Y
## 1  0  0 0
## 2  0  1 0
## 3  1  0 0
## 4  1  1 1

Estimación iterativa por observaciones (2 épocas cada una)

Vamos a estimar los parámetros β₀, β₁, β₂ actualizándolos iterativamente para cada observación, realizando 2 épocas (2 iteraciones) por cada observación.

# Parámetros iniciales
beta0 <- 0.1  # intercepto
beta1 <- 0.1  # peso para X1  
beta2 <- 0.1  # peso para X2
eta <- 0.25  # tasa de aprendizaje
  
# Función sigmoide
sigmoid <- function(z) {
  1 / (1 + exp(-z))
}

cat("Parámetros iniciales:\n")
## Parámetros iniciales:
cat("β₀ =", beta0, ", β₁ =", beta1, ", β₂ =", beta2, "\n\n")
## β₀ = 0.1 , β₁ = 0.1 , β₂ = 0.1

a. Primera observación x=(0,0), y=0 - 2 Épocas

cat("=== OBSERVACIÓN 1: x=(0,0), y=0 ===\n")
## === OBSERVACIÓN 1: x=(0,0), y=0 ===
x1 <- 0; x2 <- 0; y_real <- 0

# ÉPOCA 1
z1 <- beta0 + beta1*x1 + beta2*x2
y_pred1 <- sigmoid(z1)
error1 <- y_real - y_pred1

cat("Época 1:\n")
## Época 1:
cat("z =", z1, "\n")
## z = 0.1
cat("y_pred =", round(y_pred1, 4), "\n")
## y_pred = 0.525
cat("error =", round(error1, 4), "\n")
## error = -0.525
# Actualizar parámetros
beta0_new <- beta0 + eta * error1
beta1_new <- beta1 + eta * error1 * x1
beta2_new <- beta2 + eta * error1 * x2

cat("Nuevos parámetros: β₀ =", round(beta0_new, 4), ", β₁ =", round(beta1_new, 4), ", β₂ =", round(beta2_new, 4), "\n")
## Nuevos parámetros: β₀ = -0.0312 , β₁ = 0.1 , β₂ = 0.1
# ÉPOCA 2
beta0 <- beta0_new; beta1 <- beta1_new; beta2 <- beta2_new
z2 <- beta0 + beta1*x1 + beta2*x2
y_pred2 <- sigmoid(z2)
error2 <- y_real - y_pred2

cat("\nÉpoca 2:\n")
## 
## Época 2:
cat("z =", round(z2, 4), "\n")
## z = -0.0312
cat("y_pred =", round(y_pred2, 4), "\n")
## y_pred = 0.4922
cat("error =", round(error2, 4), "\n")
## error = -0.4922
# Actualizar parámetros
beta0 <- beta0 + eta * error2
beta1 <- beta1 + eta * error2 * x1
beta2 <- beta2 + eta * error2 * x2

cat("Parámetros finales obs 1: β₀ =", round(beta0, 4), ", β₁ =", round(beta1, 4), ", β₂ =", round(beta2, 4), "\n\n")
## Parámetros finales obs 1: β₀ = -0.1543 , β₁ = 0.1 , β₂ = 0.1

b. Segunda observación x=(0,1), y=0 - 2 Épocas

cat("=== OBSERVACIÓN 2: x=(0,1), y=0 ===\n")
## === OBSERVACIÓN 2: x=(0,1), y=0 ===
x1 <- 0; x2 <- 1; y_real <- 0

# ÉPOCA 1
z1 <- beta0 + beta1*x1 + beta2*x2
y_pred1 <- sigmoid(z1)
error1 <- y_real - y_pred1

cat("Época 1:\n")
## Época 1:
cat("z =", round(z1, 4), "\n")
## z = -0.0543
cat("y_pred =", round(y_pred1, 4), "\n")
## y_pred = 0.4864
cat("error =", round(error1, 4), "\n")
## error = -0.4864
# Actualizar parámetros
beta0_new <- beta0 + eta * error1
beta1_new <- beta1 + eta * error1 * x1
beta2_new <- beta2 + eta * error1 * x2

cat("Nuevos parámetros: β₀ =", round(beta0_new, 4), ", β₁ =", round(beta1_new, 4), ", β₂ =", round(beta2_new, 4), "\n")
## Nuevos parámetros: β₀ = -0.2759 , β₁ = 0.1 , β₂ = -0.0216
# ÉPOCA 2
beta0 <- beta0_new; beta1 <- beta1_new; beta2 <- beta2_new
z2 <- beta0 + beta1*x1 + beta2*x2
y_pred2 <- sigmoid(z2)
error2 <- y_real - y_pred2

cat("\nÉpoca 2:\n")
## 
## Época 2:
cat("z =", round(z2, 4), "\n")
## z = -0.2975
cat("y_pred =", round(y_pred2, 4), "\n")
## y_pred = 0.4262
cat("error =", round(error2, 4), "\n")
## error = -0.4262
# Actualizar parámetros
beta0 <- beta0 + eta * error2
beta1 <- beta1 + eta * error2 * x1
beta2 <- beta2 + eta * error2 * x2

cat("Parámetros finales obs 2: β₀ =", round(beta0, 4), ", β₁ =", round(beta1, 4), ", β₂ =", round(beta2, 4), "\n\n")
## Parámetros finales obs 2: β₀ = -0.3824 , β₁ = 0.1 , β₂ = -0.1281

c. Tercera observación x=(1,1), y=1 - 2 Épocas

cat("=== OBSERVACIÓN 3: x=(1,1), y=1 ===\n")
## === OBSERVACIÓN 3: x=(1,1), y=1 ===
x1 <- 1; x2 <- 1; y_real <- 1

# ÉPOCA 1
z1 <- beta0 + beta1*x1 + beta2*x2
y_pred1 <- sigmoid(z1)
error1 <- y_real - y_pred1

cat("Época 1:\n")
## Época 1:
cat("z =", round(z1, 4), "\n")
## z = -0.4106
cat("y_pred =", round(y_pred1, 4), "\n")
## y_pred = 0.3988
cat("error =", round(error1, 4), "\n")
## error = 0.6012
# Actualizar parámetros
beta0_new <- beta0 + eta * error1
beta1_new <- beta1 + eta * error1 * x1
beta2_new <- beta2 + eta * error1 * x2

cat("Nuevos parámetros: β₀ =", round(beta0_new, 4), ", β₁ =", round(beta1_new, 4), ", β₂ =", round(beta2_new, 4), "\n")
## Nuevos parámetros: β₀ = -0.2321 , β₁ = 0.2503 , β₂ = 0.0222
# ÉPOCA 2
beta0 <- beta0_new; beta1 <- beta1_new; beta2 <- beta2_new
z2 <- beta0 + beta1*x1 + beta2*x2
y_pred2 <- sigmoid(z2)
error2 <- y_real - y_pred2

cat("\nÉpoca 2:\n")
## 
## Época 2:
cat("z =", round(z2, 4), "\n")
## z = 0.0403
cat("y_pred =", round(y_pred2, 4), "\n")
## y_pred = 0.5101
cat("error =", round(error2, 4), "\n")
## error = 0.4899
# Actualizar parámetros
beta0 <- beta0 + eta * error2
beta1 <- beta1 + eta * error2 * x1
beta2 <- beta2 + eta * error2 * x2

cat("Parámetros finales obs 3: β₀ =", round(beta0, 4), ", β₁ =", round(beta1, 4), ", β₂ =", round(beta2, 4), "\n\n")
## Parámetros finales obs 3: β₀ = -0.1097 , β₁ = 0.3728 , β₂ = 0.1446

d. Cuarta observación x=(1,0), y=0 - 2 Épocas

cat("=== OBSERVACIÓN 4: x=(1,0), y=0 ===\n")
## === OBSERVACIÓN 4: x=(1,0), y=0 ===
x1 <- 1; x2 <- 0; y_real <- 0

# ÉPOCA 1
z1 <- beta0 + beta1*x1 + beta2*x2
y_pred1 <- sigmoid(z1)
error1 <- y_real - y_pred1

cat("Época 1:\n")
## Época 1:
cat("z =", round(z1, 4), "\n")
## z = 0.2631
cat("y_pred =", round(y_pred1, 4), "\n")
## y_pred = 0.5654
cat("error =", round(error1, 4), "\n")
## error = -0.5654
# Actualizar parámetros
beta0_new <- beta0 + eta * error1
beta1_new <- beta1 + eta * error1 * x1
beta2_new <- beta2 + eta * error1 * x2

cat("Nuevos parámetros: β₀ =", round(beta0_new, 4), ", β₁ =", round(beta1_new, 4), ", β₂ =", round(beta2_new, 4), "\n")
## Nuevos parámetros: β₀ = -0.251 , β₁ = 0.2314 , β₂ = 0.1446
# ÉPOCA 2
beta0 <- beta0_new; beta1 <- beta1_new; beta2 <- beta2_new
z2 <- beta0 + beta1*x1 + beta2*x2
y_pred2 <- sigmoid(z2)
error2 <- y_real - y_pred2

cat("\nÉpoca 2:\n")
## 
## Época 2:
cat("z =", round(z2, 4), "\n")
## z = -0.0196
cat("y_pred =", round(y_pred2, 4), "\n")
## y_pred = 0.4951
cat("error =", round(error2, 4), "\n")
## error = -0.4951
# Actualizar parámetros
beta0 <- beta0 + eta * error2
beta1 <- beta1 + eta * error2 * x1
beta2 <- beta2 + eta * error2 * x2

cat("Parámetros finales obs 4: β₀ =", round(beta0, 4), ", β₁ =", round(beta1, 4), ", β₂ =", round(beta2, 4), "\n\n")
## Parámetros finales obs 4: β₀ = -0.3748 , β₁ = 0.1077 , β₂ = 0.1446

Resumen de parámetros finales

cat("=== PARÁMETROS FINALES ESTIMADOS ===\n")
## === PARÁMETROS FINALES ESTIMADOS ===
cat("β₀ (intercepto) =", round(beta0, 4), "\n")
## β₀ (intercepto) = -0.3748
cat("β₁ (peso X1) =", round(beta1, 4), "\n") 
## β₁ (peso X1) = 0.1077
cat("β₂ (peso X2) =", round(beta2, 4), "\n")
## β₂ (peso X2) = 0.1446

Evaluación del modelo entrenado

cat("=== EVALUACIÓN FINAL ===\n")
## === EVALUACIÓN FINAL ===
# Evaluar en todos los casos
for(i in 1:nrow(datos)) {
  x1 <- datos$X1[i]
  x2 <- datos$X2[i]
  y_real <- datos$Y[i]
  
  z <- beta0 + beta1*x1 + beta2*x2
  y_pred <- sigmoid(z)
  y_clase <- ifelse(y_pred > 0.5, 1, 0)
  
  cat("X1=", x1, ", X2=", x2, " | Real:", y_real, 
      " | Predicho:", round(y_pred, 4), 
      " | Clase:", y_clase, "\n")
}
## X1= 0 , X2= 0  | Real: 0  | Predicho: 0.4074  | Clase: 0 
## X1= 0 , X2= 1  | Real: 0  | Predicho: 0.4427  | Clase: 0 
## X1= 1 , X2= 0  | Real: 0  | Predicho: 0.4336  | Clase: 0 
## X1= 1 , X2= 1  | Real: 1  | Predicho: 0.4694  | Clase: 0

Interpretación

Este ejercicio demuestra el aprendizaje iterativo por épocas donde:

  1. 2 épocas por observación: Cada punto de datos se usa para actualizar los parámetros dos veces consecutivas
  2. Aprendizaje secuencial: Los parámetros se actualizan después de cada observación individual
  3. Regla delta: Se usa la diferencia entre valor real y predicho para ajustar los pesos
  4. Función sigmoide: Transforma la combinación lineal en una probabilidad entre 0 y 1

Los parámetros finales deberían permitir al modelo clasificar correctamente la función AND lógica.