ANALISIS DE ALGORITMOS EVOLUTIVOS PARA REDES NEURONALES Joaquín A. Pacheco, Alberto Aragón Dpto. Economía Aplicada Universidad de BURGOS. Resumen: En este trabajo se proponen y analizan diferentes técnicas Metaheurísticas, así como otras técnicas, en el aprendizaje de Redes Neuronales Artificiales, más concretamente en el conocido Perceptrón Multicapa. Concretamente se diseñan una serie de algoritmos evolutivos: Algoritmos Meméticos y basados en Scatter Search. Con estos métodos se intentan ofrecer alternativas a otros métodos, como los basados en el gradiante, (como el de la Propagación hacia atrás), ya que han mostrado ser inconsistentes debido al carácter local de su búsqueda. El objetivo de nuestro trabajo es diseñar estrategias de aprendizaje que den valores bajos en los errores cuadrátricos rápidamente de forma que puedan ser usados como métodos “on-line”. A su vez estas estrategias deben ser consistentes y mostrar su capacidad de mejora cuando se disponga de mayor tiempo de computación. Palabras clave: Redes Neuronales, Algoritmos Meméticos, Scatter Search. Aprendizaje, Metaheurísticos Evolutivos, Joaquín A. Pacheco y Alberto Aragón Análisis de algoritmos evolutivos 1.- EL PROBLEMA El perceptrón Multicapa es un modelo de red neuronal consistente en varias capas de neuronas: una de entrada, 1 o más capas ocultas y una de salida. La información se transmite de cada nodo a los nodos de la capa siguiente, desde la entrada a la salida. La información que sale de un nodo a cada nodo de la capa siguiente se pondera por un peso wji; de forma que la información total que llega a cada nodo j de la nueva capa es ∑iwji·xi , siendo xi el valor de salida de los nodos i de la capa anterior. Este valor de entrada, para los nodos de las capas ocultas y la de salida, se transforma mediante una función de transferencia f produciendo la salida del nodo j, xj = f(∑iwji·xi). Las funciones de transferencia más usadas son la sigmoide y= 1 , y la identidad o lineal y = x. 1 + e−x Para el aprendizaje de una red se usan vectores de entrenamiento, consistentes cada uno en un vector de entrada y un vector de salida. Para un determinados vector de pesos w y cada vector de entrenamiento, la red lee el vector de entrada y se compara la salida producida por la red (salida observada) con la con los valores del vector de salida (salida esperada). El problema consiste en determinar los valores de los pesos wji de forma que el Error Cuadrático Medio (E) en el conjunto de vectores de entrenamiento y valores de salida sea mínima. A continuación se muestra la notación formal y la formulación del problema. Sean n y K los números de nodos respectivamente de las capas de entrada y salida; sea S el conjunto de vectores de entrenamiento; ∀ (x, y) ∈ S x indica el vector de entrada e y el de salida; sea ο = g(x, w) la salida producida en la red con el vector de pesos w cuando lee el vector de entrada x. Entonces el problema se pude formular como minimizar E(w) siendo 1 E ( w) = S K ∑ ∑ (ο ( x, y )∈S k =1 k − yk ) . 2 Los algoritmos basados en el gradiante como el método de Propagación hacia atrás (Werbos, (1.974)) básicamente usan la siguiente fórmula de actualización de pesos w ji = w ji − η ∂E ; donde es η conocido como parámetro de aprendizaje. ∂w ji 2 Joaquín A. Pacheco y Alberto Aragón Análisis de algoritmos evolutivos Precisamente una de las limitaciones de estos métodos, es la convergencia a óptimos locales no globales y su dependencia de la solución inicial. Además no son aplicables a modelos de redes que usan funciones de transferencia no derivables. Se van a proponer algoritmos de aprendizaje basadas en la estrategia denominada Scatter Search y se va a diseñar un Algoritmo Memético. Se hará una comparación con otros métodos propuestos recientemente por otros autores. Nuestro objetivo es el diseños de estrategias que obtengan pesos con buenos resultados de E en el conjunto de aprendizaje. También interesa que los pesos obtenidos den valores bajos de E cuando se presenta otro conjunto de vectores diferentes. (Para verificar que la red haya ‘aprendido’ y no ‘memorizado’). Un segundo objetivo es que estas estrategias sean rápidas, para que puedan ser usadas, como métodos “on-line”. Por otra parte, sin dejar de lado la rapidez, interesa que las estrategias obtenidas muestren su capacidad de mejorar cuando se disponga de mayor tiempo de computación. Finalmente, es interesante que los métodos sean consistentes y “robustos”, para que la dependencia de las soluciones iniciales (o poblaciones) sea la menor posible. 2.- ARQUITECTURA DE RED NEURONAL La redes neuronales con las que se va a trabajar va a estar compuesto por una capa oculta. Se denota a n el número de neuronas de la capa de entrada (que lógicamente coincide con el número de variables de entrada), y m el número de neuronas de la capa oculta. Vamos a considerar una neurona en la capa de salida (i.e. una sola variable de salida a predecir, K = 1). Cada neurona de la capa oculta, así como la de salida tiene un elemento ‘bias’ (que funciona como constante). Una representación esquemática viene dada por la siguiente figura 3 Joaquín A. Pacheco y Alberto Aragón Análisis de algoritmos evolutivos wn +1 1 1 w1 w2 wj wm( n+1)+1 wn 2 j wm( n+2)+1 w(k-1)(n+1)+ j wk (n+1) wm (n+1)+ k o k w(k-1)(n +1)+n n w(m-1)(n +1)+n wm (n+1) wm (n +1)+m m Figura 1.- Arquitectura de red neuronal usada (tomada de Laguna y Martí, (2.000)) En este trabajo se van a utilizar 6 neuronas en la capa oculta. Los pesos están numerados secuencialmente, de forma que los pesos que enlazan la capa de entrada con la primera neurona de la oculta son del w1 al wn y su término ‘bias’ wn+1 . De esta forma la información de entrada de cada neurona k, k = 1, ...,m, de la capa n oculta, viene dada por wk ( n +1) + ∑ w( k −1 )( n +1) + j x j y la neurona de salida recibe la j =1 m siguiente información wm ( n + 2 )+1 + ∑ wm ( n +1) +k a k donde ak son las salidas de las neuronas k =1 ocultas. En nuestro caso se usa la sigmoide como función de transferencia para la capa oculta y la identidad para la neurona de salida. Un aspecto importante: en este trabajo, los métodos de aprendizaje propuestos solo se aplican a los pesos asociados con la capa oculta, i.e. de w1 a wm(n+1); los pesos de la neurona de salida se obtienen por mínimos cuadrados ordinarios cada vez que se generan los de la capa oculta. Cuando se genera un nuevo vector de pesos en la capa oculta, automáticamente se deben calcular los de la capa de salida y evaluar el valor E (solución al problema de mínimos cuadrados). Esta idea ha sido sugerida en Sexton y otros, (1.998), y (1.999), y Laguna y Martí, (2.000). 4 Joaquín A. Pacheco y Alberto Aragón Análisis de algoritmos evolutivos Finalmente se ha de indicar que para el entrenamiento los valores de cada una de las variables de los vectores de entrada son escalados entre –1,0 (el menor valor en el conjunto de entrenamiento) y +1,0 (el mayor); y los valores de la salida son escalados entre –0,8 y +0,8. 3.- MEJORA POR ENTORNOS Sea w una solución cualquiera de componentes wl y radio un número real suficientemente pequeño, se definen los siguientes procedimientos Procedimiento Perturbar_Peso(w, radio, w’) Generar una solución w’ cuyos componentes wl’ toman valores aleatorios en el intervalo (wl - radio wl + radio) Así mismo sea w0 una solución cualquiera el parámetros entero n_vecinos, el parámetro real radio se define el siguiente Procedimiento Mejor_Vecino(w0 , radio, n_vecinos, w’) min = ∞ Para i = 1 hasta n_vecinos hacer Perturbar_Peso(w0 , radio, w’’) Si E(w’) < min hacer: w’ = w’’ y min = E(w’’) Un análisis sobre el efecto de los diferentes valores de radio en este último procedimiento indica que valores altos dan lugar a descensos rápidos, y valores bajos dan lugar a descensos más lentos y profundos. Por tanto se va a intentar diseñar una estrategia que combine rápidez con ‘profundidad’ (calidad de la solución final). Sean w una solución inicial, los parámetros reales radio0 (valor inicial de radio) y alfa, y los parámetros entero n_vecinos y max_int, esta estrategia puede describirse en seudocódigo como sigue Procedimiento Mejora_Radio_Variable(w, radio0, alfa, n_vecinos, max_int) 5 Joaquín A. Pacheco y Alberto Aragón Análisis de algoritmos evolutivos Hacer radio = radio0, n_int = 0; Repetir Ejecutar Mejor_Vecino(w , radio, n_vecinos, w’) Si E(w’) < E(w) hacer: w = w’, radio = radio*alfa y n_int = 0 en caso contrario hacer: radio = radio/alfa y n_int = n_int+1 hasta n_int = max_int 4.- SCATTER SEARCH Scatter Seach es una estrategia poblacional-evolutiva caracterizada básicamente por el uso de un Conjunto de Referencia (RefSet) de soluciones. Dicho conjunto esta formado por dos Subconjuntos: Subconjunto de Calidad (RefSet1) formado por las mejores soluciones y Subconjunto de Diversidad (RefSet2) formado por las soluciones más diferentes con el resto de RefSet. En cada paso o ciclo se generan nuevas soluciones a partir de las del Conjunto de Referencia que actualizan éste. Un tutorial sobre Scatter Search se pueden encontrar en Glover, (1.998). Se ha diseñado una versión estática y una versión dinámica de esta estrategia para este problema. La descripción en seudocódigo de forma muy general es la siguiente Procedimiento Scatter Search Estático Generar un conjunto inicial de soluciones aleatorias Mejorarlas mediante un método preestablecido A partir de estas soluciones obtener RefSet inicial Repetir Construir subconjuntos de 2 y 3 elementos de RefSet Obtener nuevas soluciones a partir de dichos subconjuntos Aplicar a las nuevas soluciones el método de mejora Actualizar RefSet con las nuevas soluciones, (una vez obtenidas todas) Hasta que RefSet se estabilice (i.e. no haya nuevas soluciones) (1) El Procedimiento Scatter Search Dinámico es similar cambiando la sentencia (1) por la siguiente Cada vez que se obtiene una nueva solución actualizar RefSet (1’) En otras palabras: en la versión estática se generan las nuevas soluciones y, una vez obtenidas, con las ya existentes en RefSet se actualiza este; en la dinámica, en el momento que se genera una nueva solución se comprueba si mejora el valor de la 6 Joaquín A. Pacheco y Alberto Aragón Análisis de algoritmos evolutivos función objetivo E de alguna de las existentes en RefSet1 o aporta más diversidad que alguna de RefSet2, en cuyo caso se incorpora sin esperar a generar las demás. Como en los tutoriales de Scatter Search, antes mencionados, en la versión dinámica para evitar realizar operaciones (generar nuevas soluciones, mejorarlas y actualizar el conjunto de referencia) con subconjuntos con la misma composición de elementos que en ciclos anteriores, se propone sólo considerar los subconjuntos que contienen algún elemento nuevo, (es decir generado en el ciclo o iteración anterior). Para medir la diversidad de una solución w respecto RefSet se usa la siguiente función dmin(w) = min {d(w, w’) / w’ ∈ R}; donde d(w, w’) = Σ i |wi- wi’|. Los subconjuntos de 2 elementos se forman con todos los pares de RefSet, y los de 3 elementos se forman al añadir a todos los subconjuntos de 2 el mejor elemento de RefSet1 no presente. La forma de generar nuevos soluciones está inspirada en Kelly y otros (1.996), y se ilustra en la siguiente gráfica nw3 W2 nw1 W1 nw2 nw1 W1 nw0 W2 W3 nw2 nw3 Figura 2.- Formas de generar nuevas soluciones con subconjuntos de 2 y 3 Se define TamRef = |RefSet|, análogamente TamRef1 = |RefSet1| y TamRef2 = |RefSet2|. Inicialmente se toma TamRef1 = TamRef2 = 5. 7 Joaquín A. Pacheco y Alberto Aragón Análisis de algoritmos evolutivos Además de estas dos estrategias Estática y Dinámica analizaremos una variante de la Dinámica que aparece propuesta en los tutoriales antes mencionados. Esta variante consiste en, una vez obtenido el conjunto de referencia inicial, considerar RefSet1 = RefSet, y RefSet2 = ∅ (i.e. TamRef1 = 10, en este caso y TamRef2 = 0). En otras palabras, solo se consideraran incorporaciones a RefSet que mejoren la función objetivo de alguno de sus elementos, y no se incorporarán soluciones por diversidad. En nuestro caso el procedimiento de mejora es la ejecución del procedimiento Mejora_Radio_Variable inicialmente con radio = 0.1, alfa = 1, n_vecinos = 1, max_int= 2. 5.- ALGORITMO MEMÉTICO Los Algoritmos Meméticos también son procedimientos basados en población y se han mostrado como técnicas más rápidas que los tradicionales Algoritmos Genéticos para algunos tipos de problemas. Básicamente combinan procedimientos de búsqueda local con operadores de cruce o mutación, por lo que algunos investigadores les han visto como Algoritmos Genéticos Híbridos o Algoritmos Genéticos Paralelos (PGAs) o métodos de Búsqueda Local Genética. El método, descrito originalmente en el trabajo de Moscato, (1.989), está ganando amplia aceptación en particular en los bien conocidos problemas de optimización combinatoria donde grandes ejemplos se han solventado óptimamente y donde otros metaheurísticos han fallado. En nuestro caso el Algoritmo Memético que se propone sigue un esquema muy similar al algoritmo Genético propuesto en Sexton y otros, (1999). En este caso, se añaden procedimientos de mejora cada vez que se genera una nueva solución. En seudocódigo puede escribirse de la forma siguiente: Procedimiento Memético Generar una población inicial de soluciones Mejorarlas mediante un método preestablecido Repetir - Seleccionar aleatoriamente un subconjunto de elementos (par) de la población con una probabilidad proporcional a su bondad 8 Joaquín A. Pacheco y Alberto Aragón Análisis de algoritmos evolutivos - Cruce Reproducción: Emparejar o cruzar estas soluciones (Padres) para dar lugar a nuevos soluciones (Hijos). De cada pareja de Padres se han den generar una nueva pareja de hijos. - Mutación: Los soluciones hijas pueden cambiar con una probabilidad pequeña alguno de sus elementos (genes) - Aplicar el procedimiento de mejora a los hijos - Sustituir las peores soluciones de la población por las nuevas soluciones hijas - Actualizar el parámetro de mutación hasta conseguir algún criterio de parada Como en la estrategias Scatter Search del apartado 3 el procedimiento de mejora es Mejora_Radio_Variable con los mismos parámetros. La ‘bondad’ de cada elemento de la población va a venir dado por el valor de la función objetivo E correspondiente. La probabilidad de selección de una determinada solución w va a ser proporcional a Emax – E(w) ; donde Emax es el máximo valor de los de E(w) en los elementos de la población de esa población. El operador de cruce sigue el esquema ‘one-point crossing’, es decir, sean w y w’ dos soluciones padres seleccionadas, w = (w1 , w2 , ... wm(n+1)) y w’ = (w’1 , w’2 , ... w’m(n+1)) se genera aleatoriamente un ‘punto de cruce’ entre 1 y m(n+1)-1, (pto_cruce), de forma que las nuevas soluciones hijas se definen como w* = (w1 , w2 , ..., wpto_cruce , w’pto_cruce+1 , ..., w’m(n+1 )) w** = (w’1 , w’2 , ..., w’pto_cruce , wpto_cruce+1 , ..., wm(n+1)). Los pesos de cada nueva solución hija pueden cambiar o mutar con una pequeña probabilidad, p_mut. Para decidir si un determinado peso cambia se genera un valor aleatorio uniformemente en (0,1); si este valor es menor que p_mut se realiza el cambio. Este consiste en asignarle un nuevo punto aleatoriamente en el intervalo (-5, +5), (Mutación). Este proceso de mutación tiene por objeto dar diversidad al proceso y evitar que este se encajone en una región entorno a un mínimo local. Un aspecto relativamente novedoso es que el valor del parámetro p_mut no es fijo, sino que varía entre dos valores prefijados p_mut_min y p_mut_max. Los valores p_mut_min y p_mut_max representan probabilidades mínimas y máximas de mutación. El objeto de esta estrategia es ‘Intensificar’ de la búsqueda en una región cuando se 9 Joaquín A. Pacheco y Alberto Aragón Análisis de algoritmos evolutivos encuentran mejores soluciones, y favorecer la búsqueda en otras regiones cuando no es así. En este trabajo se utilizan los siguientes valores: p_mut_min = 0,05, p_mut_max = 0’1. Además de ello el número de elementos de la población (n_pob) es 100, y el número de padres seleccionados (n_sel) es 20. 6.- RESULTADOS COMPUTACIONALES Para contrastar la bondad de los métodos propuestos, y compararlos por otros propuestos recientemente se han realizado una serie de pruebas que se describen a continuación. En primer lugar se han considerado las siguientes funciones: 1 y = x1 + x2 2 y = x1 x 2 3 y = x1 1+ x2 0.2 y t −5 . 4 y = x12 + x 23 5 y = x13 + x 22 6 y t = y t −1 + 10.5 − 0 . 1 y t − 1 10 1 + ( y ) t −5 Para cada una de las 5 primeras funciones se considera un conjunto de entrenamiento con 50 vectores: Los valores de entrada son enteros generados en [-100, +100] para x 1 y en [-10, +10] para x 2 ; el valor de la salida y viene dado por la función correspondiente. En los 5 casos se utilizan los mismos vectores de entrada. Para la sexta función se usan 5 nodos o variables de entrada, aunque claramente solo hacen falta 3. Los vectores de entrenamiento en este caso han sido generados recursivamente a partir de los valores (1,6, 0, 0, 0, 0). Estas funciones han sido propuestas en Sexton y otros, (1.998) y (1.999), y utilizadas también en Laguna y Martí, (2.000). En este trabajo se usa, así mismo, el mismo conjunto de vectores de entrada que en estas referencias 1 . Los métodos que se van a utilizar en las pruebas son los siguientes: Scatter Search Estático (ES), Scatter Search Dinámico (DI), Variante de Scatter Search Dinámico (VD) y Algoritmo Memético (ME). Se comparan con los siguientes: Propagación hacia atrás usado en Neural Works Profession II/Plus de NeuralWare (BP); Algoritmo Búsqueda Tabú (TS) de Sexton y otros (1.998); Algoritmo Temple Simulado (SA), Algoritmo Genético (GA) estos 2 de Sexton y otros (1.999), Adaptación de Scatter Search de Laguna y Martí, (2.000) 1 Nuestro agradecimiento a los profesores R.Martí y M.Laguna por facilitarnos esta información 10 Joaquín A. Pacheco y Alberto Aragón Análisis de algoritmos evolutivos A continuación se muestra una tabla, tomada de Laguna y Martí, (2.000), en la que se muestran los mejores resultados obtenidos por los algoritmos BP, SA, GA, TS y SS, para cada uno de estos problemas: Función ↓ 1 2 3 4 5 6 BP SA GA TS SS 5.23E-01 1.05E-05 4.16E-07 1.42E-06 8.93E-08 1.10E+01 3.17E-02 1.27E-02 8.38E-02 5.97E-03 8.43E+00 1.76E+00 1.82E-01 2.45E-01 2.96E-03 1.88E+02 4.84E-01 4.09E-02 4.32E-01 2.31E+00 8.57E+03 4.39E-01 3.06E-03 2.56E-02 2.76E+02 1.55E-01 1.02E-02 2.53E-02 5.35E-02 3.34E-03 Tabla 2.- Mejores resultados obtenidos por BP, SA, GA, TS y SS Según, Laguna y Martí, 2.000, Sexton, (1.998) y (1.999), SS limita el número de evaluaciones a 50000; BP realiza 4,18 millones, SA entre 112501 y 12,6 millones, GA 100000, y TS entre 190021 y 928061. Por tanto estos, los métodos más rápidos son SS y GS. Además SS obtiene los mejores resultados para las funciones 1, 2, 3 y 6 y GA para las funciones 4 y 5. A continuación se muestra una tabla, en la que se muestran los mejores resultados obtenidos por nuestros algoritmos con 100000 evaluaciones DI VD ES ME Función ↓ 1 1,65E-09 8,84E-09 5,60E-12 6,32E-13 2 1,95E-03 1,45E-04 1,01E-04 6,56E-05 3 1,58E-03 1,01E-03 3,00E-03 4,62E-04 4 5,28E-02 2,48E-02 5,27E-03 1,93E-03 5 8,39E-01 2,71E-01 7,33E-01 4,58E-03 6 2,04E-04 5,69E-05 2,47E-04 1,51E-03 Tabla 3.- Mejores resultados finales obtenidos por DI, VD, ES y ME Posteriormente, se ha generado un conjunto test de 150 vectores donde los valores de entrada se generan con la misma distribución que los del conjunto de entrenamiento. Este conjunto test se va a usar para examinar la capacidad de la red de predecir valores de y cuando los valores de x no están en el conjunto de entrenamiento. A continuación se muestra un cuadro, tomado de Laguna y Martí, (2.000), en la que se señalan los resultados conseguidos en el conjunto test por los pesos obtenidos por los algoritmos BP, SA, GA, TS y SS Función ↓ 1 2 3 BP 1.76E+00 9.11E+01 2.34E+01 SA 1.56E-05 1.85E-01 5.53E+00 GA 3.68E-07 1.72E-02 1.38E+00 11 TS 2.79E-06 1.96E-01 1.69E+00 SS 9.37E-07 2.13E-01 1.55E+00 Joaquín A. Pacheco y Alberto Aragón Análisis de algoritmos evolutivos 4 4.31E+02 2.73E+00 4.53E-02 1.15E+00 9.26E+00 5 5.28E+04 1.36E+00 2.02E-02 5.68E-02 5.98E+03 6 1.95E-01 2.69E-01 3.40E-02 6.75E-02 2.90E-01 Tabla 4.- Mejor valor de E obtenido por BP, SA, GA, TS y SS para el conjunto test Finalmente se muestra una tabla con los mejores errores cuadráticos medios para el conjunto test, de los pesos finales obtenidos por los algoritmos propuestos en este trabajo Función ↓ DI VD ES ME 1 2,34E-09 9,26E-09 2,93E-11 1,13E-11 2 5,72E-03 6,26E-04 2,20E-04 1,45E-04 3 1,38E-01 7,59E-02 1,75E-01 9,89E-02 4 2,24E-01 4,11E-02 1,38E-02 6,52E-03 5 1,72E+00 7,08E-01 1,25E+00 2,43E-02 6 1,16E-01 1,02E-01 1,08E-01 8,64E-02 Tabla 5.- Mejor valor de E obtenido por BP, SA, GA, TS y SS para el conjunto test 8.- CONCLUSIONES FINALES En este trabajo se han propuesto 4 métodos evolutivos que tienen en común la aplicación de alguno de los procedimientos de mejora anterior cada vez que se generaba una nueva solución. Los tres primeros de estos métodos (DI, VD y ES) propuestos estaban basados en la estrategia Metaheurística denominada Scatter Search, mientras que el cuarto es un Algoritmo Memético, (ME). Estos 4 métodos han destacado por lo siguiente: 1) Generan buenas soluciones en poco tiempo; 2) Superan, en casi todos los casos, a los resultados obtenidos por otras estrategias propuestas en trabajos recientes; 3) Mantienen la capacidad de obtener buenos resultados cuando se les presentan valores de entrada diferentes a los utilizados en el aprendizaje. 9.- BIBLIOGRAFÍA GLOVER, F. (1998) “A Template for Scatter Search and Path Relinking,” in Artificial Evolution, Lecture Notes in Computer Science 1363, J.-K. Hao, E. Lutton, E. Ronald, M. Schoenauer and D. Snyers (Eds.), Springer-Verlag, pp. 13-54. 12 Joaquín A. Pacheco y Alberto Aragón Análisis de algoritmos evolutivos KELLY, J. P., B. RANGASWAMY, and J. XU, (1.996): “A Scatter Search-Based Learning Algorithm for Neural Networks Training”. Journal of Heuristics, vol.2, n.2, 129-146. LAGUNA, M. y R. MARTÍ (2.000) “Neural Network Prediction in a System for Optimizing Simulations”. Aceptada para su publicación en IEEE Transactions. SEXTON, R. S., B. ALIDAEE, R. E. DORSEY and J. D. JOHNSON (1998) “Global Optimization for Artificial Neural Networks: A Tabu search Application,” European Journal of Operational Research, vol. 106, pp. 570-584. SEXTON, R. S., R. E. DORSEY and J. D. JOHNSON (1999) “Optimization of Neural Networks: A Comparative Analysis of the Genetic Algorithm and Simulated Annealing,” European Journal of Operational Research, vol. 114, pp. 589-601. WERBOS, P. (1.974): Beyond Regression: New tools for prediction and analisys in the behavioral sciences. Tesis Doctoral. Harvard. Cambridge. 13
© Copyright 2024