In [10]:
import numpy as np
import matplotlib.pyplot as plt
# Se define una función cuadrática y su derivada
def f(x):
return x**2 + 2*x + 2
def df(x):
return 2*x + 2
# Los parámetros para el descenso de gradiente
x_start = 3.0 # Punto de inicio
learning_rate = 0.1 # Tasa de aprendizaje
num_iterations = 100 # Número de iteraciones
# Descenso de gradiente
x = x_start
x_values = [x]
for _ in range(num_iterations):
x -= learning_rate * df(x)
x_values.append(x)
# Graficamos la función y el camino del descenso de gradiente
x = np.linspace(-3, 3, 400)
y = f(x)
plt.figure(figsize=(10, 5))
plt.plot(x, y, label='f(x) = x^2 + 2x + 2')
plt.scatter(x_values, f(np.array(x_values)), color='red', zorder=5)
plt.plot(x_values, f(np.array(x_values)), color='red', linestyle='--', zorder=5)
plt.title('Descenso de gradiente en f(x)')
plt.xlabel('x')
plt.ylabel('f(x)')
plt.legend()
plt.grid(True)
plt.show()
Caso Aplicado en ML
In [9]:
import numpy as np
import matplotlib.pyplot as plt
# Se generan datos sintéticos para la regresión lineal
np.random.seed(1000)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
# Se agregan una columna de unos a X para el término de sesgo
X_b = np.c_[np.ones((100, 1)), X]
# Función de costo (Error Cuadrático Medio)
def mse_cost_function(y, y_pred):
return np.mean((y - y_pred) ** 2)
# Gradiente del Error Cuadrático Medio con respecto a theta
def mse_gradient(X_b, y, theta):
gradients = 2 / len(X_b) * X_b.T.dot(X_b.dot(theta) - y)
return gradients
# Descenso del gradiente para entrenar el modelo
def gradient_descent(X_b, y, learning_rate, n_iterations):
theta = np.random.randn(2, 1) # Inicialización aleatoria de los parámetros
cost_history = []
for iteration in range(n_iterations):
gradients = mse_gradient(X_b, y, theta)
theta = theta - learning_rate * gradients
cost = mse_cost_function(y, X_b.dot(theta))
cost_history.append(cost)
return theta, cost_history
#Tasa de aprendizaje y el número de iteraciones
learning_rate = 0.1
n_iterations = 100
# Entrenamiento del modelo utilizando descenso del gradiente
theta_best, cost_history = gradient_descent(X_b, y, learning_rate, n_iterations)
# Gráfico del descenso del costo durante el entrenamiento
plt.figure(figsize=(10, 6))
plt.plot(range(n_iterations), cost_history, color='blue', linewidth=2, linestyle='-')
plt.xlabel('Número de Iteraciones', fontsize=14)
plt.ylabel('Costo', fontsize=14)
plt.title('Descenso del Costo durante el Entrenamiento', fontsize=16)
plt.grid(True)
plt.show()