# 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
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
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
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
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
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
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
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
Este ejercicio demuestra el aprendizaje iterativo por épocas donde:
Los parámetros finales deberían permitir al modelo clasificar correctamente la función AND lógica.