Código de Python - Descenso de Gradiente Estocástico (SGD)

Imágen de perfil

Descenso de Gradiente Estocástico (SGD)gráfica de visualizaciones


Python

Publicado el 14 de Septiembre del 2023 por Hilario (122 códigos)
455 visualizaciones desde el 14 de Septiembre del 2023
Hilario Iglesias Marínez

*******************************************************************
Ejercicio:
Estocástico_Aula_F-890.py
Ejecucion bajo Consola Linux:
python3 Estocástico_Aula_F-890.py

******************************************************************
Diferencias.
El descenso de gradiente es un algoritmo de optimización utilizado comúnmente en el aprendizaje automático y la optimización de funciones. Hay dos variantes principales del descenso de gradiente: el descenso de gradiente tipo Batch (también conocido como descenso de gradiente por lotes) y el descenso de gradiente estocástico. Estas dos variantes difieren en la forma en que utilizan los datos de entrenamiento para actualizar los parámetros del modelo en cada iteración.

Descenso de Gradiente Tipo Batch:

En el descenso de gradiente tipo Batch, se utiliza el conjunto completo de datos de entrenamiento en cada iteración del algoritmo para calcular el gradiente de la función de costo con respecto a los parámetros del modelo.
El gradiente se calcula tomando el promedio de los gradientes de todas las muestras de entrenamiento.
Luego, se actualizan los parámetros del modelo utilizando este gradiente promedio.
El proceso se repite hasta que se alcanza una convergencia satisfactoria o se ejecuta un número predefinido de iteraciones.

Descenso de Gradiente Estocástico (SGD):

En el descenso de gradiente estocástico, en cada iteración se selecciona una sola muestra de entrenamiento al azar y se utiliza para calcular el gradiente de la función de costo.
Los parámetros del modelo se actualizan inmediatamente después de calcular el gradiente para esa única muestra.
Debido a la selección aleatoria de muestras, el proceso de actualización de parámetros es inherentemente más ruidoso y menos suave que en el descenso de gradiente tipo Batch.
SGD es más rápido en cada iteración individual y a menudo converge más rápidamente, pero puede ser más ruidoso y menos estable en términos de convergencia que el descenso de gradiente tipo Batch.
Diferencias clave:

Batch GD utiliza todo el conjunto de datos en cada iteración, lo que puede ser costoso computacionalmente, mientras que SGD utiliza una sola muestra a la vez, lo que suele ser más eficiente en términos de tiempo.
Batch GD tiene una convergencia más suave y estable debido a que utiliza gradientes promedio, mientras que SGD es más ruidoso pero a menudo converge más rápido.
Batch GD puede quedar atrapado en óptimos locales, mientras que SGD puede escapar de ellos debido a su naturaleza estocástica.
En la práctica, también existen variantes intermedias como el Mini-Batch Gradient Descent, que utiliza un pequeño conjunto de datos (mini-lote) en lugar del conjunto completo, equilibrando así los beneficios de ambas técnicas. La elección entre estas variantes depende de la naturaleza del problema y las restricciones computacionales.


Requerimientos

*************************************************
Programa realizado bajo plataforma Linux.
Ubuntu 20.04.6 LTS
Editado con :
Sublime Text.
***********************************************

V-0.

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

descarga
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
"""
Estocástico_Aula_F-890.py
Ejecucion bajo Consola Linux:
python3 Estocástico_Aula_F-890.py
"""
 
import numpy as np
import matplotlib.pyplot as plt
 
# Generamos un conjunto de datos de puntos aleatorios
np.random.seed(0)
x = 2 * np.random.rand(100, 1)
y = 4 + 3 * x + np.random.randn(100, 1)
 
# Inicializamos los parámetros del modelo
theta = np.random.rand(2, 1)
# Definimos el modelo lineal
def model(x, theta):
    return theta[0] * x + theta[1]
 
# Definimos la función de pérdida
def loss(x, y, theta):
    y_pred = model(x, theta)
    return np.sum((y - y_pred)**2)
 
# Inicializamos los parámetros del modelo
theta = np.random.rand(2, 1)
iteraciones=12
# Definimos la tasa de aprendizaje
learning_rate = 0.1
 
# Historial de costos
cost_history = []
 
# Realizamos el descenso de gradiente estocástico
for i in range(iteraciones):
    index = np.random.randint(0, len(x))
    x_i = x[index]
    y_i = y[index]
    gradient = -2 * x_i * (y_i - model(x_i, theta))
    theta = theta - learning_rate * gradient
 
    # Calculamos el costo en cada iteración y lo agregamos al historial
    cost = loss(x, y, theta)
    cost_history.append(cost)
 
# Imprimimos los parámetros del modelo ajustado
print("*****************************")
print("Parámetros del modelo ajustado:")
print("Theta[0]:", theta[0][0])
print("Theta[1]:", theta[1][0])
print("***********************")
for costo in cost_history:
 print(costo)
print("***********************")
 
# Crear una figura con dos gráficos de igual tamaño
#plt.figure(figsize=(13, 7))
 
# Graficar el historial de costos en el primer gráfico
plt.figure(figsize=(14, 5))
plt.subplot(1, 2, 1)
#plt.plot(range(len(cost_history)), cost_history, color='red')
plt.plot(range(len(cost_history)), cost_history, color='red', marker='o', markerfacecolor='blue')
 
plt.xlabel('Iteración')
plt.ylabel('Costo')
plt.title('Historial de Costos')
 
# 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, model(x, theta), color='red', label='Modelo ajustado')
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()
 
"""
*****************************
Parámetros del modelo ajustado:
Theta[0]: 3.2158225521676638
Theta[1]: 3.3052279961982487
***********************
3736.6563031460155
3341.4218389862776
3003.201374359222
775.574624070274
273.13583641511815
111.57277023271419
110.19697013096666
116.10652382651482
116.19756354168618
122.39570639346417
207.61967155554095
147.93069003951655
***********************
"""



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