Código de Python - Descenso de Gradiente Aula-28

Imágen de perfil

Descenso de Gradiente Aula-28gráfica de visualizaciones


Python

Publicado el 29 de Octubre del 2023 por Hilario (122 códigos)
354 visualizaciones desde el 29 de Octubre del 2023
[center]descarga

descarga-2

En este sencillo ejercicio:Descn_Mult_Momentun_Ejemp_Aula-28-Oct.py, tratamos de explicar como realizar un descenso de gradiente multiple, aplicando al mismo un momentum, para regular un descenso de gradiente , digamos, rápido de forma que el mismo no sea errático.

Una regresión múltiple es un tipo de análisis de regresión en el que se busca modelar la relación entre una variable de respuesta (dependiente) y múltiples variables predictoras (independientes o características). En otras palabras, en lugar de predecir una única variable de respuesta a partir de una única característica, se intenta predecir una variable de respuesta a partir de dos o más características. La regresión múltiple puede ser útil para comprender cómo varias características influyen en la variable de respuesta.

Cuando aplicas "momentum" a un algoritmo de regresión, normalmente estás utilizando una variante del descenso de gradiente llamada "descenso de gradiente con momentum." El momentum es una técnica que ayuda a acelerar la convergencia del algoritmo de descenso de gradiente, especialmente en problemas en los que el parámetro de costo es irregular, o tiene pendientes pronunciadas. En lugar de utilizar únicamente el gradiente instantáneo en cada iteración, el descenso de gradiente con momentum tiene en cuenta un promedio ponderado de los gradientes pasados, lo que le permite mantener una especie de "momentum" en la dirección de la convergencia.

A continuación, os proporcionaré un ejemplo de regresión múltiple con descenso de gradiente con momentum,y datos sintéticos en Python. En el mismo utilizamos, aparte de otras, la biblioteca NumPy para generar datos sintéticos, y aplicar el descenso de gradiente con momentum.

También se incluye en el ejercicio, una disposición de graficas, para hacerlo más didactico. El alunmno, podrá jugar, o experimentar con los parámetros iniciales e hiperparámetros, para seguir su evolución.

En resumen este es un ejercicio sencillo, que explicaremos en clase, paso a paso, para su comprensión. Como siempre utilizaremos en nuestros ordenadores la plataforma Linux, con Ubuntu 20. También realizaremos la práctica en Google Colab.

Requerimientos

Como dijimos, este ejercicio está realizado como siempre bajo plataforma Linux, en concreto: Ubuntu 20.04.6 LTS.
El editor que utilizaremos, por su sencillez de manejo será Sublime Text. Aunque la elección del editor puede ser del gusto del alumno.
También utilizaremos Google colab.
---------------------------------------------------------------------------------------
La ejecución bajo consola de linux, llevará este comando:
python3 Descn_Mult_Momentun_Ejemp_Aula-28-Oct.py

V-0

Publicado el 29 de Octubre del 2023gráfica de visualizaciones de la versión: V-0
355 visualizaciones desde el 29 de Octubre del 2023
estrellaestrellaestrellaestrellaestrella
estrellaestrellaestrellaestrella
estrellaestrellaestrella
estrellaestrella
estrella

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
"""
Descn_Mult_Momentun_Ejemp_Aula-28-Oct.py
"""
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
 
# Generar datos sintéticos para regresión
np.random.seed(0)
num_datos = 100
num_caracteristicas = 2
 
X = 2 * np.random.rand(num_datos, num_caracteristicas)  # 100 puntos de datos con 2 características
Y_true = 4 + 3 * X[:, 0] + 2 * X[:, 1] + np.random.randn(num_datos)  # Modelo verdadero: y = 4 + 3*x1 + 2*x2 + ruido
 
# Función de costo (error cuadrático medio)
def costo(theta, X, Y):
    m = len(Y)
    Y_pred = np.dot(X, theta)
    error = Y_pred - Y
    return np.sum(error ** 2) / (2 * m)
 
# Gradiente del error cuadrático medio
def gradiente(theta, X, Y):
    m = len(Y)
    Y_pred = np.dot(X, theta)
    error = Y_pred - Y
    gradient = np.dot(X.T, error) / m
    return gradient
 
# Parámetros iniciales y hiperparámetros
theta = np.random.randn(2)  # Inicialización aleatoria
learning_rate = 0.1
momentum = 0.9
 
# Listas para almacenar el historial de valores y costos
theta_historia = [theta]
costo_historia = [costo(theta, X, Y_true)]
 
# Iteraciones de descenso de gradiente con momentum
for _ in range(100):
    gradient = gradiente(theta, X, Y_true)
    momentum_term = momentum * gradient
    theta = theta - learning_rate * (gradient + momentum_term)
    costo_actual = costo(theta, X, Y_true)
 
    theta_historia.append(theta)
    costo_historia.append(costo_actual)
 
# Graficar la evolución del costo
fig = plt.figure(figsize=(12, 5))
ax1 = fig.add_subplot(121)
ax1.plot(range(len(costo_historia)), costo_historia, color='black',marker='o',markerfacecolor='red')
ax1.set_xlabel('Iteración')
ax1.set_ylabel('Costo')
ax1.set_title('Evolución del Costo')
 
# Gráfica 3D con el plano de regresión
ax2 = fig.add_subplot(122, projection='3d')
ax2.scatter(X[:, 0], X[:, 1], Y_true, label='Datos reales')
x1_min, x1_max = X[:, 0].min(), X[:, 0].max()
x2_min, x2_max = X[:, 1].min(), X[:, 1].max()
x1_range = np.linspace(x1_min, x1_max, 100)
x2_range = np.linspace(x2_min, x2_max, 100)
X1, X2 = np.meshgrid(x1_range, x2_range)
Y_pred = theta[0] + theta[1] * X1 + theta[1] * X2  # Corrección en esta línea
ax2.plot_surface(X1, X2, Y_pred, cmap='viridis', alpha=0.8, label='Plano de Regresión')
ax2.set_xlabel('Característica 1')
ax2.set_ylabel('Característica 2')
ax2.set_zlabel('Salida')
ax2.set_title('Regresión Lineal en 3D')
 
#plt.legend()
plt.show()
# Gráfica adicional con la línea de regresión
plt.figure(figsize=(12, 5))
plt.scatter(X[:, 0], Y_true, label='Datos reales')
x1_min, x1_max = X[:, 0].min(), X[:, 0].max()
x1_range = np.linspace(x1_min, x1_max, 100)
Y_pred = theta[0] + theta[1] * x1_range
plt.plot(x1_range, Y_pred, color='red', linestyle='dashed', linewidth=2, label='Regresión lineal')
plt.xlabel('Característica 1')
plt.ylabel('Salida')
plt.title('Regresión Lineal')
 
plt.legend()
plt.show()



Comentarios sobre la versión: V-0 (0)


No hay comentarios
 

Comentar la versión: V-0

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad

http://lwp-l.com/s7453