Está en la página 1de 13

Método Newton-CG

FUNCIONES ROSENBROCK Y EGG HOLDER

En qué consiste el Método de Newton con Gradiente


Conjugado:
El Método del Gradiente Conjugado es un método iterativo utilizado para
resolver sistemas de ecuaciones lineales, simétricas positivas definidas, así como para
optimización sin restricciones de funciones cuadráticas, también se puede usar para
minimizar funciones no lineales como la función Rosenbrock.

El método del gradiente conjugado se basa en la búsqueda de una solución óptima en


una dirección conjugada a la dirección anterior. Es decir, en lugar de seguir la dirección
del gradiente en cada iteración, se busca una dirección que esté conjugada a la
dirección anterior para minimizar la función más eficientemente.

A diferencia del Método de Newton, el método del gradiente conjugado no requiere la


evaluación de la matriz hessiana, lo que hace más eficiente computacionalmente en
problemas grandes. Además el método del gradiente conjugado se puede utilizar para
resolver sistemas de ecuaciones lineales lo que lo hace más versátil que el método de
Newton, sin embargo, el método del gradiente conjugado puede requerir más
iteraciones para converger a una solución precisa en comparación con el método de
Newton.

La combinación del método de Newton con el de gradiente conjugado es una técnica de


optimización poderosa y eficiente que combina las ventajas de ambos métodos para
minimizar funciones no lineales de manera efectiva, por ejemplo no requiere el cálculo
de la matriz hessiana completa (sólo se requiere el producto de la hessiana por un
vector) y puede ser más estable y confiable la convergencia.

Con Newton CG, se utiliza el método de Newton para calcular la dirección de búsqueda
de las primeras etapas de la optimización, pero cuando alcanza una cierta cantidad de
iteraciones o cuando se detecta que la dirección Newton es inestable, se cambia a la
dirección de búsqueda del método de gradiente conjugado.
2

Función Rosenbrock
3

Este es un código par aplicar el método de Newton-CG a la función Rosenbrock

def rosenbrock(x):
"""Función de Rosenbrock"""
return (1 - x[0])**2 + 100*(x[1] - x[0]**2)**2

def rosenbrock_grad(x):
"""Gradiente de la función de Rosenbrock"""
grad = np.zeros_like(x)
grad[0] = -2*(1-x[0]) - 400*x[0]*(x[1] - x[0]**2)
grad[1] = 200*(x[1] - x[0]**2)
return grad

def ncg(x0, f, f_grad, max_iter=1000, tol=1e-8):


"""Método del Gradiente Conjugado sin líneas de búsqueda"""
x = x0.copy()
d = -f_grad(x)
delta = np.dot(d, d)
alpha = 1.0
iter = 0

while iter < max_iter and delta > tol**2:


f_val = f(x)
grad = f_grad(x)
q = np.dot(d, grad)
alpha = delta/q
x += alpha*d
new_grad = f_grad(x)
delta_new = np.dot(new_grad, new_grad)
beta = delta_new/delta
d = -new_grad + beta*d
delta = delta_new
iter += 1

return x

# Ejemplo de uso para minimizar la función de Rosenbrock


x0 = np.array([-1.2, 1.0])
x_min = ncg(x0, rosenbrock, rosenbrock_grad)
print("Mínimo encontrado:", x_min)
print("Valor mínimo:", rosenbrock(x_min))
4

PREGUNTAS:

pregunta 1, ¿Es posible dar un criterio para decidir


cómo elegir el punto inicial de la iteración?

● En el método de Newton con gradiente conjugado para la función Rosenbrock, la


elección del punto inicial recomendada es elegir un punto dentro de la vecindad
del mínimo global de la función.

Una posible estrategia es realizar una búsqueda en línea para encontrar un punto
inicial adecuado, esto implica elegir un punto inicial aleatorio realizar una
iteración con el método de Newton con gradiente conjugado y evaluar la función
en ese punto, luego, se puede mover el punto inicial en la dirección opuesta al
gradiente y repetir el proceso hasta que se encuentre un mínimo local aceptable.

pregunta 2, ¿Es posible decir algo sobre el tamaño de


la zona de atracción de cada mínimo?

● El tamaño de la zona de atracción depende en gran medida y de la forma y


curvatura de la función en su vecindad, en general, la función de Rosenbrock
tiene una forma alargada y estrecha con una curvatura relativamente suave en su
vecindad, lo que significa que el método de Newton con gradiente conjugado
tiene una buena convergencia cerca del mínimo.

Sin embargo a medida que el método se aleja del mínimo, la curvatura se vuelve
más aguda y la convergencia se vuelve más lenta, además la tasa de
convergencia también depende de la elección del parámetro de búsqueda en
línea, que afecta la distancia que se mueve en cada iteración.
5

pregunta 3, ¿Los datos respaldan que tenga


convergencia cuadrática?
● No, el método de Newton con gradiente conjugado no siempre tiene
convergencia cuadrática para la función Rosenbrock, pues depende de varios
factores, incluyendo la elección del punto inicial y la estructura de la función, en
general, el método de Newton con gradiente conjugado puede tener una
convergencia más rápida que el método de gradiente conjugado estándar, pero
esto no siempre garantiza una convergencia cuadrática para la función de
Rosenbrock, pues es posible que la función tenga un cuello de botella o una
región plana que impide la convergencia cuadrática.

En este orden de ideas para la función de Rosenbrock, el método de Newton con


gradiente conjugado puede converger cuadráticamente cerca del mínimo si el punto
inicial está suficientemente cerca del mínimo y si la matriz hessiana es definida positiva
y BIEN CONDICIONADA en esta región, sin embargo si la hessiana no es definida
positiva y bien condicionada en esa región, el método podría converger solo
linealmente e incluso diverger.

pregunta 4, ¿Cuál es el mejor criterio de paro y por


qué?
● El criterio de paro más comúnmente utilizado en el método de Newton con
gradiente conjugado es la norma del gradiente, ya que indica cuando el algoritmo
se acerca a la solución; el motivo de usar este criterio es, que cuando la norma
del gradiente es cercana a cero se considera que se ha encontrado un mínimo
local, además la norma del gradiente es una medida de la magnitud del error, por
lo que establecer una tolerancia adecuada para la norma del gradiente, permite
equilibrar el compromiso entre la precisión y el tiempo de cómputo.

En el caso de la función de Rosenbrock, se puede usar una tolerancia de la


norma del gradiente de 1e-6, por ejemplo, para detener las iteraciones, este valor
es suficientemente pequeño para garantizar una precisión adecuada en la
6

solución pero no tan pequeño como para aumentar el tiempo de cómputo sin
mejorar significativamente la precisión.

pregunta 5 ¿Es posible mejorar el desempeño de las


funciones que “casi” llegan al mínimo?
● Si, es posible mejorar el desempeño, una forma de hacerlo es mediante la
implementación de una estrategia de reinicio o recálculo de la dirección de
búsqueda en caso de que la búsqueda actual no converja.

La estrategia de reinicio más común es la Polak-Ribeire, que se basa en la idea


de que si el método de gradiente conjugado se estanca en una región cercana al
mínimo local, es posible reiniciarlo desde ese punto actual con una nueva
dirección de búsqueda, que se calcula como una combinación lineal de la
dirección de la búsqueda actual y la dirección de la búsqueda del paso anterior,
de tal forma que se garantice una búsqueda más efectiva. La combinación lineal
se elige de tal manera que el producto punto entre el gradiente actual y la
dirección de búsqueda sea cero, lo que indica que la dirección de búsqueda es
ortogonal al gradiente actual, con el coeficiente elegido de tal manera que
satisfaga la condición de ortogonalidad.

La estrategia de Polak-Ribiere es una forma de actualizar la dirección de


busqueda en el método del gradiente conjugado, utilizando información del
gradiente anterior para mejorar la convergencia.
7

Función Egg Holder


8

Código de la función Egg Holder usando el método de Newton-CG

import numpy as np

from scipy.optimize import line_search

#Definir la función objetivo a minimizar, en este caso, la función Egg Holder:

def egg_holder(x):

return -(x[1]+47) * np.sin(np.sqrt(np.abs(x[0]/2+(x[1]+47)))) -


x[0]*np.sin(np.sqrt(np.abs(x[0]-(x[1]+47))))

#Definir la derivada de la función objetivo (el gradiente):

def egg_holder_grad(x):

grad = np.zeros(2)

grad[0] = -np.sin(np.sqrt(np.abs(x[0]-(x[1]+47)))) - (x[0]/2+(x[1]+47)) *


np.cos(np.sqrt(np.abs(x[0]/2+(x[1]+47)))) * np.sign(x[0]/2+(x[1]+47))

grad[1] = -np.sin(np.sqrt(np.abs(x[0]/2+(x[1]+47)))) - (x[1]+47) *


np.cos(np.sqrt(np.abs(x[0]/2+(x[1]+47)))) * np.sign(x[0]/2+(x[1]+47))

return grad

#Definir una función para realizar la iteración usando el método de Newton con
gradiente conjugado:

def newton_cg(fun, grad_fun, x0, tol=1e-6, max_iter=1000):

x = x0.copy()

grad = grad_fun(x)

p = -grad

k=0

#Mientras ||gk|| > tol: Calcular la matriz Hessiana Hk de la función en el punto xk.
9

while k < max_iter:

hess = np.zeros((2,2))

hess[0,0] = (fun([x[0]+1e-8, x[1]]) - fun([x[0]-1e-8, x[1]])) / (2*1e-8)

hess[1,1] = (fun([x[0], x[1]+1e-8]) - fun([x[0], x[1]-1e-8])) / (2*1e-8)

hess[0,1] = (fun([x[0]+1e-8, x[1]+1e-8]) - fun([x[0]+1e-8, x[1]-1e-8]) - fun([x[0]-1e-8,


x[1]+1e-8]) + fun([x[0]-1e-8, x[1]-1e-8])) / (4*1e-8*1e-8)

hess[1,0] = hess[0,1

#Calcular el coeficiente de linealización ak utilizando la fórmula de Barzilai-Borwein

alpha = line_search(fun, grad_fun, x, p)[0]

x += alpha * p

#Calcular el parámetro beta de la estrategia de Polak-Ribiere.

#Actualizar la dirección de descenso dk+1 = -gk+1 + beta * dk

grad_old = grad.copy()

grad = grad_fun(x)

beta = np.dot(grad - grad_old, grad) / np.dot(grad_old, grad_old)

p = -grad + beta * p

if np.linalg.norm(grad) < tol:

break

#Incrementar el contador de iteraciones k

k += 1

return x, fun(x), k

x0 = np.array([-10, 10])

x_min, f_min, num_iter = newton_cg(egg_holder, egg_holder_grad, x0)

#Devolver el punto xk como solución aproximada del problema de minimización


10

print("Mínimo encontrado en:", x_min)

print("Valor mínimo:", f_min)

print("Número de iteraciones:", num_iter)

PREGUNTAS:

pregunta 1, ¿Es posible dar un criterio para decidir


cómo elegir el punto inicial de la iteración?

● Uno de los criterios más comunes es utilizar un método de búsqueda en línea


para encontrar un punto inicial que se encuentra cerca del mínimo local. Por
ejemplo se puede utilizar la línea de Armijo para encontrar un punto inicial.

También se puede seleccionar un punto dentro de un rango específico de valores


para cada variable, por ejemplo si está minimizando la función Egg Holder,en dos
variables, se podría seleccionar un punto dentro del rango (-512, 512) para
ambas variables, pues muy cerca conocemos que está el mínimo global. Es
importante considerar cualquier información previa que se tenga sobre la
función, en este caso, si se conoce la ubicación aproximada de los mínimos.
11

pregunta 2, ¿Es posible decir algo sobre el tamaño de


la zona de atracción de cada mínimo?
● En la función Egg Holder los mínimos están ubicados en valles estrechos y
profundos, lo que significa que la zona de atracción de cada mínimo es pequeña,
esto implica que la elección del punto inicial puede ser crítica para la
convergencia del método.

Si el punto inicial está suficientemente cerca de uno de los mínimos, el Método


de Newton con Gradiente Conjugado puede converger rápidamente a ese
mínimo, pero si el punto inicial está lejos de los mínimos la convergencia puede
ser lenta o incluso no alcanzarse, por lo tanto es importante elegir un punto
uncial cercano a un mínimo conocido o realizar un análisis cuidadoso de la
función para elegir un punto inicial adecuado.

En el caso de la función Egg Holder y el método de Newton CG, el tamaño de la


zona de atracción de cada mínimo puede variar ampliamente, dependiendo del
punto inicial seleccionado y de los parámetros del algoritmo, en general se
espera que el método de Newton CG tenga una tasa de convergencia más rápida
que el método de gradiente conjugado estándar.

pregunta 3, ¿Los datos respaldan que tenga


convergencia cuadrática?
● En el caso de la función Egg Holder, la convergencia cuadrática no está
garantizada debido a la presencia de múltiples mínimos locales y a una
superficie de la función objetivo bastante compleja. Por lo tanto la convergencia
dependerá en gran medida de la elección adecuada de los parámetros del
método y del punto inicial así como de la estrategia de la actualización del
método del gradiente conjugado.

Dependiendo del punto de inicio elegido, el Método de Newton CG puede tener


convergencia cuadrática para la función Egg Holder, si se elige un punto
suficientemente cerca del mínimo global, el método puede converger
12

rápidamente, sin embargo, si no está cerca, puede quedar atrapado en uno de los
mínimos locales.

Es importante tener en cuenta que la convergencia cuadrática sólo se cumple


cerca de los mínimos globales y sólo si se cumplen ciertas condiciones de
regularidad de la función y la matriz Hesiana. Por lo tanto en la práctica puede
ser necesario ajustar los parámetros del método para lograr una convergencia
rápida y estable.

pregunta 4, ¿Cuál es el mejor criterio de paro y por


qué?
● Existen varios criterios de paro que se pueden utilizar en el método de Newton
CG en la función Egg Holder, el criterio de tolerancia de error es generalmente el
más utilizado debido a su simplicidad y efectividad en la mayoría de los
casos.Este criterio de paro es comúnmente utilizado en muchos algoritmos de
optimización. La idea es detener las iteraciones una vez que alcanza una
tolerancia de error predefinida, es decir una vez que la diferencia entre el valor
actual de la función objetivo y el valor anterior es menor a la tolerancia
especificada, se considera que se ha alcanzado la solución.

Por ejemplo, se puede establecer la tolerancia en 1e-6.

También se pueden establecer otros criterios e incluso una combinación de


ellos, como puede ser, Detener en un máximo número de iteraciones, cambio
relativo en la dirección de búsqueda o magnitud del gradiente.

pregunta 5 ¿Es posible mejorar el desempeño de las


funciones que “casi” llegan al mínimo?
● Si es posible mejorar el desempeño en el método de Newton CG para la función
Egg Holder, una forma de hacerlo es utilizando una estrategia de line search
adecuada para encontrar un tamaño de paso óptimo en la dirección de
búsqueda. Esto puede ayudar a evitar que la iteración no se detenga en puntos
que no son mínimos.
13

Además se puede explorar la posibilidad de utilizar diferentes estrategias de


gradiente conjugado como la estrategia de Polak-Ribiere, que puede ayudar a
mejorar el desempeño en algunos casos para la función Egg Holder, esta
estrategia utiliza una formula para calcular el coeficiente de beta que se utiliza
en l actualizacion de la direccion de busqueda en cada iteracion del método, esta
formula se basa en la magnitud y direccipn del gradiente en la iteracion anterior y
la magnitiud y direccion del gradiente en la iteracion actual; asi permite una
mejor adaptacion a la curvatura de la función en diferentes regiones del espacio
de búsqueda, sin embargo es importante tener en cuenta que la eleccion del
método de actualizacion del paso, el tamaño y el criterio de parada, tambien
puedesn influir en eldesempeño del algoritmo.

También podría gustarte