1 @c English version: 2013-07-27
3 * Introducción a lbfgs::
4 * Funciones y variables para lbfgs::
7 @node Introducción a lbfgs, Funciones y variables para lbfgs, Top, Top
8 @section Introducción a lbfgs
10 La función @code{lbfgs} implementa el llamado algoritmo L-BFGS [1]
11 para resolver problemas de minimización sin restricciones mediante una
12 técnica @i{cuasi-Newton con memoria limitada} (BFGS). El término
13 memoria limitada procede del hecho de que se almacena una aproximación
14 de rango bajo de la inversa de la matriz hessiana, en lugar de la matriz
15 completa. El programa fue originalmente escrito en Fortran [2] por
16 Jorge Nocedal, incorporando algunas funciones escritas originalmente
17 por Jorge J. Mor@'{e} y David J. Thuente, traducidas posteriormente a Lisp
18 automáticamente con el programa @code{f2cl}. El paquete @code{lbfgs}
19 contiene el código traducido, junto con una función interfaz que para
20 controlar ciertos detalles.
25 [1] D. Liu and J. Nocedal. "On the limited memory BFGS method for large
26 scale optimization". @i{Mathematical Programming B} 45:503--528 (1989)
28 [2] @url{http://netlib.org/opt/lbfgs_um.shar}
30 @node Funciones y variables para lbfgs, , Introducción a lbfgs, Top
31 @section Funciones y variables para lbfgs
33 @deffn {Función} lbfgs (@var{FOM}, @var{X}, @var{X0}, @var{epsilon}, @var{iprint})
34 @deffnx {Function} lbfgs ([@var{FOM}, @var{grad}] @var{X}, @var{X0}, @var{epsilon}, @var{iprint})
36 Encuentra una solución aproximada para el problema de minimización
37 sin restricciones de la función objetivo @var{FOM} para la lista de
38 variables @var{X}, partiendo de los estimadores iniciales @var{X0},
39 de tal manera que @math{norm(grad(FOM)) < epsilon*max(1, norm(X))}.
41 Si el argumento @var{grad} está presente, debe ser el gradiente de @var{FOM} respecto
42 de las variables @var{X}. @var{grad} puede ser una lista o una función
43 que devuelva una lista con igual número de elementos que @var{X}.
44 Si el argumento no está presente, el gradiente se calcula automáticamente mediante derivación
45 simbólica. Si @var{FOM} es una función, el gradiente @var{grad} debe ser suministrado
48 El algoritmo utilizado es una técnica @i{cuasi-Newton con memoria limitada}
49 (BFGS) [1]. El término @i{memoria limitada} procede del hecho de que se almacena
50 una aproximación de rango bajo de la inversa de la matriz hessiana, en lugar
51 de la matriz completa.
52 Cada iteración del algoritmo es una búsqueda a lo largo de una recta,
53 cuya dirección se calcula a partir de la matriz inversa aproximada del
54 hessiano. La función objetivo decrece siempre tras cada búsqueda
55 exitosa a lo largo de la recta; además, casi siempre decrece también
56 el módulo del gradiente de la función.
58 El argumento @var{iprint} controla los mensajes de progreso que envía
59 la función @code{lbfgs}.
64 @code{@var{iprint}[1]} controla la frecuencia con la que se emiten los mensajes.
67 No se envían mensajes.
69 Mensajes únicamente en la primera y última iteraciones.
71 Imprime un mensaje cada @code{@var{iprint}[1]} iteraciones.
74 @code{@var{iprint}[2]} controla la cantidad de información contenida en los mensajes.
77 Imprime contador de iteraciones, número de evaluaciones de @var{FOM}, valor de @var{FOM},
78 módulo del gradiente de @var{FOM} y amplitud del paso.
80 Igual que @code{@var{iprint}[2] = 0}, incluyendo @var{X0} y el gradiente de @var{FOM} evaluado en @var{X0}.
82 Igual que @code{@var{iprint}[2] = 1}, incluyendo los valores de @var{X} en cada iteración.
84 Igual que @code{@var{iprint}[2] = 2}, incluyendo el gradiente de @var{FOM} en cada iteración.
88 Las columnas devueltas por @code{lbfgs} son las siguientes:
92 Número de iteraciones. Se incremente tras cada búsqueda a lo
95 Número de evaluaciones de la función objetivo.
97 Valor de la función objetivo al final de cada iteración.
99 Módulo del gradiente de la función objetivo al final de
102 Un parámetro interno del algoritmo de búsqueda.
105 Para más información sobre el algoritmo se puede acudir a los
106 comentarios en el código original en Fortran [2].
108 Véanse también @code{lbfgs_nfeval_max} y @code{lbfgs_ncorrections}.
112 [1] D. Liu and J. Nocedal. "On the limited memory BFGS method for large
113 scale optimization". @i{Mathematical Programming B} 45:503--528 (1989)
115 [2] @url{http://netlib.org/opt/lbfgs_um.shar}
119 La misma función objetivo utilizada por FGCOMPUTE en el programa
120 sdrive.f del paquete LBFGS de Netlib. Nótese que las variables en
121 cuestión están subindicadas. La función objetivo tiene un
122 mínimo exacto igual a cero en @math{u[k] = 1}, para
123 @math{k = 1, ..., 8}.
126 @c t1[j] := 1 - u[j];
127 @c t2[j] := 10*(u[j + 1] - u[j]^2);
129 @c FOM : sum (t1[2*j - 1]^2 + t2[2*j - 1]^2, j, 1, n/2);
130 @c lbfgs (FOM, '[u[1], u[2], u[3], u[4], u[5], u[6], u[7], u[8]],
131 @c [-1.2, 1, -1.2, 1, -1.2, 1, -1.2, 1], 1e-3, [1, 0]);
135 (%i1) load ("lbfgs")$
136 (%i2) t1[j] := 1 - u[j];
139 (%i3) t2[j] := 10*(u[j + 1] - u[j]^2);
141 (%o3) t2 := 10 (u - u )
145 (%i5) FOM : sum (t1[2*j - 1]^2 + t2[2*j - 1]^2, j, 1, n/2);
147 (%o5) 100 (u - u ) + (1 - u ) + 100 (u - u ) + (1 - u )
150 + 100 (u - u ) + (1 - u ) + 100 (u - u ) + (1 - u )
152 (%i6) lbfgs (FOM, '[u[1],u[2],u[3],u[4],u[5],u[6],u[7],u[8]],
153 [-1.2, 1, -1.2, 1, -1.2, 1, -1.2, 1], 1e-3, [1, 0]);
154 *************************************************
155 N= 8 NUMBER OF CORRECTIONS=25
157 F= 9.680000000000000D+01 GNORM= 4.657353755084533D+02
158 *************************************************
162 I NFN FUNC GNORM STEPLENGTH
164 1 3 1.651479526340304D+01 4.324359291335977D+00 7.926153934390631D-04
165 2 4 1.650209316638371D+01 3.575788161060007D+00 1.000000000000000D+00
166 3 5 1.645461701312851D+01 6.230869903601577D+00 1.000000000000000D+00
167 4 6 1.636867301275588D+01 1.177589920974980D+01 1.000000000000000D+00
168 5 7 1.612153014409201D+01 2.292797147151288D+01 1.000000000000000D+00
169 6 8 1.569118407390628D+01 3.687447158775571D+01 1.000000000000000D+00
170 7 9 1.510361958398942D+01 4.501931728123679D+01 1.000000000000000D+00
171 8 10 1.391077875774293D+01 4.526061463810630D+01 1.000000000000000D+00
172 9 11 1.165625686278198D+01 2.748348965356907D+01 1.000000000000000D+00
173 10 12 9.859422687859144D+00 2.111494974231706D+01 1.000000000000000D+00
174 11 13 7.815442521732282D+00 6.110762325764183D+00 1.000000000000000D+00
175 12 15 7.346380905773044D+00 2.165281166715009D+01 1.285316401779678D-01
176 13 16 6.330460634066464D+00 1.401220851761508D+01 1.000000000000000D+00
177 14 17 5.238763939854303D+00 1.702473787619218D+01 1.000000000000000D+00
178 15 18 3.754016790406625D+00 7.981845727632704D+00 1.000000000000000D+00
179 16 20 3.001238402313225D+00 3.925482944745832D+00 2.333129631316462D-01
180 17 22 2.794390709722064D+00 8.243329982586480D+00 2.503577283802312D-01
181 18 23 2.563783562920545D+00 1.035413426522664D+01 1.000000000000000D+00
182 19 24 2.019429976373283D+00 1.065187312340952D+01 1.000000000000000D+00
183 20 25 1.428003167668592D+00 2.475962450735100D+00 1.000000000000000D+00
184 21 27 1.197874264859232D+00 8.441707983339661D+00 4.303451060697367D-01
185 22 28 9.023848942003913D-01 1.113189216665625D+01 1.000000000000000D+00
186 23 29 5.508226405855795D-01 2.380830599637816D+00 1.000000000000000D+00
187 24 31 3.902893258879521D-01 5.625595817143044D+00 4.834988416747262D-01
188 25 32 3.207542206881058D-01 1.149444645298493D+01 1.000000000000000D+00
189 26 33 1.874468266118200D-01 3.632482152347445D+00 1.000000000000000D+00
190 27 34 9.575763380282112D-02 4.816497449000391D+00 1.000000000000000D+00
191 28 35 4.085145106760390D-02 2.087009347116811D+00 1.000000000000000D+00
192 29 36 1.931106005512628D-02 3.886818624052740D+00 1.000000000000000D+00
193 30 37 6.894000636920714D-03 3.198505769992936D+00 1.000000000000000D+00
194 31 38 1.443296008850287D-03 1.590265460381961D+00 1.000000000000000D+00
195 32 39 1.571766574930155D-04 3.098257002223532D-01 1.000000000000000D+00
196 33 40 1.288011779655132D-05 1.207784334505595D-02 1.000000000000000D+00
197 34 41 1.806140190993455D-06 4.587890258846915D-02 1.000000000000000D+00
198 35 42 1.769004612050548D-07 1.790537363138099D-02 1.000000000000000D+00
199 36 43 3.312164244118216D-10 6.782068546986653D-04 1.000000000000000D+00
203 \halign{\hfil\tt#&\quad\hfil\tt#\quad&\tt#\hfil\quad&\tt#\hfil\quad&\tt#\hfil\cr
204 I& NFN& FUNC& GNORM& STEPLENGTH\cr
206 1& 3& 1.651479526340304D+01& 4.324359291335977D+00& 7.926153934390631D-04\cr
207 2& 4& 1.650209316638371D+01& 3.575788161060007D+00& 1.000000000000000D+00\cr
208 3& 5& 1.645461701312851D+01& 6.230869903601577D+00& 1.000000000000000D+00\cr
209 4& 6& 1.636867301275588D+01& 1.177589920974980D+01& 1.000000000000000D+00\cr
210 5& 7& 1.612153014409201D+01& 2.292797147151288D+01& 1.000000000000000D+00\cr
211 6& 8& 1.569118407390628D+01& 3.687447158775571D+01& 1.000000000000000D+00\cr
212 7& 9& 1.510361958398942D+01& 4.501931728123680D+01& 1.000000000000000D+00\cr
213 8&10& 1.391077875774294D+01& 4.526061463810632D+01& 1.000000000000000D+00\cr
214 9&11& 1.165625686278198D+01& 2.748348965356917D+01& 1.000000000000000D+00\cr
215 10&12& 9.859422687859137D+00& 2.111494974231644D+01& 1.000000000000000D+00\cr
216 11&13& 7.815442521732281D+00& 6.110762325766556D+00& 1.000000000000000D+00\cr
217 12&15& 7.346380905773160D+00& 2.165281166714631D+01& 1.285316401779533D-01\cr
218 13&16& 6.330460634066370D+00& 1.401220851762050D+01& 1.000000000000000D+00\cr
219 14&17& 5.238763939851439D+00& 1.702473787613255D+01& 1.000000000000000D+00\cr
220 15&18& 3.754016790406701D+00& 7.981845727704576D+00& 1.000000000000000D+00\cr
221 16&20& 3.001238402309352D+00& 3.925482944716691D+00& 2.333129631296807D-01\cr
222 17&22& 2.794390709718290D+00& 8.243329982546473D+00& 2.503577283782332D-01\cr
223 18&23& 2.563783562918759D+00& 1.035413426521790D+01& 1.000000000000000D+00\cr
224 19&24& 2.019429976377856D+00& 1.065187312346769D+01& 1.000000000000000D+00\cr
225 20&25& 1.428003167670903D+00& 2.475962450826961D+00& 1.000000000000000D+00\cr
226 21&27& 1.197874264861340D+00& 8.441707983493810D+00& 4.303451060808756D-01\cr
227 22&28& 9.023848941942773D-01& 1.113189216635162D+01& 1.000000000000000D+00\cr
228 23&29& 5.508226405863770D-01& 2.380830600326308D+00& 1.000000000000000D+00\cr
229 24&31& 3.902893258815567D-01& 5.625595816584421D+00& 4.834988416524465D-01\cr
230 25&32& 3.207542206990315D-01& 1.149444645416472D+01& 1.000000000000000D+00\cr
231 26&33& 1.874468266362791D-01& 3.632482152880997D+00& 1.000000000000000D+00\cr
232 27&34& 9.575763380706598D-02& 4.816497446154354D+00& 1.000000000000000D+00\cr
233 28&35& 4.085145107543406D-02& 2.087009350166495D+00& 1.000000000000000D+00\cr
234 29&36& 1.931106001379290D-02& 3.886818608498966D+00& 1.000000000000000D+00\cr
235 30&37& 6.894000721499670D-03& 3.198505796342214D+00& 1.000000000000000D+00\cr
236 31&38& 1.443296033051864D-03& 1.590265471025043D+00& 1.000000000000000D+00\cr
237 32&39& 1.571766603154336D-04& 3.098257063980634D-01& 1.000000000000000D+00\cr
238 33&40& 1.288011776581970D-05& 1.207784183577257D-02& 1.000000000000000D+00\cr
239 34&41& 1.806140173752971D-06& 4.587890233385193D-02& 1.000000000000000D+00\cr
240 35&42& 1.769004645459358D-07& 1.790537375052208D-02& 1.000000000000000D+00\cr
241 36&43& 3.312164100763217D-10& 6.782068426119681D-04& 1.000000000000000D+00\cr
246 THE MINIMIZATION TERMINATED WITHOUT DETECTING ERRORS.
248 (%o6) [u = 1.000005339816132, u = 1.000009942840108,
250 u = 1.000005339816132, u = 1.000009942840108,
252 u = 1.000005339816132, u = 1.000009942840108,
254 u = 1.000005339816132, u = 1.000009942840108]
258 Un problema de regresión. La función objetivo es el cuadrado medio
259 de la diferencia entre la predicción @math{F(X[i])} y el valor observado
260 @math{Y[i]}. La función @math{F} es monótona y acotada (llamada en ocasiones
261 "sigmoidal"). En este ejemplo, @code{lbfgs} calcula valores aproximados para los
262 parámetros de @math{F} y @code{plot2d} hace una representación gráfica
263 comparativa de @math{F} junto con los datos observados.
267 @c FOM : '((1/length(X))*sum((F(X[i]) - Y[i])^2, i, 1,
269 @c X : [1, 2, 3, 4, 5];
270 @c Y : [0, 0.5, 1, 1.25, 1.5];
271 @c F(x) := A/(1 + exp(-B*(x - C)));
273 @c estimates : lbfgs (FOM, '[A, B, C], [1, 1, 1], 1e-4, [1, 0]);
274 @c plot2d ([F(x), [discrete, X, Y]], [x, -1, 6]), ''estimates;
278 (%i1) load ("lbfgs")$
279 (%i2) FOM : '((1/length(X))*sum((F(X[i]) - Y[i])^2, i, 1,
282 sum((F(X ) - Y ) , i, 1, length(X))
284 (%o2) -----------------------------------
286 (%i3) X : [1, 2, 3, 4, 5];
287 (%o3) [1, 2, 3, 4, 5]
288 (%i4) Y : [0, 0.5, 1, 1.25, 1.5];
289 (%o4) [0, 0.5, 1, 1.25, 1.5]
290 (%i5) F(x) := A/(1 + exp(-B*(x - C)));
292 (%o5) F(x) := ----------------------
293 1 + exp((- B) (x - C))
296 (%o6) ((----------------- - 1.5) + (----------------- - 1.25)
297 - B (5 - C) - B (4 - C)
300 + (----------------- - 1) + (----------------- - 0.5)
301 - B (3 - C) - B (2 - C)
305 + --------------------)/5
308 (%i7) estimates : lbfgs (FOM, '[A, B, C], [1, 1, 1], 1e-4, [1, 0]);
309 *************************************************
310 N= 3 NUMBER OF CORRECTIONS=25
312 F= 1.348738534246918D-01 GNORM= 2.000215531936760D-01
313 *************************************************
318 I NFN FUNC GNORM STEPLENGTH
319 1 3 1.177820636622582D-01 9.893138394953992D-02 8.554435968992371D-01
320 2 6 2.302653892214013D-02 1.180098521565904D-01 2.100000000000000D+01
321 3 8 1.496348495303004D-02 9.611201567691624D-02 5.257340567840710D-01
322 4 9 7.900460841091138D-03 1.325041647391314D-02 1.000000000000000D+00
323 5 10 7.314495451266914D-03 1.510670810312226D-02 1.000000000000000D+00
324 6 11 6.750147275936668D-03 1.914964958023037D-02 1.000000000000000D+00
325 7 12 5.850716021108202D-03 1.028089194579382D-02 1.000000000000000D+00
326 8 13 5.778664230657800D-03 3.676866074532179D-04 1.000000000000000D+00
327 9 14 5.777818823650780D-03 3.010740179797108D-04 1.000000000000000D+00
331 \halign{\hfil\tt#&\quad\hfil\tt#\quad&\tt#\hfil\quad&\tt#\hfil\quad&\tt#\hfil\cr
332 I& NFN& FUNC& GNORM& STEPLENGTH\cr
334 1& 3&1.177820636622582D-01& 9.893138394953992D-02& 8.554435968992371D-01\cr
335 2& 6&2.302653892214013D-02& 1.180098521565904D-01& 2.100000000000000D+01\cr
336 3& 8&1.496348495303004D-02& 9.611201567691624D-02& 5.257340567840710D-01\cr
337 4& 9&7.900460841091138D-03& 1.325041647391314D-02& 1.000000000000000D+00\cr
338 5& 10&7.314495451266914D-03& 1.510670810312226D-02& 1.000000000000000D+00\cr
339 6& 11&6.750147275936668D-03& 1.914964958023037D-02& 1.000000000000000D+00\cr
340 7& 12&5.850716021108202D-03& 1.028089194579382D-02& 1.000000000000000D+00\cr
341 8& 13&5.778664230657800D-03& 3.676866074532179D-04& 1.000000000000000D+00\cr
342 9& 14&5.777818823650780D-03& 3.010740179797108D-04& 1.000000000000000D+00\cr
347 THE MINIMIZATION TERMINATED WITHOUT DETECTING ERRORS.
349 (%o7) [A = 1.461933911464101, B = 1.601593973254801,
350 C = 2.528933072164855]
351 (%i8) plot2d ([F(x), [discrete, X, Y]], [x, -1, 6]), ''estimates;
355 Especificando el gradiente de la función objetivo en lugar de calcularlo
360 @c F(a, b, c) := (a - 5)^2 + (b - 3)^4 + (c - 2)^6;
361 @c define(F_grad(a, b, c),
362 @c map (lambda ([x], diff (F(a, b, c), x)), [a, b, c]));
363 @c estimates : lbfgs ([F, F_grad],
364 @c [a, b, c], [0, 0, 0], 1e-4, [1, 0]);
367 (%i1) load ("lbfgs")$
368 (%i2) F(a, b, c) := (a - 5)^2 + (b - 3)^4 + (c - 2)^6$
369 (%i3) define(F_grad(a, b, c),
370 map (lambda ([x], diff (F(a, b, c), x)), [a, b, c]))$
371 (%i4) estimates : lbfgs ([F, F_grad],
372 [a, b, c], [0, 0, 0], 1e-4, [1, 0]);
373 *************************************************
374 N= 3 NUMBER OF CORRECTIONS=25
376 F= 1.700000000000000D+02 GNORM= 2.205175729958953D+02
377 *************************************************
382 I NFN FUNC GNORM STEPLENGTH
384 1 2 6.632967565917637D+01 6.498411132518770D+01 4.534785987412505D-03
385 2 3 4.368890936228036D+01 3.784147651974131D+01 1.000000000000000D+00
386 3 4 2.685298972775191D+01 1.640262125898520D+01 1.000000000000000D+00
387 4 5 1.909064767659852D+01 9.733664001790506D+00 1.000000000000000D+00
388 5 6 1.006493272061515D+01 6.344808151880209D+00 1.000000000000000D+00
389 6 7 1.215263596054292D+00 2.204727876126877D+00 1.000000000000000D+00
390 7 8 1.080252896385329D-02 1.431637116951845D-01 1.000000000000000D+00
391 8 9 8.407195124830860D-03 1.126344579730008D-01 1.000000000000000D+00
392 9 10 5.022091686198525D-03 7.750731829225275D-02 1.000000000000000D+00
393 10 11 2.277152808939775D-03 5.032810859286796D-02 1.000000000000000D+00
394 11 12 6.489384688303218D-04 1.932007150271009D-02 1.000000000000000D+00
395 12 13 2.075791943844547D-04 6.964319310814365D-03 1.000000000000000D+00
396 13 14 7.349472666162258D-05 4.017449067849554D-03 1.000000000000000D+00
397 14 15 2.293617477985238D-05 1.334590390856715D-03 1.000000000000000D+00
398 15 16 7.683645404048675D-06 6.011057038099202D-04 1.000000000000000D+00
402 \halign{\hfil\tt#&\quad\hfil\tt#\quad&\tt#\hfil\quad&\tt#\hfil\quad&\tt#\hfil\cr
403 I& NFN& FUNC& GNORM& STEPLENGTH\cr
405 1& 2& 6.632967565917637D+01& 6.498411132518770D+01& 4.534785987412505D-03\cr
406 2& 3& 4.368890936228036D+01& 3.784147651974131D+01& 1.000000000000000D+00\cr
407 3& 4& 2.685298972775191D+01& 1.640262125898520D+01& 1.000000000000000D+00\cr
408 4& 5& 1.909064767659852D+01& 9.733664001790506D+00& 1.000000000000000D+00\cr
409 5& 6& 1.006493272061515D+01& 6.344808151880209D+00& 1.000000000000000D+00\cr
410 6& 7& 1.215263596054292D+00& 2.204727876126877D+00& 1.000000000000000D+00\cr
411 7& 8& 1.080252896385329D-02& 1.431637116951845D-01& 1.000000000000000D+00\cr
412 8& 9& 8.407195124830860D-03& 1.126344579730008D-01& 1.000000000000000D+00\cr
413 9& 10& 5.022091686198525D-03& 7.750731829225275D-02& 1.000000000000000D+00\cr
414 10& 11& 2.277152808939775D-03& 5.032810859286796D-02& 1.000000000000000D+00\cr
415 11& 12& 6.489384688303218D-04& 1.932007150271009D-02& 1.000000000000000D+00\cr
416 12& 13& 2.075791943844547D-04& 6.964319310814365D-03& 1.000000000000000D+00\cr
417 13& 14& 7.349472666162258D-05& 4.017449067849554D-03& 1.000000000000000D+00\cr
418 14& 15& 2.293617477985238D-05& 1.334590390856715D-03& 1.000000000000000D+00\cr
419 15& 16& 7.683645404048675D-06& 6.011057038099202D-04& 1.000000000000000D+00\cr
424 THE MINIMIZATION TERMINATED WITHOUT DETECTING ERRORS.
426 (%o4) [a = 5.000086823042934, b = 3.052395429705181,
427 c = 1.927980629919583]
433 @defvr {Variable} lbfgs_nfeval_max
434 Valor por defecto: 100
436 La variable @code{lbfgs_nfeval_max} almacena el número máximo de
437 evaluaciones de la función objetivo en @code{lbfgs}. Cuando se
438 alcanza el valor @code{lbfgs_nfeval_max}, @code{lbfgs} devuelve
439 el resultado logrado en la última iteración exitosa.
443 @defvr {Variable} lbfgs_ncorrections
444 Valor por defecto: 25
446 La variable @code{lbfgs_ncorrections} almacena el número de correcciones
447 aplicadas a la matriz inversa aproximada del hessiano, la cual es gestionada