import numpy as np #libreria de calculo numerico
import scipy as sc #extension de numpy
import matplotlib.pyplot as plt #visualizacion de datos
#funcion anonima de coste para vector de parametros
#func = lambda th: np.sin(1 / 2 * x ** 2 -1 / 4 * y ** 2 + 3) * np.cos(2 * x + 1 - np.e ** y)
#optimizacion de funciones
func = lambda th: np.sin(1 / 2 * th[0] ** 2 -1 / 4 * th[1] ** 2 + 3) * np.cos(2 * th[0] + 1 - np.e ** th[1]) #funcion anonima de coste para vector de parametros
#visualizar el parametro de la funcion: print(func([2,3]))
res = 100 #100 valores de resolucion
#vectores X e Y de -2 a 2 con 100 coordenadas
_X = np.linspace(-2, 2, res)
_Y = np.linspace(-2, 2, res)
_Z = np.zeros((res, res)) #matriz de elementos nulos de tamaño 100x100
for ix, x in enumerate(_X):
for iy, y in enumerate(_X):
_Z[iy, ix] = func([x,y]) #primero columnas, luego filas
plt.contour(_X, _Y, _Z, 100) #crear superficie diferencial desde arriba
plt.colorbar() #regla de profundidad con colores
Theta = np.random.rand(2) * 4 -2 #numero aleatorio de 2 a -2
_T = np.copy(Theta) #copia de Theta
h = 0.01 #incremento de diferenciacion
lr = 0.01 #ratio de aprendizaje
plt.plot(Theta[0], Theta[1], "o", c="white")
grad = np.zeros(2) #vector/array de 2 posiciones con valor '0'
for _ in range (10000): #bucle de intentos
#calcular la derivada parcial en el mapa
for it, th in enumerate(Theta):
_T = np.copy(Theta)
_T[it] = _T[it] + h #incremento añadido
deriv = (func(_T) - func(Theta)) / h #calcula la diferencia de vectores respecto al incremento
grad[it] = deriv #guarda la derivada parcial en un vector
Theta = Theta - lr * grad #aumenta el vector gradiante respecto el ratio de aprendizaje
# mirar numeros del vector en el mapa: print(func(Theta))
#metodo de diferencias minimas
if ( _ % 100 == 0): #cuando el resto de la division de 100 es 0, haz:
plt.plot(Theta[0], Theta[1], "o", c="red") #coloca el punto al azar en el mapa
plt.plot(Theta[0], Theta[1], "o", c="green") #coloca el punto en el mapa
plt.show() #visualizacion de la matriz
No hay comentarios:
Publicar un comentario