"""
Estocastico-MSE-AULA-U856.py
************************************
Ejecución bajo consola de Linux:
python3 Estocastico-MSE-AULA-U856.py
"""
import numpy as np
import matplotlib.pyplot as plt
# Función de pérdida (MSE) y gradiente
def mse_loss(y_true, y_pred):
return np.mean((y_true - y_pred) ** 2)
def gradient_mse(y_true, y_pred, X):
n = len(X)
grad_theta0 = (-2 / n) * np.sum(y_true - y_pred)
grad_theta1 = (-2 / n) * np.sum((y_true - y_pred) * X)
return grad_theta0, grad_theta1
"""
Derivada de MSE con respecto a theta0:
∂MSE/∂theta0 = (1/n) * Σ(yi - (theta0 + theta1 * xi)) * (-1)
Derivada de MSE con respecto a theta1:
∂MSE/∂theta1 = (1/n) * Σ(yi - (theta0 + theta1 * xi)) * (-xi)
"""
# Datos de entrenamiento
np.random.seed(0)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1) # Incluye ruido
# Inicialización de parámetros
theta0 = 0.5
theta1 = 0.5
# Hiperparámetros de SGD
learning_rate = 0.01
epochs = 10
# Listas para almacenar el historial de costos y los parámetros
cost_history = []
theta0_history = []
theta1_history = []
# Algoritmo de SGD
for epoch in range(epochs):
for i in range(len(X)):
# Selección aleatoria de un punto de datos
random_index = np.random.randint(0, len(X))
xi = X[random_index]
yi = y[random_index]
# Cálculo de la predicción
prediction = theta0 + theta1 * xi
# Cálculo del gradiente utilizando MSE
grad_theta0, grad_theta1 = gradient_mse(yi, prediction, xi)
# Actualización de parámetros
theta0 -= learning_rate * grad_theta0
theta1 -= learning_rate * grad_theta1
# Cálculo de la pérdida total en esta época utilizando MSE
y_pred = theta0 + theta1 * X
total_loss = mse_loss(y, y_pred)
# Almacenar el historial de costos y parámetros
cost_history.append(total_loss)
theta0_history.append(theta0)
theta1_history.append(theta1)
# Imprimir la pérdida en cada época
print(f'Época {epoch+1}/{epochs}, Pérdida: {total_loss}')
# Parámetros finales
print(f'Parámetro theta0: {theta0}')
print(f'Parámetro theta1: {theta1}')
# Gráfico de ajuste lineal
plt.figure(figsize=(12, 6))
plt.scatter(X, y, label='Datos de entrenamiento')
plt.plot(X, theta0 + theta1 * X, color='red', label='Ajuste Lineal')
plt.xlabel('X')
plt.ylabel('y')
plt.legend()
plt.title('Ajuste Lineal con SGD y MSE')
plt.show()
# Gráfico del historial de costos
plt.figure(figsize=(12, 6))
plt.plot(range(epochs), cost_history, color='black', marker='o', markerfacecolor='red')
plt.xlabel('Época')
plt.ylabel('Pérdida (MSE)')
plt.title('Historial de Costos (MSE)')
plt.show()
"""
SALIDA IMPRIMIDA POR CONSOLA:
Época 1/10, Pérdida: 1.1932064385323073
Época 2/10, Pérdida: 1.1314938489460211
Época 3/10, Pérdida: 1.0477628396384442
Época 4/10, Pérdida: 1.0335604942750691
Época 5/10, Pérdida: 1.0475480258456065
Época 6/10, Pérdida: 1.035285300712662
Época 7/10, Pérdida: 1.0888298420413163
Época 8/10, Pérdida: 0.9958454978499078
Época 9/10, Pérdida: 0.9990065328074037
Época 10/10, Pérdida: 1.04096915247266
Parámetro theta0: 4.329576305574221
Parámetro theta1: 3.0780458813595915
"""