viernes, 26 de marzo de 2010

Modelos desarrollo de software

Un modelo es una estructura conceptual que sugiere un marco de ideas para un conjunto de descripciones que de otra manera no podrían ser sistematizadas. De esta manera, su estructura es diferente de la que se supone existe en el conjunto de fenómenos de la naturaleza. El modelo concebido en esta forma, impulsa la inteligibilidad y ayuda a la comprensión de los fenómenos, ya que proporciona los canales de interconexión entre hechos que sin la existencia de los lazos de inferencia, podrían permanecer aislados e independientes unos de otros. Otra versión del concepto de modelo es aquella que lo define como una serie de realizaciones que sirven durante una época de ciencia normal para definir problemas y métodos legítimos en un campo específico de investigación.

Se denomina software, programática, equipamiento lógico o soporte lógico a todos los componentes intangibles de una computadora, es decir, al conjunto de programas y procedimientos necesarios para hacer posible la realización de una tarea específica, en contraposición a los componentes físicos del sistema. Esto incluye aplicaciones informáticas tales como un procesador de textos, que permite al usuario realizar una tarea, y software de sistema como un sistema operativo, que permite al resto de programas funcionar adecuadamente, facilitando la interacción con los componentes físicos y el resto de aplicaciones. La evolución de la ingeniería del software ha traído consigo propuestas diferentes para mejorar los resultados del proceso de construcción. Las metodologías tradicionales haciendo énfasis en la planeación, y las metodologías ágiles haciendo énfasis en la adaptabilidad del proceso, delinean las principales propuestas presentes en la literatura. De manera paralela, el tema de modelos para el mejoramiento de los procesos de desarrollo ocupa un lugar importante en la búsqueda de la metodología adecuada para producir software de calidad en cualquier contexto de desarrollo.

La ingeniería del software cuenta con varios modelos, paradigmas o filosofías de desarrollo en los cuales se puede apoyar para la realización de un producto denominado software, de los cuales se puede destacar a los siguientes por ser los más utilizados y los más completos: (1) Modelo en cascada o clásico. En la ingeniería del software el desarrollo en cascada, también llamado modelo en cascada, es el enfoque metodológico que ordena rigurosamente las etapas del ciclo de vida del software, de tal forma que el inicio de cada etapa debe esperar a la finalización de la inmediatamente anterior. Cualquier error de diseño detectado en la etapa de prueba conduce necesariamente al rediseño y nueva programación del código afectado, aumentando los costos del desarrollo. La palabra cascada sugiere, mediante la metáfora de la fuerza de la gravedad, el esfuerzo necesario para introducir un cambio en las fases más avanzadas de un proyecto. (2) Modelo de desarrollo en espiral. El desarrollo en espiral es un modelo de ciclo de vida del software definido por primera vez por Barry Boehm en el año 1988, utilizado generalmente en la ingeniería del software. Las actividades de este modelo se conforman en una espiral, en la que cada bucle o iteración representa un conjunto de actividades. Las actividades no están fijadas a priori, sino que las siguientes se eligen en función del análisis de riesgo, comenzando por el bucle interior. (3) Modelo de prototipos. En la ingeniería del software el desarrollo con prototipación, también llamado modelo de prototipos que pertenece a los modelos de desarrollo evolutivo, se inicia con la definición de los objetivos globales para el software, luego se identifican los requisitos conocidos y las áreas del esquema en donde es necesaria más definición. Entonces se plantea con rapidez una iteración de construcción de prototipos y se presenta el modelado en forma de un diseño rápido. (4) Diseño rápido. El diseño rápido se centra en una representación de aquellos aspectos del software que serán visibles para el cliente o el usuario. El diseño rápido conduce a la construcción de un prototipo, el cual es evaluado por el cliente o el usuario para una retroalimentación; gracias a ésta se refinan los requisitos del software que se desarrollará. La iteración ocurre cuando el prototipo se ajusta para satisfacer las necesidades del cliente. Esto permite que al mismo tiempo el desarrollador entienda mejor lo que se debe hacer y el cliente vea resultados a corto plazo. (5) Modelo por etapas. El modelo de desarrollo de software por etapas es similar al modelo de prototipos ya que se muestra al cliente el software en diferentes estados sucesivos de desarrollo, se diferencia en que las especificaciones no son conocidas en detalle al inicio del proyecto y por tanto se van desarrollando simultáneamente con las diferentes versiones del código. Estas diferentes fases se van repitiendo en cada etapa del diseño. (6) Desarrollo iterativo y creciente. También denominado desarrollo incremental, es un proceso para el desarrollo del software, creado en respuesta a las debilidades del modelo tradicional de cascada. Para apoyar el desarrollo de proyectos por medio de este modelo se han creado entornos de trabajo, de los cuales los dos más famosos son el “Proceso Unificado de Rational” y el “Método para el desarrollo de Sistemas Dinámicos”. El desarrollo incremental e iterativo es también una parte esencial de un tipo de programación conocido como Programación Extrema y las demás estructuras para el desarrollo rápido de software. (7) Desarrollo rápido de aplicaciones. El desarrollo rápido de aplicaciones es un proceso de desarrollo del software, desarrollado inicialmente por James Martin en el año 1980. El método comprende el desarrollo iterativo, la construcción de prototipos y el uso de utilidades CASE. Tradicionalmente, el desarrollo rápido de aplicaciones tiende a englobar también la usabilidad, utilidad y la rapidez de ejecución. Se suele utilizar para hace referencia al desarrollo rápido de interfaces gráficas de usuario tales como Glade, o entornos de desarrollo integrado completos. Algunas de las plataformas más conocidas son Visual Studio, Delphi, Foxpro o Anjuta.

Con lo mencionado se puede decir que los modelos tradicionales, para el desarrollo del software, se caracterizan por exponer procesos basados en planeación exhaustiva. Esta planeación se realiza esperando que el resultado de cada proceso sea determinante y predecible. La experiencia ha mostrado que, como consecuencia de las características del software, los resultados de los procesos no son siempre predecibles y sobre todo, es difícil predecir desde el comienzo del proyecto cada resultado. Sin embargo, es posible por medio de la recolección y estudio de métricas de desarrollo lograr realizar estimaciones acertadas en contextos de desarrollo repetibles. Rememorando la historia, el modelo de cascada fue uno de los primeros modelos de ciclo de vida que formalizó un conjunto de procesos de desarrollo de software. Este modelo de ciclo de vida describe un orden secuencial en la ejecución de los procesos asociados. El modelo espiral fue postulado como una alternativa al modelo de cascada. La ventaja de este modelo radica en el perfeccionamiento de las soluciones encontradas con cada ciclo de desarrollo, en términos de dar respuesta a los requerimientos inicialmente analizados. El modelo de cascada y el modelo espiral suponen, de manera general, que los requerimientos del cliente no cambian radicalmente en el transcurso de construcción del sistema.

Por otro lado, la realización de prototipos es una herramienta en la que se apoyan diferentes modelos de ciclo de vida. Un prototipo debe tener el objetivo de mostrar al cliente o a la gerencia del proyecto el resultado que se obtendrá de la implementación de cada uno de los requerimientos del cliente una vez terminado el desarrollo. Con los prototipos se tiene la posibilidad de obtener retroalimentación de manera temprana. La solución a algunos de los problemas presentados por las metodologías tradicionales se logra con una gran evolución del modelo espiral. El proceso unificado propone la elaboración de varios ciclos de desarrollo, donde cada uno finaliza con la entrega al cliente de un producto terminado. Este se enmarca entre los conocidos modelos iterativo-incrementales.

Más allá de los modelos tradicionales, muchos grupos de desarrollo han experimentado soluciones que basan su fundamento en la adaptabilidad de los procesos de desarrollo, en lugar de seguir esperando lograr resultados predecibles de un proceso que no evoluciona. Esta comunidad de desarrolladores e investigadores han nombrado su trabajo bajo lo que se conoce como modelos ágiles. Los modelos ágiles como puede entenderse mal, no están en contra de administrar procesos de desarrollo. Por el contrario promueven la formalización de procesos adaptables. La programación extrema es una metodología para el desarrollo de software ágil que define pocas reglas y pocas prácticas. La programación extrema promueve la adaptabilidad de los procesos de desarrollo basándose en los principios y prácticas que presenta. Quienes trabajan usando programación extrema deben seguir procesos disciplinados, pero más que eso, deben combinar la disciplina con la adaptabilidad necesaria del proceso. Los modelos Cristal se basan en el principio de que tipos diferentes de proyectos requieren tipos diferentes de metodologías. El modelo elegido debe depender de dos factores: el número de personas en el proyecto, y las consecuencias de los errores. Conforme al principio de las metodologías ágiles, Scrum recalca la imposibilidad de encontrar procesos definidos y repetibles cuando no existen problemas, personas, ni ambientes definidos y repetibles.

Guillermo Choque Aspiazu
http://www.eldiario.net/
Enero 25 de 2010

viernes, 19 de marzo de 2010

Computación

Una computadora es simplemente cualquier dispositivo que pueda calcular. El nombre se deriva del latín computare, que significa contar o calcular, y se aplica adecuadamente a un ábaco en la antigüedad y a una máquina sumadora en la actualidad. La computadora fue el elemento tecnológico más importante que afectó a la sociedad en la década de los años 1960 y surge de la necesidad de encontrar formas eficientes de manipular información para representar hechos o situaciones reales. En otras palabras, el hombre no ha parado de crear máquinas, dada su continua necesidad de transmitir y tratar información. Se entendió, entonces, que el término computación se refería al conjunto de conocimientos, técnicas y formas de uso relativas a computadoras en general. Sin embargo, también se creó el término informática, para referirse a la ciencia encargada del estudio y desarrollo de las computadoras y de los métodos para procesar la información. El término informática se creó en Francia el año 1962, y procede de la contracción de la palabra: Información automática. En general, se entiende por informática a la ciencia que estudia el tratamiento automático y racional de la información.

La computación o ciencia de la computación, es el estudio de los fundamentos teóricos de la información y el cómputo, así como las técnicas prácticas para su implementación y uso en sistemas de cómputo. Es descrita con frecuencia como un estudio sistemático de los procesos algorítmicos que crean, describen y transforman la información. De acuerdo con Peter J. Denning, la cuestión fundamental en que se basa la ciencia de la computación es, ¿Qué puede ser eficientemente automatizado?. La ciencia de la computación tiene muchos sub-campos; algunos de los cuales como los gráficos por computadora, se especializan en calcular resultados específicos, mientras que otros como la teoría de complejidad computacional, estudia las propiedades de los problemas computacionales. Incluso otros sub-campos se enfocan en desafíos para el cómputo aplicado. Por ejemplo, la teoría de los lenguajes de programación estudia aproximaciones para describir cálculos, mientras que la programación de computadoras aplica específicamente lenguajes de programación para resolver problemas específicos, y la interacción hombre-computadora se enfoca en hacer que tanto las computadoras como sus programas o aplicaciones sean útiles, usables y accesibles de manera universal para toda la humanidad.

El concepto de “computación” refiere al estudio científico que se desarrolla sobre sistemas automatizados para el manejo de la información, lo cual se lleva a cabo a través de herramientas pensadas para tal propósito. Es de este modo, que aparecen conceptos como la computadora personal, tecnología computacional, Informática e Internet, que se vinculan entre sí en el marco del procesamiento y movilidad de la información. La ciencia de la computación supone un área muy profunda de análisis, que tiene sus orígenes en 1920, cuando “computación” hacía referencia a los cálculos generados por la propia persona. Luego, con la llegada de las computadoras personales, la historia y el significado de este concepto se ampliarían sobre nuevos horizontes, distinguiendo los algoritmos que forman parte del desarrollo asociado a la solución lógica de los problemas. En una síntesis bastante apretada, “computación” implica las órdenes y soluciones dictadas en una máquina, que comprenden el análisis de los factores involucrados sobre este proceso, dentro de los cuales aparecen los lenguajes de programación. De este modo, se automatizan tareas, generando datos concretos de manera ordenada.

La computación es la disciplina que busca establecer una base científica para resolver problemas mediante el uso de dispositivos electrónicos y sistemas computacionales. La computación es el estudio de métodos algorítmicos para representar y transformar la información, incluyendo su teoría, diseño, implementación, aplicación y eficiencia. Las raíces de la computación se extienden profundamente en la matemática y la ingeniería. La matemática imparte el análisis del campo y la ingeniería imparte el diseño. La computación se define como el conjunto de conocimientos científicos y técnicos, entre los cuales se encuentran las bases teóricas, métodos, metodologías, técnicas, y tecnologías, las cuales en su conjunto hacen posible el procesamiento automático de los datos mediante el uso de computadoras, para producir información útil y significativa para el usuario. En contraposición con lo mencionado, la computación no es: (1) conocer que computadora comprar, (2) arreglar computadoras, (3) editar y procesar textos, (4) instalar software, (5) navegar por la Web, (6) manejar paquetes de software comercial, (7) diseñar aplicaciones basadas en la Web, (8) conocer diferentes lenguajes de programación, (9) administrar cabinas con el servicio WWW de Internet, (10) diseñar soluciones graficas.

La historia de la computación puede remontarse a cientos de años atrás, cuando se creaban máquinas para ayudar en tareas de cálculo, tales como el ábaco. La primera calculadora mecánica fue creada el año 1623 por Wilhelm Schickard, además Charles Babbage diseñó la máquina diferencial en la época victoriana. Todas las máquinas se limitaban a realizar una sola tarea, o como mucho, algún subconjunto de todas las posibles tareas. Las nuevas y poderosas computadoras comenzaron a ser desarrolladas durante la década de los años 1940, que es también cuando comenzó a hacerse evidente que las computadoras podían usarse para mucho más que simples cálculos matemáticos. La masificación de la computación llegó de la mano de las computadoras personales a principios de los años 1980, y el acceso a la información mundial de la mano de Internet, que comenzó su éxito en los años 1990.

Los datos son en general cifras originales, tomados de diversas fuentes que, solos, tienen poco significado. El dato es un concepto básico o elemental, como los nombres de las cosas o las cantidades: un precio, una fecha, el nombre de una persona, etc. La información se refiere a datos “ya trabajados” y con un orden y significado útil para la persona que los recibe. Los datos una vez procesados se convierten en información provechosa. En general se entiende por información a toda forma de representación de hechos, objetos, valores, ideas, etcétera, que permite adquirir el conocimiento de las cosas y la comunicación entre personas. En otros términos, la información es un conjunto de datos convertidos en una forma útil o inteligible como, por ejemplo, un documento impreso, un recibo, etc. Para que una computadora pueda procesar datos es necesario suministrarle las instrucciones adecuadas, para el manejo de esos datos, las cuales deben de ser proporcionadas en forma de programas. Un programa, entonces, es la secuencia de instrucciones que se dan a una computadora para realizar un proceso determinado.

Antes de realizar un programa, previo a la fase de automatización, y producto del análisis hecho al problema planteado, debe realizarse un algoritmo, que no es otra cosa que el conjunto de operaciones necesarias para transformar los datos iniciales en los resultados que se desean obtener en un determinado trabajo. Un algoritmo puede ser elaborado de forma gráfica o escrita y una vez que éste es traducido a un lenguaje de programación es que se denomina programa. Al conjunto de uno o varios programas que realizan un determinado trabajo completo se le denomina aplicación informática.

El término sistema informático se utiliza para nombrar al conjunto de elementos necesarios para la realización de aplicaciones. Un sistema informático puede entenderse como la unión de tres elementos básicos, el hardware, el software y el personal informático, cuya principal finalidad es el procesamiento de datos.

Al cierre se menciona que las computadoras se pueden clasificar en: (1) Analógicas. Las que tienen la capacidad de medir o comparar según un patrón preestablecido. Procesan datos continuos, es decir, manejan señales eléctricas analógicas proporcionales a medidas físicas de tipo continuo y suelen aplicarse para controlar procesos y en determinados problemas de simulación para usos médicos, científicos, meteorológicos, etc. Su programación está plasmada en los circuitos que lo integran y produce sus resultados en forma gráfica. (2) Digitales. Este tipo de computadora maneja señales eléctricas de tipo digital, como datos representados por medio de valores discretos, y por lo tanto opera con información discreta en el tiempo. Procesa los datos siguiendo las especificaciones de un programa por medio de lenguajes y su utilización comprende cualquier tipo de trabajos. (3) Híbridas. Es la combinación de los dos anteriores. Suelen estar constituidas por una computadora digital que procesa información analógica, para lo cual tiene sus entradas y salidas controladas por medio de convertidores analógico-digital o digital-analógico.

Guillermo Choque Aspiazu
http://www.eldiario.net/
Enero 18 de 2010

viernes, 12 de marzo de 2010

Algoritmo genético de grano fino

Los algoritmos evolutivos basan su funcionamiento en un mecanismo análogo a los procesos evolutivos naturales, con el objetivo de resolver problemas de búsqueda y optimización. En el caso de los algoritmos genéticos, durante el proceso se mantiene una población de soluciones que evolucionan de acuerdo a operaciones de selección, apareamiento, reemplazo y mutación, siguiendo la idea de la supervivencia de los individuos más aptos. El grado de adaptación de un individuo se evalúa de acuerdo al problema a resolver, mediante una función de adaptabilidad. Los algoritmos genéticos son una robusta herramienta de optimización que pueden ser utilizados para resolver un amplio abanico de problemas de manera eficiente y precisa. Son tres operadores básicos los que dirigen la búsqueda en los algoritmos genéticos. La función de selección predispone la búsqueda hacia soluciones prometedoras. La calidad de cada individuo viene dada por la función de adaptabilidad, que es específica al problema a ser resuelto. Las funciones de apareamiento y mutación introducen variación al combinar el conjunto actual de soluciones prometedoras.

Las técnicas de procesamiento paralelo y distribuido se aplican al modelo clásico de algoritmo genético con el objetivo de obtener mejoras desde el punto de vista de la eficiencia y para perfeccionar la calidad de la búsqueda genética. Desde la perspectiva de la eficiencia, paralelizar un algoritmo genético permite afrontar la lentitud de convergencia para problemas cuya dimensión motiva el uso de poblaciones numerosas, o múltiples evaluaciones de funciones de adaptación costosas. Desde el punto de vista algorítmico, los algoritmos genéticos paralelos pueden explotar el paralelismo intrínseco del mecanismo evolutivo, trabajando simultáneamente sobre varias poblaciones semi-independientes para resolver el mismo problema. Intercambios eventuales de soluciones o migraciones, introducen diversidad para evitar problemas de convergencia en óptimos locales. Complementariamente, los algoritmos genéticos paralelos pueden aprovechar características de paralelismo propias del problema, analizando concurrentemente diferentes secciones del espacio de búsqueda.

Los estudios recientes han demostrado que la paralelización puede mejorar significativamente el rendimiento de los algoritmos genéticos. Muchos operadores de búsqueda pueden ser distribuidos fácilmente, y obtenerse así grandes incrementos de velocidad en problemas difíciles. Existen dos enfoques generales para “paralelizar” algoritmos genéticos: el primero es conocido como maestro-esclavo y el segundo de grano grueso o fino. La arquitectura maestro-esclavo suele emplearse cuando la función de adaptabilidad, que determina la calidad de cada solución individual, es el operador más costoso. La función de evaluación se distribuye entre un número determinado de procesadores esclavos y todos los operadores restantes: mutación, apareamiento y selección, se ejecutan en el procesador maestro. En los algoritmos genéticos en paralelo de grano fino o de grano grueso, la población se divide en subpoblaciones organizadas en una red. Todos los operadores en cada subpoblación se ejecutan a través de un elemento de procesamiento separado que contiene a la subpoblación. Las diferentes subpoblaciones pueden comunicarse por medio de diversas topologías de red y patrones de comunicación.

Los algoritmos genéticos pueden clasificarse en dos grandes clases: (1) En la primera clase, los algoritmos genéticos en paralelo maestro-esclavo, distribuyen las funciones de adaptabilidad entre procesadores esclavos. La información la recolecta el procesador maestro, que procesa la población de soluciones candidato, aplicando operadores de selección, apareamiento y mutación. Posteriormente envía las nuevas soluciones a sus esclavos para que sean evaluadas. (2) La segunda clase son los algoritmos genéticos en paralelo de grano fino y de grano grueso, donde la población se distribuye entre un número dado de procesadores. Cada procesador procesa su subpoblación. Se permite que las subpoblaciones se comuniquen entre sí e intercambien soluciones a algunos intervalos. Pueden usarse varias topologías de conexión y patrones de comunicación.

Los algoritmos genéticos de grano fino dividen la población en pequeñas subpoblaciones que contienen sólo una o dos soluciones que están conectadas en topología de rejilla. Los individuos se comunican únicamente con su vecindario. El propósito original de los algoritmos genéticos de grano fino era usar un gran número de pequeños procesadores, donde cada procesador procesaría una única solución. En los algoritmos genéticos de grano grueso, las subpoblaciones son más grandes y la comunicación se reduce al intercambio de soluciones sólo de vez en cuando o después de que los algoritmos hayan convergido. Varias topologías comunes para la comunicación incluyen anillos, rejillas, hipercubos, grafos fuertemente conexos y grafos aleatorios con un número fijo de enlaces para cada elemento de proceso. Cada una de las paralelizaciones puede representar una mejora significativa para algunos problemas. Si la función de adaptabilidad se lleva la mayoría de recursos computacionales, los algoritmos genéticos en paralelo maestro-esclavo suelen dar buenos resultados. Sin embargo, cuando la función de evaluación no requiere un tiempo significativamente mayor que los otros operadores, los algoritmos genéticos de grano fino o grueso pueden mejorar aún más el rendimiento. Como se ha mencionado, los algoritmos genéticos de grano fino fueron diseñados originalmente para ejecutarse en máquinas con un gran número de pequeños procesadores conectados en topología de rejilla. Mientras la optimización se realiza, se podría esperar que soluciones parciales de gran calidad se propaguen de un sitio a otro de la rejilla en un proceso parecido a la difusión. Este comportamiento es interesante en sí mismo, y puede eliminar problemas de convergencia prematura, y puede también mejorar la ejecución del algoritmo en máquinas monoprocesador. Estas son algunas razones que se utilizan a momento de elegir un algoritmo de grano fino.

En una implementación especifica de un algoritmo genético de grano fino, la población de soluciones candidato se ha acotado a una rejilla bidimensional, donde cada posición de la rejilla puede contener una solución particular o estar vacía. En cada iteración del algoritmo, todas las soluciones pasan por el operador de apareamiento, en el que el individuo se combina con un vecino escogido al azar de su vecindario. El individuo, pasa entonces por un operador de mutación que realiza una ligera modificación a la solución actual. Si el nuevo individuo es de una calidad mayor, entonces reemplaza al individuo original. Esto introduce la presión de selección que discrimina la búsqueda hacia soluciones de mayor calidad. A continuación, puede aplicarse un operador local de búsqueda para afinar la solución particular. De este modo, un algoritmo genético realiza una búsqueda global, mientras que el operador local de búsqueda trata de mejorar el individuo en algún pequeño vecindario.

Un programa es paralelo si en cualquier momento de su ejecución puede ejecutar más de un proceso. Para crear programas paralelos eficientes hay que crear, destruir y especificar procesos así como la interacción entre ellos. Básicamente existen tres formas de paralelizar un programa: (1) Paralelización de grano fino. La paralelización del programa se realiza a nivel de instrucción. Cada procesador hace una parte de cada paso del algoritmo, selección, apareamiento y mutación, sobre la población común. (2) Paralelización de grano medio. Los programas se paralelizan a nivel de bucle. Esta paralelización se realiza habitualmente de forma automática en los compiladores. (3) Paralelización de grano grueso. Se fundamentan en la descomposición del dominio de datos entre los procesadores, siendo cada uno de ellos el responsable de realizar los cálculos sobre sus datos locales. La paralelización de grano grueso tiene como atractivo la portabilidad, ya que se adapta perfectamente tanto a multiprocesadores de memoria distribuida como de memoria compartida.

Una de las principales ventajas de los algoritmos genéticos es que permite que sus operaciones se puedan ejecutar en paralelo. Debido a que la evolución natural trata con una población entera y no con individuos particulares, excepto para la fase de selección, durante la cual existe una competencia entre los individuos y en la fase de reproducción, en donde se presentan iteraciones entre los miembros de la población, cualquier otra operación de la población, en particular la evaluación de cada uno de los miembros de la población, pueden hacerse separadamente. Por lo tanto, casi todas las operaciones en los algoritmos genéticos son implícitamente paralelas. Se ha establecido que la eficiencia de los algoritmos genéticos para encontrar una solución optima, está determinada por el tamaño de la población. Por lo tanto, una población grande requiere de más memoria para ser almacenada. También se ha probado que toma mayor cantidad de tiempo para lograr la convergencia. Al utilizar computadoras en paralelo, no solamente se provee de más espacio de almacenamiento, sino también con el uso de ellos se podrán producir y evaluar más soluciones en un tiempo más pequeño. Debido al paralelismo, es posible incrementar el tamaño de la población, reducir el costo computacional y mejorar el desempeño de los algoritmos genéticos.

Guillermo Choque Aspiazu
http://www.eldiario.net/
Enero 11 de 2010

viernes, 5 de marzo de 2010

Redes neuronales para series de tiempo

Como lo señalan Swanson y White el año 1995, además de Plasmans y sus colegas el año 1998, un modelo de red neuronal artificial se define como una clase de modelos no lineales flexibles desarrollados por científicos cognitivos. Tales modelos están inspirados en ciertas características asociadas al procesamiento de información en el cerebro humano. El elemento central de este tipo de modelo es la estructura novedosa del sistema de procesamiento de la información, la cual está compuesta por un gran número de elementos interconectados de procesamiento que operan al mismo tiempo para resolver un problema específico. Dichos modelos son capaces de aprender mediante la interacción con su ambiente; tal aprendizaje puede ser entendido como un procedimiento estadístico de estimación recursiva. En particular, una red neuronal artificial se configura para una aplicación específica, de tal forma que el reconocimiento de patrones y la clasificación de información se alcanzan a través de un proceso de aprendizaje. Es de señalar que el aprendizaje tanto en sistemas biológicos como en las redes neuronales artificiales conlleva ajustes en las conexiones sinápticas entre las neuronas.

Las redes neuronales artificiales fueron desarrolladas a partir de los trabajos de investigación sobre la fisiología de las neuronas biológicas de Erlonger y Gasser en el año 1924, y de los estudios sobre la actividad de los neurotransmisores de Hadgkin y Huxley en el año 1956. Una red neuronal artificial emula una red neuronal biológica en la que cada nodo o unidad de procesamiento, se corresponde con una neurona y tiene como función recibir varios impulsos o entradas, procesarlos y transmitir un resultado a otros nodos o salidas. La implementación de las redes neuronales artificiales como modelo matemático para las redes neuronales biológicas fue desarrollada por McCulloch y Pitts en el año 1943. Sin embargo, como entidad matemática, ellas tienen un interés intrínseco y su importancia y aplicación se ha extendido más allá de lo originalmente imaginado. Las redes neuronales artificiales han resultado apropiadas para el análisis de datos generados en una amplia variedad de disciplinas. En este sentido, las redes no sólo han sido empleadas de forma innovativa e imaginativa para analizar grandes y complejas bases de datos, sino que también han sido utilizadas para resolver problemas tradicionalmente ligados al análisis estadístico. La aplicación de las redes neuronales artificiales a la predicción con series de tiempo no es nueva. Existen numerosos trabajos al respecto, siendo probablemente los más conocidos los de Werbos en los años 1974 y 1988, Lapedes el año 1987, Weigend y sus colegas el año 1990, entre otros.

Desde la estadística, Box y Jenkins el año 1976, desarrollaron la metodología de los modelos autorregresivos integrados de promedios móviles, para ajustar una clase de modelos lineales para series de tiempo. Posteriormente, a fines de los años 1990, surgieron versiones robustas de modelos autorregresivos integrados de promedios móviles y de series de tiempo no lineales tendientes a resolver los problemas que introducen la presencia de valores aberrantes o extremos en los datos. En un tiempo más reciente, las redes neuronales sido consideradas como una alternativa para modelar series de tiempo no lineales. Los modelos de redes neuronales se ajustan tradicionalmente por mínimos cuadrados y por lo tanto carecen de robustez en presencia de valores extremos o aberrantes. Como algunos de los procedimientos que tratan con redes neuronales surgen como una generalización natural de los modelos estadísticos lineales “autorregresivos integrados” y “autorregresivos integrados de promedios móviles”, por otra los relacionados con el caso no lineal “no autorregresivos integrados” y “no autorregresivos integrados de promedios móviles”, los procedimientos para ajustar redes neuronales robustas suelen estar relacionados con los procedimientos empleados para modelar series de tiempo robustas.

Una serie temporal o cronológica es una secuencia de datos, observaciones o valores, medidos en determinados momentos del tiempo, ordenados cronológicamente y, normalmente, espaciados entre sí de manera uniforme. El análisis de series temporales comprende métodos que ayudan a interpretar este tipo de datos, extrayendo información representativa, tanto referente a los orígenes o relaciones subyacentes como a la posibilidad de extrapolar y predecir su comportamiento futuro. De hecho uno de los usos más habituales de las series de datos temporales es su análisis para predicción y pronóstico. Por ejemplo de los datos climáticos, de las acciones de bolsa, o las series pluviométricas. Resulta difícil imaginar una rama de las ciencias en la que no aparezcan datos que puedan ser considerados como series temporales. Son estudiadas en estadística, procesamiento de señales, econometría y muchas otras áreas.

El análisis más clásico de las series temporales se basa en la suposición de que los valores que toma la variable de observación es la consecuencia de cuatro componentes, cuya actuación conjunta da como resultado los valores medidos, estos componentes son: (1) La tendencia secular o regular, indica la marcha general y persistente del fenómeno observado, es una componente de la serie que refleja la evolución a largo plazo. Por ejemplo, la tendencia creciente del índice de reciclado de basuras en los países desarrollados, o el uso creciente de Internet en la sociedad, independientemente de que en un mes concreto en un país, por determinadas causas, haya una bajada en el uso de Internet. (2) Variación estacional. Es el movimiento periódico de corto periodo, se trata de una componente causal debida a la influencia de ciertos fenómenos que se repiten de manera periódica en un año, las estaciones, una semana, los fines de semana, o un día, las horas punta, o cualquier otro periodo, recoge las oscilaciones que se producen en esos períodos de repetición. (3) Variación cíclica. Es el componente de la serie que recoge las oscilaciones periódicas de amplitud superior a un año. Movimientos normalmente irregulares alrededor de la tendencia, en las que a diferencia de las variaciones estacionales, tiene un período y amplitud variables, pudiendo clasificarse como cíclicos, cuasicíclicos o recurrentes. (4) Variación aleatoria, accidental, de carácter errático, también denominada residuo, no muestran ninguna regularidad, debidos a fenómenos de carácter ocasional como pueden ser tormentas, terremotos, inundaciones, huelgas, guerras, avances tecnológicos etc.

Las redes neuronales artificiales se reconocen como una de las herramientas matemáticas de uso computacional que mejores resultados está mostrando a la hora de modelar una amplia gama de problemas, esto debido a su gran versatilidad. Y aunque se tiene indicios que, la mayoría de las aplicaciones que se desarrollan con redes neuronales artificiales pueden ser implementadas con métodos estadísticos estándar, estos modelos han mostrado en varias ocasiones que pueden ser superiores a otras técnicas de análisis multivariado. Por ejemplo, han llegado a mejores resultados de predicción que otros métodos clásicos. Esto debido no solo a su capacidad para representar tanto funciones lineales, como funciones no-lineales complejas, habilidad que otros modelos no poseen, sino por su destreza para aprender, re-aprender y generalizar el conocimiento adquirido a nuevas observaciones, siendo un método que puede memorizar. En particular, las redes neuronales artificiales se muestran como una técnica alternativa para modelar series de tiempo, esto debido a que en muchos casos, la evolución de las series presenta características de no ergodicidad, persistencia y no estacionariedad, además de exhibir dependencia a largo plazo. Adicionalmente, estos muestran un fuerte comportamiento no gaussiano y con excesos de retornos no-cero, lo cual conlleva a que algunos de los modelos dinámicos de series de tiempo más populares sean inadecuados en este contexto, como son los modelos tipo “autorregresivo integrado de promedios móviles”. Ya que estos se basan en las condiciones de estacionariedad, dependencia a corto plazo y comportamiento gaussiano de la serie, lo cual va en contraposición con las propiedades estadísticas que estas series muestran, implicando un necesario tratamiento de datos o posibles resultados erróneos.

En los modelos de redes neuronales, las redes tipo “hacia adelante”, son las más empleadas en series de tiempo, dadas sus características de estabilidad y convergencia a la solución “optima”. Y entre estas, las más populares son las redes perceptrón multicapa, las cuales son conocidas por ser “aproximadores universales”. Por otro lado, las redes recurrentes tipo Jordan también han sido empleadas con muy buenos resultados, debido a que pueden responder según las decisiones tomadas en un pasado inmediato, siendo esto coherente con las propiedades de memoria y dependencia a largo plazo en estos objetos de estudio. Dadas las características de flexibilidad y versatilidad de las redes neuronales, surge la necesidad que estas técnicas de inteligencia artificial reflejen las propiedades que presentan estas series de tiempo. Y es precisamente en esta dirección, que se han desarrollado los modelos de redes neuronales dinámicas, las cuales se caracterizan porque están constantemente asimilando cada nuevo dato ya predicho como un nuevo caso de entrenamiento, esto con el propósito de predecir el siguiente dato.

Guillermo Choque Aspiazu
http://www.eldiario.net/
Enero 4 de 2010