Código de Python - Historial de Costos. Descenso estocástico

Imágen de perfil

Historial de Costos. Descenso estocásticográfica de visualizaciones


Python

Publicado el 17 de Septiembre del 2023 por Hilario (122 códigos)
212 visualizaciones desde el 17 de Septiembre del 2023
Ejercicio sencillo para aprendizaje de un descenso de gradiente tipo estocástico.
----------------------------------------------------------------------------------------------------------
Descenso de Gradiente Estocástico (Stochastic Gradient Descent, SGD):

El descenso de gradiente estocástico es un enfoque de optimización en el que se actualizan los parámetros del modelo utilizando un solo ejemplo de entrenamiento o un pequeño subconjunto de ejemplos (mini-batch) en cada iteración.

En cada iteración, se selecciona aleatoriamente un ejemplo o un mini-batch para calcular el gradiente y actualizar los parámetros.

SGD es mucho más eficiente computacionalmente que el muestreo histórico de costos y es especialmente útil cuando se tienen grandes conjuntos de datos, ya que permite un entrenamiento más rápido y escalable.

En resumen, el muestreo histórico de costos utiliza todo el conjunto de datos en cada iteración, mientras que el descenso de gradiente estocástico utiliza un subconjunto aleatorio de datos en cada iteración. SGD tiende a ser más ruidoso debido a su aleatoriedad, pero puede converger a una solución aceptable en menos iteraciones. Ambos enfoques tienen sus ventajas y desventajas, y la elección entre ellos depende de las características del problema y los recursos computacionales disponibles. También existen variantes intermedias, como el Mini-batch Gradient Descent, que utilizan un tamaño de mini-batch moderado para combinar eficiencia y estabilidad en el entrenamiento de modelos.

Requerimientos

[
b]Aula-F48-3-Sep.py

Ejecutar.
Bajo consola de linux.
python3 Aula-F48-3-Sep.py
-------------------------------------------------
Realizado bajo Linux.
Ubuntu 20.04.6 LTS
Editado en Sublime Text.
[/b]


Todos estos ejercicios también se pueden ejecutar en Google-Colab

V-0

Publicado el 17 de Septiembre del 2023gráfica de visualizaciones de la versión: V-0
213 visualizaciones desde el 17 de Septiembre del 2023
estrellaestrellaestrellaestrellaestrella
estrellaestrellaestrellaestrella
estrellaestrellaestrella
estrellaestrella
estrella

descarga-2
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
"""
Aula-F48-3-Sep.py
Ejecutar.
Bajo consola de linux.
python3 Aula-F48-3-Sep.py
"""
 
import numpy as np
import matplotlib.pyplot as plt
 
Factor_Aprendizaje = 0.1
Iteraciones = 1000
 
# Datos de ejemplo
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
 
# Agregar el término de sesgo a los datos X
X_con_bias = np.c_[np.ones((X.shape[0], 1)), X]
 
# Función de pérdida vectorizada
def lin_reg(X, y, w):
    """
    Calcula el error cuadrático medio
    """
    return np.mean((y - X @ w)**2) / 2
 
# Gradiente vectorizado
def gradient(X, y, w):
    """
    Calcula el gradiente del error cuadrático medio
    """
    return -X.T @ (y - X @ w) / len(X)
 
# Descenso de gradiente estocástico
def sgd(X, y, lr, vueltas):
    # Inicializar pesos (incluyendo el término de sesgo)
    w = np.zeros((X.shape[1], 1))
 
    # Entrenamiento
    train_loss = []
    for i in range(vueltas):
        # Muestra aleatoria
        idx = np.random.randint(len(X))
        xi = X[idx:idx+1]
        yi = y[idx:idx+1]
 
        # Actualizar pesos
        grad = gradient(xi, yi, w)
        w = w - lr * grad
 
        # Guardar pérdida
        train_loss.append(lin_reg(X, y, w))
 
    return w, train_loss
 
w, train_loss = sgd(X_con_bias, y, Factor_Aprendizaje, Iteraciones)
 
# Suponiendo que train_loss es tu lista de costos
Ejemplo_intervalo = 100  # Intervalo de muestreo
Ejemplo_train_loss = train_loss[::Ejemplo_intervalo]  # Tomar una muestra cada 100 iteraciones
Ejemplo_Iteraciones = list(range(0, len(train_loss), Ejemplo_intervalo))  # Crear una lista de las iteraciones muestreadas
for i, loss in enumerate(Ejemplo_train_loss):
    iteration = Ejemplo_Iteraciones[i]
    print(f"Iteración {iteration}: Pérdida = {loss}")
# Crear un gráfico
plt.figure(figsize=(14, 5))
plt.subplot(1, 2, 1)
 
# Graficar el historial de costos con muestreo
plt.plot(Ejemplo_Iteraciones, Ejemplo_train_loss, color='red', marker='o', markerfacecolor='blue')
plt.xlabel('Iteración')
plt.ylabel('Costo')
plt.title('Historial de Costos (Muestreo Cada 100 Iteraciones)')
 
# Graficar los datos y el modelo ajustado en el segundo gráfico
plt.subplot(1, 2, 2)
plt.scatter(X, y, label='Datos')
plt.plot(X, X_con_bias @ w, color='red', label='Modelo ajustado')  # Calcular las predicciones del modelo
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
 
# Ajustar automáticamente el espaciado entre los gráficos
plt.tight_layout()
 
# Mostrar la figura
plt.show()
 
"""
Iteración 0: Pérdida = 12.119542712413745
Iteración 100: Pérdida = 0.5503233580511369
Iteración 200: Pérdida = 0.4931730827341465
Iteración 300: Pérdida = 0.7351590589483346
Iteración 400: Pérdida = 0.5851340056340387
Iteración 500: Pérdida = 0.49921689992112306
Iteración 600: Pérdida = 0.7104748676372443
Iteración 700: Pérdida = 0.50428558776869
Iteración 800: Pérdida = 0.5180578387950292
Iteración 900: Pérdida = 0.5523903233100342
"""



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/s7435