1 @c English version: 2011-06-07
3 * Funciones y variables para lsquares::
6 @node Funciones y variables para lsquares, , lsquares, lsquares
7 @section Funciones y variables para lsquares
10 @deffn {Función} lsquares_estimates (@var{D}, @var{x}, @var{e}, @var{a})
11 @deffnx {Función} lsquares_estimates (@var{D}, @var{x}, @var{e}, @var{a}, initial = @var{L}, tol = @var{t})
13 Estima los parámetros @var{a} que mejor se ajusten a la ecuación @var{e}
14 de variables @var{x} y @var{a} a los datos @var{D} por el método de los
15 mínimos cuadrados. La función @code{lsquares_estimates}
16 busca primero una solución exacta, y si no la encuentra, buscará
19 El resultado es una lista de listas de ecuaciones de la forma
20 @code{[a = ..., b = ..., c = ...]}. Cada elemento de la lista es un
21 mínimo diferente de error cuadrático medio.
23 Los datos deben darse en formato matricial. Cada fila es un dato (el cual suele
24 denominarse `registro' o `caso' en ciertos contextos), y las columnas contienen los
25 valores para cada una de las variables. La lista de variables @var{x} asigna un nombre
26 a cada una de las columnas de @var{D}, incluso a aquellas que no intervienen en el
27 análisis. La lista @var{a} asigna nombres a los parámetros cuyas estimaciones se
28 buscan. El argumento @var{e} es una expresión o ecuación de variables @var{x} y @var{a};
29 si @var{e} no es una ecuación (es decir, carece de igualdad), se trata como si
30 fuese @code{@var{e} = 0}.
32 Se pueden dar argumentos adicionales a @code{lsquares_estimates} en forma de ecuaciones,
33 las cuales se pasan tal cual a la función @code{lbfgs}, que es la que se encarga de
34 calcular las estimaciones por el método numérico cuando no encuentra una
37 Cuando se pueda encontrar una solución exacta, mediante @code{solve}, los datos
38 en @var{D} pueden contener valores no numéricos. Sin embargo, cuando no exista
39 solución exacta, todos los elementos de @var{D} deben ser necesariamente
40 numéricos, lo cual incluye constantes numéricas tales como @code{%pi} o @code{%e}
41 y números literales (enteros, racionales y decimales en coma flotante, tanto los de doble
42 precisión como los de precisión arbitraria).
43 Los cálculos numéricos se realizan en doble precisión con aritmética de
44 punto flotante, por lo que números de cualesquiera otro tipo son
45 convenientemente convertidos antes de proceder con los cálculos.
47 Antes de utilizar esta función ejecútese @code{load("lsquares")}.
50 @code{lsquares_estimates_exact},
51 @code{lsquares_estimates_approximate},
53 @code{lsquares_residuals}
54 y @code{lsquares_residual_mse}.
58 Un problema con solución exacta.
63 @c [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
64 @c lsquares_estimates (
65 @c M, [z,x,y], (z+D)^2 = A*x+B*y+C, [A,B,C,D]);
68 (%i1) load ("lsquares")$
70 [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
84 (%i3) lsquares_estimates (
85 M, [z,x,y], (z+D)^2 = A*x+B*y+C, [A,B,C,D]);
87 (%o3) [[A = - --, B = - --, C = -----, D = - ---]]
91 un problema para el que no se encuentra solución exacta,
92 por lo que @code{lsquares_estimates} recurre a la aproximación numérica.
96 @c M : matrix ([1, 1], [2, 7/4], [3, 11/4], [4, 13/4]);
97 @c lsquares_estimates (
98 @c M, [x,y], y=a*x^b+c, [a,b,c], initial=[3,3,3], iprint=[-1,0]);
101 (%i1) load ("lsquares")$
102 (%i2) M : matrix ([1, 1], [2, 7/4], [3, 11/4], [4, 13/4]);
116 (%i3) lsquares_estimates (
117 M, [x,y], y=a*x^b+c, [a,b,c], initial=[3,3,3], iprint=[-1,0]);
118 (%o3) [[a = 1.387365874920637, b = .7110956639593767,
119 c = - .4142705622439105]]
124 @deffn {Función} lsquares_estimates_exact (@var{MSE}, @var{a})
126 Estima los valores de los parámetros @var{a} que minimizan el error
127 cuadrático medio @var{MSE} mediante un sistema de ecuaciones que intentará
128 resolver simbólicamente con @code{solve}. El error cuadrático medio es una
129 expresión con parámetros @var{a}, como los devueltos por @code{lsquares_mse}.
131 El valor devuelto por la función es una lista de listas de ecuaciones de la
132 forma @code{[a = ..., b = ..., c = ...]}. El resultado puede contener cero, uno o
133 más elementos. Cuando la respuesta contiene más de una solución, todas ellas
134 representan mínimos del error cuadrático medio.
137 @code{lsquares_estimates},
138 @code{lsquares_estimates_approximate},
140 @code{lsquares_residuals}
141 y @code{lsquares_residual_mse}.
146 @c load ("lsquares")$
148 @c [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
149 @c mse : lsquares_mse (M, [z, x, y], (z + D)^2 = A*x + B*y + C);
150 @c lsquares_estimates_exact (mse, [A, B, C, D]);
153 (%i1) load ("lsquares")$
155 [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
169 (%i3) mse : lsquares_mse (M, [z, x, y], (z + D)^2 = A*x + B*y + C);
173 > ((D + M ) - C - M B - M A)
177 (%o3) ---------------------------------------------
179 (%i4) lsquares_estimates_exact (mse, [A, B, C, D]);
181 (%o4) [[A = - --, B = - --, C = -----, D = - ---]]
187 @deffn {Función} lsquares_estimates_approximate (@var{MSE}, @var{a}, initial = @var{L}, tol = @var{t})
189 Estima los valores de los parámetros @var{a} que minimizan el error
190 cuadrático medio @var{MSE} mediante el algoritmo numérico @code{lbfgs}.
191 El error cuadrático medio es una expresión con parámetros @var{a},
192 como los devueltos por @code{lsquares_mse}.
194 La solución devuelta por la función es un mínimo local
195 (posiblemente global) del error cuadrático medio.
197 Por consistencia con @code{lsquares_estimates_exact}, el valor devuelto
198 es una lista anidada con un único elemento, consistente en una lista
199 de ecuaciones de la forma @code{[a = ..., b = ..., c = ...]}.
201 Los argumentos adicionales de @code{lsquares_estimates_approximate}
202 se especifican como ecuaciones y se pasan de esta forma a la función @code{lbfgs}.
204 @var{MSE} debe devolver un número cuando a sus parámetros se les
205 asignen valores numéricos, lo cual implica que los datos a partir de los
206 cuales se ha generado @var{MSE} contengan únicamente constantes numéricas
207 tales como @code{%pi} o @code{%e} y números literales (enteros, racionales y
208 decimales en coma flotante, tanto los de doble
209 precisión como los de precisión arbitraria).
210 Los cálculos numéricos se realizan en doble precisión con aritmética de
211 punto flotante, por lo que números de cualesquiera otro tipo son
212 convenientemente convertidos antes de proceder con los cálculos.
214 Antes de utilizar esta función ejecútese @code{load("lsquares")}.
217 @code{lsquares_estimates},
218 @code{lsquares_estimates_exact},
220 @code{lsquares_residuals} y @code{lsquares_residual_mse}.
225 @c load ("lsquares")$
227 @c [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
228 @c mse : lsquares_mse (M, [z, x, y], (z + D)^2 = A*x + B*y + C);
229 @c lsquares_estimates_approximate (
230 @c mse, [A, B, C, D], iprint = [-1, 0]);
233 (%i1) load ("lsquares")$
235 [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
249 (%i3) mse : lsquares_mse (M, [z, x, y], (z + D)^2 = A*x + B*y + C);
253 > ((D + M ) - C - M B - M A)
257 (%o3) ---------------------------------------------
259 (%i4) lsquares_estimates_approximate (
260 mse, [A, B, C, D], iprint = [-1, 0]);
261 (%o4) [[A = - 3.67850494740174, B = - 1.683070351177813,
262 C = 10.63469950148635, D = - 3.340357993175206]]
267 @deffn {Función} lsquares_mse (@var{D}, @var{x}, @var{e})
269 Devuelve el error medio cuadrático (MSE) para la ecuación @var{e}
270 de variables @var{x} respecto de los datos @var{D}. El resultado devuelto
271 es una suma, definida como
274 $${1 \over n} \, \sum_{i=1}^n \left[{\rm lhs}\left(e_i\right) - {\rm rhs}\left(e_i\right)\right]^2,$$
281 - > (lhs(e ) - rhs(e ))
289 siendo @var{n} el número de datos y @code{@var{e}[i]} es la ecuación @var{e}
290 evaluada cuando a sus variables @var{x} se le asignan los valores asociados
291 al dato @code{i}-ésimo @code{@var{D}[i]}.
293 Antes de utilizar esta función ejecútese @code{load("lsquares")}.
298 @c load ("lsquares")$
300 @c [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
301 @c mse : lsquares_mse (M, [z, x, y], (z + D)^2 = A*x + B*y + C);
306 (%i1) load ("lsquares")$
308 [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
322 (%i3) mse : lsquares_mse (M, [z, x, y], (z + D)^2 = A*x + B*y + C);
326 > ((D + M ) - C - M B - M A)
330 (%o3) ---------------------------------------------
336 4 > (D + M ) ((D + M ) - C - M B - M A)
337 / i, 1 i, 1 i, 3 i, 2
340 (%o4) ----------------------------------------------------------
344 (%o5) (((D + 3) - C - 2 B - 2 A) + ((D + -) - C - B - 2 A)
347 + ((D + 2) - C - B - 2 A) + ((D + -) - C - 2 B - A)
350 + ((D + 1) - C - B - A) )/5
355 @deffn {Función} lsquares_residuals (@var{D}, @var{x}, @var{e}, @var{a})
357 Devuelve los residuos para la ecuación @var{e} de parámetros @var{a}
360 @var{D} es una matriz, @var{x} una lista de variables y @var{e} es una ecuación
361 o expresión general; si @var{e} no es una ecuación (es decir, carece de igualdad),
362 se trata como si fuese @code{@var{e} = 0}. La lista @var{a} contiene ecuaciones
363 que especifican valores para cualesquiera parámetros de @var{e} que no estén en @var{x}.
365 Los residuos se definen como
368 $${\rm lhs}\left(e_i\right) - {\rm rhs}\left(e_i\right),$$
377 siendo @code{@var{e}[i]} la ecuación @var{e} evaluada cuando las variables @var{x}
378 toman los valores asociados al dato @code{i}-ésimo @code{@var{D}[i]}, y haciendo las
379 asignaciones indicadas en @var{a} al resto de variables.
381 Antes de utilizar esta función ejecútese @code{load("lsquares")}.
386 @c load ("lsquares")$
388 @c [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
389 @c a : lsquares_estimates (
390 @c M, [z,x,y], (z+D)^2 = A*x+B*y+C, [A,B,C,D]);
391 @c lsquares_residuals (
392 @c M, [z,x,y], (z+D)^2 = A*x+B*y+C, first(a));
395 (%i1) load ("lsquares")$
397 [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
411 (%i3) a : lsquares_estimates (
412 M, [z,x,y], (z+D)^2 = A*x+B*y+C, [A,B,C,D]);
414 (%o3) [[A = - --, B = - --, C = -----, D = - ---]]
416 (%i4) lsquares_residuals (
417 M, [z,x,y], (z+D)^2 = A*x+B*y+C, first(a));
419 (%o4) [--, - --, - --, --, --]
425 @deffn {Función} lsquares_residual_mse (@var{D}, @var{x}, @var{e}, @var{a})
427 Devuelve el residuo del error cuadrático medio (MSE) de la ecuación @var{e}
428 para los valores parámetricos @var{a} y datos @var{D}.
430 El residuo del error cuadrático medio (MSE) se define como
433 $${1 \over n} \, \sum_{i=1}^n \left[{\rm lhs}\left(e_i\right) - {\rm rhs}\left(e_i\right)\right]^2,$$
440 - > (lhs(e ) - rhs(e ))
448 siendo @code{@var{e}[i]} la ecuación @var{e} evaluada cuando las variables @var{x}
449 toman los valores asociados al dato @code{i}-ésimo @code{@var{D}[i]}, y haciendo las
450 asignaciones indicadas en @var{a} al resto de variables.
452 Antes de utilizar esta función ejecútese @code{load("lsquares")}.
457 @c load ("lsquares")$
459 @c [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
460 @c a : lsquares_estimates (
461 @c M, [z,x,y], (z+D)^2 = A*x+B*y+C, [A,B,C,D]);
462 @c lsquares_residual_mse (
463 @c M, [z,x,y], (z + D)^2 = A*x + B*y + C, first (a));
466 (%i1) load ("lsquares")$
468 [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
482 (%i3) a : lsquares_estimates (
483 M, [z,x,y], (z+D)^2 = A*x+B*y+C, [A,B,C,D]);
486 (%o3) [[A = - --, B = - --, C = -----, D = - ---]]
488 (%i4) lsquares_residual_mse (
489 M, [z,x,y], (z + D)^2 = A*x + B*y + C, first (a));
499 @deffn {Función} plsquares (@var{Mat},@var{VarList},@var{depvars})
500 @deffnx {Función} plsquares (@var{Mat},@var{VarList},@var{depvars},@var{maxexpon})
501 @deffnx {Función} plsquares (@var{Mat},@var{VarList},@var{depvars},@var{maxexpon},@var{maxdegree})
503 Ajuste de una función polinómica multivariante a una tabla de datos por el método
504 de los @i{mínimos cuadrados}. @var{Mat} es la matriz con los datos
505 empíricos, @var{VarList} es la lista con los nombres de las variables
506 (una por cada columna de @var{Mat}, pero puede usarse @code{-} en lugar de los nombres de
507 variables para ignorar las columnas de @var{Mat}), @var{depvars} es el nombre de la
508 variable dependiente o una lista con uno o más nombres de variables dependientes
509 (cuyos nombres deben estar también en @var{VarList}), @var{maxexpon} es un argumento
510 opcional para indicar el máximo exponente para cada una de las variables independientes
511 (1 por defecto) y @var{maxdegree} es otro argumento opcional para el grado del polinomio
512 (@var{maxexpon} por defecto); nótese que la suma de exponentes de cada término debe ser
513 igual o menor que @var{maxdegree}. Si @code{maxdgree = 0} entonces no se aplicará
516 Si @var{depvars} es el nombre de una variable dependiente (no en una lista),
517 @code{plsquares} devuelve el polinomio ajustado. Si @var{depvars} es una lista
518 de una o más variables dependientes, @code{plsquares} devuelve una lista con
519 los polinomios ajustados. Los coeficientes de determinación se muestran en
520 su orden correspondiente para informar sobre la bondad del ajuste. Estos
521 valores se almacenan también en la variable global @var{DETCOEF} en un
522 formato de lista si @var{depvars} es a su vez una lista.
524 Un ejemplo sencillo de ajuste lineal multivariante:
527 (%i1) load("plsquares")$
529 (%i2) plsquares(matrix([1,2,0],[3,5,4],[4,7,9],[5,8,10]),
531 Determination Coefficient for z = .9897039897039897
533 (%o2) z = ---------------
537 El mismo ejemplo sin restricciones en el grado:
540 (%i3) plsquares(matrix([1,2,0],[3,5,4],[4,7,9],[5,8,10]),
542 Determination Coefficient for z = 1.0
543 x y + 23 y - 29 x - 19
544 (%o3) z = ----------------------
548 Cálculo del número de diagonales de un polígono de @math{N} lados
551 (%i4) plsquares(matrix([3,0],[4,2],[5,5],[6,9],[7,14],[8,20]),
552 [N,diagonals],diagonals,5);
553 Determination Coefficient for diagonals = 1.0
556 (%o4) diagonals = --------
558 (%i5) ev(%, N=9); /* Testing for a 9 sides polygon */
562 Cálculo del número de formas de colocar dos reinas en un tablero
563 n x n de manera que no se amenacen.
566 (%i6) plsquares(matrix([0,0],[1,0],[2,0],[3,8],[4,44]),
567 [n,positions],[positions],4);
568 Determination Coefficient for [positions] = [1.0]
570 3 n - 10 n + 9 n - 2 n
571 (%o6) [positions = -------------------------]
573 (%i7) ev(%[1], n=8); /* Testing for a (8 x 8) chessboard */
574 (%o7) positions = 1288
577 Un ejemplo con seis variables dependientes:
580 (%i8) mtrx:matrix([0,0,0,0,0,1,1,1],[0,1,0,1,1,1,0,0],
581 [1,0,0,1,1,1,0,0],[1,1,1,1,0,0,0,1])$
582 (%i8) plsquares(mtrx,[a,b,_And,_Or,_Xor,_Nand,_Nor,_Nxor],
583 [_And,_Or,_Xor,_Nand,_Nor,_Nxor],1,0);
584 Determination Coefficient for
585 [_And, _Or, _Xor, _Nand, _Nor, _Nxor] =
586 [1.0, 1.0, 1.0, 1.0, 1.0, 1.0]
587 (%o2) [_And = a b, _Or = - a b + b + a,
588 _Xor = - 2 a b + b + a, _Nand = 1 - a b,
589 _Nor = a b - b - a + 1, _Nxor = 2 a b - b - a + 1]
592 Antes de hacer uso de esta función ejecútese @code{load("plsquares")}.