Código de Python - Descenso Gradiente Batch-Error Cuadrático MSE

Imágen de perfil

Descenso Gradiente Batch-Error Cuadrático MSEgráfica de visualizaciones


Python

Publicado el 11 de Septiembre del 2023 por Hilario (123 códigos)
412 visualizaciones desde el 11 de Septiembre del 2023
Hilario Iglesias Martínez.

DescensoGradienteAula-F876.py

El descenso de gradiente tipo "Batch" (también conocido como descenso de gradiente en lotes) es uno de los algoritmos de optimización más utilizados en el aprendizaje automático y la optimización numérica. Este algoritmo se utiliza para minimizar una función de pérdida (también llamada función de costo) al ajustar los parámetros de un modelo de aprendizaje automático. El objetivo principal del descenso de gradiente es encontrar los valores de los parámetros que minimizan la función de pérdida.

Aquí te explico cómo funciona el descenso de gradiente tipo Batch:

Inicialización de parámetros: Se comienza con valores iniciales para los parámetros del modelo. Esto puede ser aleatorio o basado en algún conocimiento previo.

Selección de un lote (batch): En cada iteración del algoritmo, se selecciona un conjunto de ejemplos de entrenamiento del conjunto de datos. Este conjunto de ejemplos se denomina "lote" o "batch". En el descenso de gradiente tipo Batch, se utilizan todos los ejemplos de entrenamiento en cada iteración, es decir, el tamaño del lote es igual al tamaño completo del conjunto de entrenamiento.

Cálculo del gradiente: Para el lote seleccionado, se calcula el gradiente de la función de pérdida con respecto a los parámetros del modelo. El gradiente representa la dirección y la magnitud en la que debe ajustarse cada parámetro para reducir la pérdida.

Actualización de parámetros: Se ajustan los parámetros del modelo en la dirección opuesta al gradiente calculado. Esto se hace multiplicando el gradiente por una tasa de aprendizaje (learning rate) y restando el resultado de los parámetros actuales. La tasa de aprendizaje controla qué tan grande es el paso que se da en cada iteración.

Iteración: Se repiten los pasos 2 a 4 durante un número fijo de iteraciones o hasta que se alcance algún criterio de convergencia (como una pequeña disminución en la función de pérdida o un número máximo de iteraciones).

El proceso se repite hasta que se considera que el modelo ha convergido o alcanzado una solución aceptable.

El descenso de gradiente tipo Batch tiene algunas ventajas, como la convergencia más estable y la posibilidad de aprovechar la paralelización en el hardware moderno. Sin embargo, también puede ser más lento en comparación con variantes más rápidas como el descenso de gradiente estocástico (SGD) o el descenso de gradiente mini-batch, que utilizan subconjuntos más pequeños de los datos en cada iteración. La elección del algoritmo de descenso de gradiente depende de la naturaleza del problema y de las características del conjunto de datos.
****************************************************************************************************************
El Error Cuadrático Medio (MSE, por sus siglas en inglés, Mean Squared Error) es una métrica comúnmente utilizada en estadísticas y machine learning para evaluar el rendimiento de un modelo de regresión o de predicción. MSE se utiliza para medir la calidad de las predicciones de un modelo al calcular la media de los cuadrados de las diferencias entre los valores predichos por el modelo y los valores reales (observados) en un conjunto de datos.

La fórmula del MSE se expresa de la siguiente manera:

MSE = (1/n) Σ(yi - ŷi)²

Donde:

MSE es el Error Cuadrático Medio.
n es el número de muestras en el conjunto de datos.
yi representa el valor real u observado de la muestra i.
ŷi representa el valor predicho por el modelo para la muestra i.
En otras palabras, para calcular el MSE, se toma la diferencia entre el valor predicho y el valor real para cada punto de datos, se eleva al cuadrado, y luego se calcula el promedio de todas estas diferencias al cuadrado.


El MSE es útil para determinar cuán bien se ajusta un modelo de regresión a los datos, y se prefiere minimizarlo. Cuanto menor sea el MSE, mejor será el ajuste del modelo a los datos. Sin embargo, es importante recordar que el MSE puede verse afectado por valores atípicos en los datos y puede no ser la métrica más apropiada en todos los casos. En algunos escenarios, como la detección de valores atípicos, otras métricas como el Error Absoluto Medio (MAE) o el Error Cuadrático Medio Raíz (RMSE) pueden ser más adecuadas.

Requerimientos

Realizado bajo Linux.
Ubuntu 20.04.6 LTS
Editado con Sublime Text.
--------------------------------------------------------
Ejecucion. Consola Linux.
python3 DescensoGradienteAula-F876.py

E

Publicado el 11 de Septiembre del 2023gráfica de visualizaciones de la versión: E
413 visualizaciones desde el 11 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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
import numpy as np
import matplotlib.pyplot as plt
 
# Generar datos de ejemplo
np.random.seed(0)
X = 2 * np.random.rand(10, 1)
y = 4 + 3 * X + np.random.randn(10, 1)
print("X:\n",X)
print("y:\n",y)
# Parámetros iniciales
learning_rate = 0.05
num_iterations = 10
m = len(y)
theta = np.random.randn(2, 1)  # Inicialización aleatoria de los parámetros [theta0, theta1]
print("theta0,theta1:\n",theta)
# Listas para almacenar la evolución del error y los parámetros
error_history = []
 
# Listas para almacenar los valores de descenso
descent_values = []
 
# Descenso de gradiente tipo Batch
for iteration in range(num_iterations):
    # Calcular las predicciones del modelo
    y_pred = X.dot(theta[1]) + theta[0]
    print("y_pred:\n",y_pred)
    # Calcular el error cuadrático medio (MSE)
    #error = np.mean((y_pred - y) ** 2)
    error = np.sum((y - y_pred) ** 2) / m
 
    error_history.append(error)
 
    # Almacenar el valor de descenso
    descent_values.append([iteration, error])
 
    # Calcular los gradientes
    gradients = np.zeros((2, 1))
    for i in range(m):
        #gradients[0] += (y_pred[i] - y[i])
        #gradients[1] += (y_pred[i] - y[i]) * X[i]
        gradients[0] = (1/m) * np.sum(y_pred - y)#d(MSE)/d(theta0) = (1/m) * Σ(ŷi - yi)
        gradients[1] = (1/m) * np.sum((y_pred - y) * X)#d(MSE)/d(theta1) = (1/m) * Σ(ŷi - yi) * (-X)
 
    # Actualizar los parámetros theta usando el descenso de gradiente
    theta -= learning_rate * gradients
print("gradients:\n",gradients)
# Convertir los valores de descenso en un array numpy
descent_values = np.array(descent_values)
print("descent_values:\n",descent_values)
# Graficar la evolución del error con puntos de descenso
plt.figure(figsize=(13, 6))
plt.subplot(1, 2, 1)
plt.plot(error_history)
plt.scatter(descent_values[:, 0], descent_values[:, 1], color='red', label='Valores de descenso')
plt.title('Evolución del Error Cuadrático Medio (MSE)')
plt.xlabel('Iteración')
plt.ylabel('MSE')
plt.legend()
 
# Graficar el ajuste lineal resultante
plt.subplot(1, 2, 2)
plt.scatter(X, y, label='Datos de entrenamiento')
plt.plot(X, X.dot(theta[1]) + theta[0], color='red', label='Ajuste lineal')
plt.title('Ajuste Lineal Resultante')
plt.xlabel('X')
plt.ylabel('y')
plt.legend()
 
plt.tight_layout()
plt.show()
 
print("Parámetros finales del modelo:")
print(f"Theta0: {theta[0][0]}")
print(f"Theta1: {theta[1][0]}")
 
"""
X:
 [[1.09762701]
 [1.43037873]
 [1.20552675]
 [1.08976637]
 [0.8473096 ]
 [1.29178823]
 [0.87517442]
 [1.783546  ]
 [1.92732552]
 [0.76688304]]
y:
 [[ 7.43692459]
 [ 9.74540971]
 [ 8.37761798]
 [ 7.39097411]
 [ 6.98579203]
 [ 8.20903901]
 [ 8.11960234]
 [ 9.14547974]
 [10.09504426]
 [ 5.44655337]]
theta0,theta1:
 [[-2.55298982]
 [ 0.6536186 ]]
y_pred:
 [-1.83556039 -1.61806768 -1.76503511 -1.84069825 -1.99917251 -1.70865301
 -1.98095954 -1.38723098 -1.29325402 -2.0517408 ]
y_pred:
 [ 9.9659155  12.26906854 10.71274746  9.91150778  8.23333454 11.30980936
  8.42620192 14.7135285  15.70870362  7.6766592 ]
y_pred:
 [ 6.90332375  8.70207451  7.4865957   6.8608316   5.55018686  7.95289799
  5.7008153  10.61118526 11.38841195  5.11542627]
y_pred:
 [ 7.68065921  9.64411471  8.31733914  7.63427622  6.20362075  8.82633896
  6.36804166 11.72803544 12.57642981  5.72905079]
y_pred:
 [ 7.46600235  9.421308    8.10003957  7.41981188  5.99509473  8.60692665
  6.15883317 11.49657886 12.34145174  5.5224946 ]
y_pred:
 [ 7.50761305  9.49942345  8.15348748  7.46056022  6.00924419  8.66983793
  6.17603956 11.61343877 12.47408508  5.52782081]
y_pred:
 [ 7.48302055  9.49979981  8.13699151  7.43537788  5.9658685   8.6598148
  6.13475478 11.64031591 12.51175107  5.47841011]
y_pred:
 [ 7.47553073  9.52025899  8.13856458  7.42722782  5.93735364  8.66863328
  6.10858038 11.69043885 12.57395057  5.44313994]
y_pred:
 [ 7.46362268  9.53553005  8.13546976  7.41467771  5.90499969  8.67258428
  6.07850243 11.73455657 12.62981217  5.40421676]
y_pred:
 [ 7.45285601  9.55214139  8.13358082  7.40326429  5.87363752  8.67779273
  6.04943291 11.78022565 12.68731108  5.36623729]
gradients:
 [[ 2.02404253]
 [-1.64246321]]
descent_values:
 [[  0.         986.5776895 ]
 [  1.         160.56842756]
 [  2.          59.0625845 ]
 [  3.          65.90008415]
 [  4.          64.34550165]
 [  5.          66.32609862]
 [  6.          67.49649614]
 [  7.          68.90717554]
 [  8.          70.27877665]
 [  9.          71.68375498]]
"""



Comentarios sobre la versión: E (0)


No hay comentarios
 

Comentar la versión: E

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