"""
***************************
ParaClases.py
*****************************
Hilario Iglesias Martínez
******************************
Ejemplo para clase didactica.
Descenso de gradiente para la función:
f(x)=(x**2/8) + (x**2 - 16)
**********************************************************
Inicialmente lo dejo configurado co estos parámetros:
# Parámetros que queremos aplicar para el descenso de gradiente.
---------------------------------------------------------------
learning_rate = 0.01
iterations = 10
start_x = 40
----------------------------------------
Las iteraciones ideales serías:1000.
*********************************
Realizado en
Plataforma Linux. Ubuntu 20.04.6 LTS
Editor Sublime Text.
Ejecutar en consola linux:
python3 ParaClases.py
**********************************
"""
#Importamos los modulos necesarios.
import numpy as np
import matplotlib.pyplot as plt
# Definimos la la función f(x), returna valores de eje y.
def f(x):
return (x**2/8) + (x**2 - 16)
# Derivada de la función f(x)
def df(x):
return (9*x/4)
# Parámetros que queremos aplicar para el descenso de gradiente.
learning_rate = 0.01
iterations = 10
start_x = 40
# Descenso de gradiente aplicando un bucle for.
x_values = [start_x]
for _ in range(iterations):
gradient = df(x_values[-1])
new_x = x_values[-1] - learning_rate * gradient
x_values.append(new_x)
# Crear puntos para la gráfica para diseñar su exposición entre ejes.
x_vals = np.linspace(-40, 40, 100)
y_vals = f(x_vals)
# Encontrar el índice de x_values[-1] y el valor mínimo que etiqueta.
indice_minimo = np.argmin([f(x) for x in x_values])
valor_minimo = x_values[indice_minimo]
# Imprimir resultados
print("Índice del valor mínimo:", indice_minimo)
print("Valor mínimo de x:", valor_minimo)
print("Valor mínimo de y:", f(valor_minimo))
print("********************************************")
# Imprimir número de índice y valor correspondiente en x_values
for indice, valor in enumerate(x_values):
print("Número de Índice:", indice, "- Valor x:", valor)
print("Número de Índice:", indice, "- Valor y:", f(valor))
# Diseñamos la Gráfica
plt.figure(figsize=(14, 8))
plt.plot(x_vals, y_vals, label='f(x) = (x**2/8) + (x**2 - 16)')
plt.scatter(x_values, [f(x) for x in x_values], color='red', label='Descenso de Gradiente de la función:f(x)=(x**2/8) + (x**2 - 16)')
plt.scatter(start_x, f(start_x), color='green', label='Punto de inicio', marker='o')
plt.scatter(valor_minimo, f(valor_minimo), color='black', label='Mínimo punto final', marker='o')
plt.xlabel('x')
plt.ylabel('f(x)')
plt.title('Descenso de Gradiente de:f(x)=(x**2/8) + (x**2 - 16) ')
plt.grid(True)
plt.legend()
plt.show()
"""
SALIDA.
***********************************************
Índice del valor mínimo: 10
Valor mínimo de x: 31.858670777739903
Valor mínimo de y: 1125.8467666899708
********************************************
Número de Índice: 0 - Valor x: 40
Número de Índice: 0 - Valor y: 1784.0
Número de Índice: 1 - Valor x: 39.1
Número de Índice: 1 - Valor y: 1703.91125
Número de Índice: 2 - Valor x: 38.22025
Número de Índice: 2 - Valor y: 1627.3859488203125
Número de Índice: 3 - Valor x: 37.360294375
Número de Índice: 3 - Valor y: 1554.265545259989
Número de Índice: 4 - Valor x: 36.5196877515625
Número de Índice: 4 - Valor y: 1484.398542655577
Número de Índice: 5 - Valor x: 35.697994777152346
Número de Índice: 5 - Valor y: 1417.6401849982958
Número de Índice: 6 - Valor x: 34.89478989466642
Número de Índice: 6 - Valor y: 1353.8521570170276
Número de Índice: 7 - Valor x: 34.109657122036424
Número de Índice: 7 - Valor y: 1292.9022976057513
Número de Índice: 8 - Valor x: 33.3421898367906
Número de Índice: 8 - Valor y: 1234.6643260016554
Número de Índice: 9 - Valor x: 32.591990565462815
Número de Índice: 9 - Valor y: 1179.0175801466194
Número de Índice: 10 - Valor x: 31.858670777739903
Número de Índice: 10 - Valor y: 1125.8467666899708
"""