viernes, 18 de julio de 2008

Genómica Funcional

La bioinformática es un campo interdisciplinario que se encuentra en la intersección entre las “ciencias de la vida” y de la “informática”, proporciona las herramientas y recursos necesarios para favorecer la investigación biológica. Este campo comprende la investigación y desarrollo de herramientas útiles para llegar a entender el flujo de información desde los genes a las estructuras moleculares, a su función bioquímica hasta su conducta biológica. Una definición generalmente aceptada es: “Bioinformática es un campo de la ciencia en el cual confluyen varias disciplinas tales como: biología, computación y tecnología de la información. El fin último de este campo es facilitar el descubrimiento de nuevas ideas biológicas así como crear perspectivas globales a partir de las cuales se puedan discernir principios unificadores en biología. Al comienzo de la “revolución genómica”, el concepto de bioinformática se refería sólo a la creación y mantenimiento de base de datos donde se almacena información biológica, tales como secuencias de nucleótidos y aminoácidos.

El progresivo desarrollo de métodos automatizados de preparación de muestras de ácido desoxirribonucléico, su secuenciación y posterior lectura ha permitido afrontar, a lo largo de la última década, diversos proyectos de secuenciación a gran escala. Algunos datos para entender la magnitud del proyecto son: (1) El genoma humano contiene unos 3000 millones de pares de bases. (2) Contiene unos 100000 genes. (3) Sólo un 10% del genoma codifica proteínas. (4) Se conoce la localización de unos 3000 genes. (5) Existen 24 pares de cromosomas; el menor tiene unos 50 millones de pares de bases, el mayor unos 250 millones. (6) Si se reunieran, los datos del genoma ocuparían 1000 libros de 200 páginas. (7) La diversidad genética humana: 5.000 millones de personas que se diferencian en un 0,1% de su material genético. Esto genera un catálogo de diferencias en secuencias teórico de 5000 billones de registros. Como se puede apreciar en algunos de estos datos, los últimos avances en la investigación en ciencias biomédicas están produciendo un enorme crecimiento en el volumen y la complejidad de la información biológica disponible. Las tecnologías de la información y las comunicaciones son cruciales para posibilitar el almacenamiento e interpretación de estos datos en los centros de investigación. La gran magnitud de la información a manejar se incrementa teniendo en cuenta que para llegar a reconocer dónde comienzan y terminan los genes e identificar sus exones, intrones y secuencias reguladoras se requieren comparaciones entre secuencias de diversas especies. El mapa de secuencias generado por el proyecto se utiliza como fuente primaria de información para la biología humana y la medicina.

La genómica funcional se ocupa de describir la función biológica de los genes mediante el conocimiento de su actividad en: (1) Los rasgos que determinan. (2) La regulación a la que se ven sometidos. (3) La interacción con otros genes. (4) La identificación de un patrón de comportamiento en un gen, dependiendo de las condiciones que le circundan. (5) La actividad que desarrolla el gen cuando está alterado en relación a su actividad normal. La genómica funcional, tradicionalmente, ha asociado rasgos o características visibles, conocidas como fenotipo, con el gen o los genes que los producían, los genotipos. Los avances en los procesos biotecnológicos han permitido determinar qué genes están implicados, la naturaleza de la interacción y el tiempo en la asociación gen-rasgo. Cada célula del organismo tiene el mismo material genético durante toda su vida. Sin embargo, la expresión del gen o su actividad varía de unas células a otras, de unos estadios de desarrollo a otros, en procesos normales o patológicos y en función de las condiciones ambientales. Sólo entendiendo los pormenores de la expresión génica se entienden los procesos biológicos moleculares en los que intervienen los genes. Como ayuda a este propósito, la técnica de los chips de ácido desoxirribonucleico permite el análisis de muchos genes, bajo diferentes condiciones experimentales, en un solo experimento. Además, un rasgo puede venir determinado por un gen o varios genes pueden determinar un solo rasgo. Si se altera esos genes, se reflejará en la característica que expresan.

La genómica funcional es un campo de la biología molecular que se propone utilizar la vasta acumulación de datos producidos por los proyectos de genómica, como los “proyectos genoma” de los distintos organismos, para describir las funciones e interacciones entre genes y proteínas. A diferencia de la genómica y la proteómica, la genómica funcional se centra en los aspectos dinámicos de los genes, como su transcripción, la traducción las interacciones proteína-proteína, en oposición a los aspectos estáticos de la información genómica como la secuencia del ácido desoxirribonucleico o su estructura.

En la genómica funcional se utiliza principalmente técnicas de alto rendimiento para describir la abundancia de productos génicos como el ácido ribonucleico mensajero y las proteínas. Algunas plataformas tecnológicas típicas son: (1) Microchips de ácido desoxirribonucleico. Un chip de ácido desoxirribonucleico es una superficie sólida a la cual se unen una serie de fragmentos de ácido desoxirribonucleico. Las superficies empleadas para fijar el ácido desoxirribonucleico son muy variables y pueden ser vidrio, plástico e incluso chips de silicio. Los arreglos de ácido desoxirribonucleico son utilizadas para averiguar la expresión de genes, monitorizándose los niveles de miles de ellos de forma simultanea. La tecnología del chip de ácido desoxirribonucleico es un desarrollo de una técnica muy usada en biología molecular, el “Southern blot”. Con esta tecnología es posible observar de forma casi instantánea la expresión de todos los genes del genoma de un organismo. De tal forma que suelen ser utilizados para identificar genes que producen ciertas enfermedades mediante la comparación de los niveles de expresión entre células sanas y células que están desarrollando ciertos tipos de enfermedades. (2) Análisis en serie de la expresión génica. Es una técnica de la biología molecular que permite conocer y cuantificar la expresión de los genes en la célula, mediante la medición del ácido ribonucleico mensajero que está presente en un momento determinado. Esto permite crear perfiles de expresión de cada célula en determinadas situaciones, ya sea en circunstancias normales de la célula o en momentos en que se ve afectada por alguna enfermedad. De esta manera se pueden comparar estos perfiles y determinar que genes están siendo apagados o activados, y así determinar cual puede ser la causa de esto. (3) Electroforesis bidimensional en gel. Es un grupo de técnicas empleadas por los científicos para separar moléculas basándose en propiedades como el tamaño, la forma o el punto isoeléctrico. La electroforesis en gel se utiliza generalmente con propósitos analíticos, pero puede ser una técnica preparativa para purificar moléculas parcialmente antes de aplicar una espectroscopia de masas, una clonación o una secuenciación de ácido desoxirribonucleico. (4) Espectrometría de masas. Es una técnica experimental que permite la medición de iones derivados de moléculas. El espectrómetro de masas es un instrumento que permite analizar con gran precisión la composición de diferentes elementos químicos e isótopos atómicos, separando los núcleos atómicos en función de su relación masa-carga. Puede utilizarse para identificar los diferentes elementos químicos que forman un compuesto, o para determinar el contenido isotópico de diferentes elementos en un mismo compuesto. Es una técnica hibrida que se encuentra con frecuencia como detector de un cromatógrafo de gases.

Dada la gran cantidad de datos producidos por estas técnicas y la pretensión de encontrar pautas biológicas significativas en ellos, la bioinformática es crucial para este tipo de análisis. Ejemplos de técnicas de este tipo son el agrupamiento de datos o el análisis de componentes principales para un aprendizaje automático sin supervisión, detección de clases, así como redes neuronales artificiales o máquinas de soporte vectorial para aprendizaje automático supervisado, predicción de clases, clasificación estadística.

De manera general, todas las técnicas que estudian el flujo de la información genética al nivel del ácido desoxirribonucleico, o sea, el genoma, conforman lo que se conoce actualmente bajo el nombre de genómica. La identificación de los elementos estructurales dentro de los genes, tales como los exones y los intrones, los elementos reguladores, etc. se denomina genómica estructural. La genómica funcional es entonces, el estudio del funcionamiento de estos elementos estructurales. El desarrollo de la genómica funcional ha sido posible, en gran medida, gracias al desarrollo de los microchips de ácido desoxirribonucleico y ácido ribonucleico.

Guillermo Choque Aspiazu
http://www.eldiario.net/
Julio 7 de 2008

sábado, 5 de julio de 2008

Computación Evolutiva

Desde los años 1930, algunos investigadores comenzaron a ver el proceso de evolución de las especies como un proceso de aprendizaje, mediante el cual la naturaleza dota a las especies de diferentes mecanismos, buscando hacerlas más aptas para sobrevivir. Partiendo de estos preceptos es posible desarrollar algoritmos que traten de resolver problemas de búsqueda y optimización guiados por el principio de la “supervivencia del más apto” que postulara Charles Darwin en su famosa y controversial “teoría de la evolución de las especies”. Dichos algoritmos son denominados algoritmos evolutivos y su estudio conforma la computación evolutiva. Bajo el término de computación evolutiva se engloba a un amplio conjunto de técnicas de resolución de problemas complejos basadas en la emulación de los procesos naturales de evolución. No es la primera vez que se hace uso de la emulación de procesos naturales para resolver problemas científicos y técnicos, los ejemplos más conocidos constituyen las redes neuronales para la resolución de problemas de aprendizaje artificial y el recocido simulado para resolver problemas de optimización que se plantean en las ciencias físicas.

El principal aporte de la computación evolutiva a la metodología de resolución de problemas consiste en el uso de mecanismos de selección de soluciones potenciales y de construcción de nuevos candidatos por recombinación de características de otros ya presentes, de modo parecido a como ocurre en la evolución de los organismos naturales. La computación evolutiva no trata tanto de reproducir ciertos fenómenos que suceden en la naturaleza como de aprovechar las ideas genéricas que hay detrás de ellos. Efectivamente, en el momento en que se tienen varios candidatos a solución para un problema surge inmediatamente la necesidad de establecer criterios de calidad y de selección, además de la idea de combinar características de buenas soluciones para obtener otras mejores. Dado que fue en el mundo natural donde primeramente se han planteado problemas de ese tipo, no tiene nada de extraño que al aplicar tales ideas en la resolución de problemas científicos y técnicos se obtengan procedimientos bastante parecidos a los ya encontrados por la naturaleza tras un largo periodo de adaptación.

La teoría evolutiva propuesta originalmente por Charles Darwin en combinación con el seleccionismo de August Weismann y la genética de Gregor Mendel, se conoce como el paradigma Neo-Darwiniano. El Neo-Darwinismo establece que la historia de la vasta mayoría de la vida en el planeta Tierra puede ser explicada a través de una serie de procesos estadísticos que actúan sobre y dentro de las poblaciones y especies: la reproducción, la mutación, la competencia y la selección. La reproducción es una propiedad obvia de todas las formas de vida del planeta Tierra, pues de no contar con un mecanismo de este tipo, la vida misma no tendría forma de producirse. En cualquier sistema que se reproduce a sí mismo continuamente y que está en constante equilibrio, la mutación está garantizada. El contar con una cantidad finita de espacio para albergar la vida en la Tierra garantiza la existencia de la competencia. La selección se vuelve la consecuencia natural del exceso de organismos que han llenado el espacio de recursos disponibles. La evolución es, por lo tanto, el resultado de estos procesos estocásticos fundamentales que interactúan entre sí en las poblaciones, generación tras generación.

El término “computación evolutiva” o “algoritmos evolutivos” engloba una serie de técnicas inspiradas en los principios de la teoría Neo-Darwiniana de la evolución natural. En términos generales, para simular el proceso evolutivo en una computadora se requiere: (1) Codificar las estructuras que se replicarán, o sea, una estructura de datos que se utilice para almacenar a un “individuo”. (2) Operaciones que afecten a los “individuos”, típicamente se utiliza apareamiento y mutación. (3) Una función de adaptabilidad que indique qué tan buena es una solución con respecto a las demás. (4) Un mecanismo de selección que implemente el principio de “supervivencia del más apto” de la teoría de Darwin.

El enfoque sub-simbólico de la inteligencia artificial se caracteriza por crear sistemas con capacidades de aprendizaje. Éste se puede obtener a nivel de individuo imitando el cerebro, a través de redes neuronales; o a nivel de especie imitando la evolución, lo que se ha denominado “computación evolutiva”, término relativamente nuevo que intenta agrupar un conjunto de paradigmas muy relacionados cuyas competencias no están aún muy definidas. Hasta hace poco era común hablar de algoritmos genéticos en general, en lugar de identificar diferentes tipos de computación evolutiva, ya que el resto de los algoritmos se pueden interpretar como variaciones o mejoras de los algoritmos genéticos más conocidos. En un algoritmo genético los elementos de las cadenas, los denominados genes, son típicamente bits, y en ciertos casos, valores numéricos o cadenas alfanuméricas. En la programación genética, los genes son instrucciones en un lenguaje de programación, y en las estrategias evolutivas, valores reales. Las estrategias evolutivas surgieron inicialmente para resolver problemas de optimización paramétrica; con el paso del tiempo fueron incorporando procedimientos propios de la computación evolutiva, con lo que han llegado a convertirse en una disciplina más. La agregación simulada se puede considerar como una simplificación de los algoritmos genéticos cuyo se encuentra en los procedimientos físicos de solidificación controlada. Los clasificadores genéticos solucionan problemas de reconocimiento de patrones mediante un entrenamiento basado en ejemplos, almacenando en las cadenas información que relacione los datos de entrada y la salida deseada.

Aunque hoy en día es cada vez más difícil distinguir las diferencias entre los distintos tipos de algoritmos evolutivos existentes, por razones sobre todo históricas, suele hablarse de tres paradigmas principales: (1) Programación Evolutiva. (2) Estrategias Evolutivas. (3) Algoritmos Genéticos. Cada uno de estos paradigmas se originó de manera independiente y con motivaciones muy distintas. La programación evolutiva nació en la década de 1960 y su creador fue Lawrence J. Fogel. El desarrollo de esta área comenzó como un esfuerzo encaminado a crear inteligencia artificial basada en la evolución de máquinas de estado finitas. Por su parte, las estrategias evolutivas fueron propuestas por Ingo Rechenberg y Hans-Paul Schwefel en la década de 1970. Su principal objetivo era la optimización de parámetros. A su vez los algoritmos genéticos fueron propuestos por John H. Holland en 1975 y su motivación inicial fue la de proponer un modelo general de proceso adaptable. En la naturaleza todos los seres vivos se enfrentan a problemas que deben resolver con éxito, como conseguir más luz del sol, o cazar una mosca. La computación evolutiva interpreta la naturaleza como una inmensa máquina de resolver problemas y trata de encontrar el origen de dicha potencialidad para utilizarla en los programas computacionales. Los algoritmos genéticos constituyen una de las más conocidas y originales técnicas de resolución de problemas dentro de lo que se ha definido como “computación evolutiva” o “algoritmos evolutivos”, término que agrupa a los algoritmos genéticos, las estrategias evolutivas y la programación evolutiva.

Es importante mencionar que la computación evolutiva, como disciplina de estudio, ha atraído la atención de un número cada vez mayor de investigadores de todo el mundo. Esta popularidad se debe, en gran medida, al enorme éxito que han tenido los algoritmos evolutivos en la solución de problemas del mundo real de gran complejidad. De tal forma, es de esperarse que en los años siguientes el uso de este tipo de técnicas prolifere aún más. Nótese, sin embargo, que es importante tener en mente que los algoritmos evolutivos son técnicas heurísticas. Por tanto, no garantizan que convergerán al óptimo de un problema dado, aunque en la práctica suelen aproximar razonablemente bien el óptimo de un problema en un tiempo promedio considerablemente menor que los algoritmos deterministas. Esta distinción es importante, pues el papel de las técnicas heurísticas es el de servir normalmente como último recurso para resolver un problema en el que los algoritmos convencionales no funcionan o tienen un costo computacional prohibitivo. Esto implica que antes de decidir recurrir a los algoritmos evolutivos, debe analizarse la factibilidad de utilizar otro tipo de técnicas. Este paso, que pudiese parecer obvio para muchos, en la práctica suele omitirse en muchos casos y de ahí que exista bastante escepticismo por parte de aquellos que acostumbran a trabajar únicamente con algoritmos deterministas. El uso apropiado y pertinente de los algoritmos evolutivos será sin duda la base de su futuro como alternativa para la solución de problemas complejos y de ahí que se enfatice su importancia.

Guillermo Choque Aspiazu
http://www.eldiario.net/
Junio 30 de 2008

Neurona Lineal Adaptativa

Existe un acuerdo casi generalizado en la comunidad de investigadores en inteligencia artificial por considerar las redes neuronales artificiales como sistemas de computación que constan de un gran número de elementos simples de cálculo o proceso, altamente interconectados, y habitualmente jerarquizados en capas o niveles, que procesan información respondiendo de manera dinámica a los estímulos externos. Los orígenes de las redes neuronales suelen relacionarse con el trabajo de McCulloch y Pitts, realizado el año 1943, en el que proponían una teoría general del procesamiento de la información basada en redes de elementos binarios, capaces de realizar cálculos similares a las computadoras digitales, pero con una ejecución paralela, y no serial, en la que los pesos o ponderaciones sinápticas hacían el papel que el programa juega en una computadora convencional.

Bernard Widrow y su estudiante Marcian Hoff, a fines de los años 1950, introdujeron el modelo denominado “neurona lineal adaptativa” y su regla de aprendizaje llamada “error medio cuadrático” o algoritmo LMS. La neurona lineal adaptativa es similar al perceptrón, excepto en su función de transferencia, la cual es una función de tipo lineal en lugar de un limitador fuerte como sucede en el caso del perceptrón. La neurona lineal adaptativa presenta la misma limitación del perceptrón en cuanto al tipo de problemas que puede resolver, ambas redes solamente pueden resolver problemas linealmente separables, sin embargo el algoritmo LMS es más potente que la regla de aprendizaje del perceptrón ya que minimiza el error medio cuadrático.

El término Adaline es una sigla que identifica a la neurona lineal adaptativa, sin embargo su significado cambió ligeramente a finales de los años 1960 cuando decayó el estudio de las redes neuronales, para denominarse “elemento lineal adaptativo”, este cambio se debió a que Adaline es un dispositivo que consta de un único elemento de procesamiento, como tal no es técnicamente una red neuronal. El elemento de procesamiento realiza la suma de los productos de los vectores de entrada y de pesos, y aplica una función de salida para obtener un único valor de salida, el cual debido a su función de transferencia lineal será +1 si la sumatoria es positiva o –1 si la salida de la sumatoria es negativa. En este caso, la salida es la función unidad al igual que la función de activación; el uso de la función identidad como función de salida y como función de activación significa que la salida es igual a la activación, que es la misma entrada neta al elemento. Adaline es “adaptativo” en el sentido de que existe un procedimiento bien definido para modificar los pesos con objeto de hacer posible que el dispositivo proporcione el valor de salida correcto para la entrada dada; el significado de correcto para efectos del valor de salida depende de la función de tratamiento de señales ejecutada por el dispositivo. Adaline es “lineal” porque la salida es una función lineal sencilla de los valores de la entrada.

El año 1986, los investigadores Rumelhart, Hinton y McClelland, consideraban que todo modelo neuronal o modelo de proceso distribuido en paralelo, podía ser caracterizado a través de la especificación de los siguientes ocho aspectos o características básicas: (1) Un conjunto de unidades de procesamiento, las que se encargan de procesar la información y que suelen disponerse en capas o niveles estructurados de manera jerárquica; el procesamiento se lleva a cabo en estas neuronas, sin hacer distinción entre ejecutoras y supervisoras. (2) Un estado de activación, que en cada instante representa el nivel de activación de cada neurona a través de un valor de activación real. (3) Unas salidas de las unidades que en cada instante determinan la señal que cada neurona envía a sus vecinas. La intensidad de estas salidas, y por tanto el grado, que afecta cada neurona a las vecinas con las que esté conectada, vendrá determinada por el nivel de activación de cada neurona en cada instante a través de una función de salida o de transferencia. (4) Un patrón de conexión que establece qué neuronas se conectan con qué otras; este patrón acaba por establecer la topología de la propia red, su eventual jerarquización por capas y la intensidad, además del sentido de las distintas interconexiones. (5) Una regla de propagación, que combina las salidas de cada neurona con las correspondientes ponderaciones establecidas por el patrón de conexión, especificando de esta forma cómo se evaluaran las entradas que reciba cada neurona. (6) La regla o función de activación, es una función que a partir del estado actual de activación de una neurona y de su entrada neta, determinada por el patrón de conexión y por la regla de propagación, evalúa el estado de activación subsiguiente. (7) Una regla de aprendizaje, que consiste en el procedimiento por el cual se procede a la modificación del patrón de conexión en función de la experiencia, conduciendo en última instancia, al establecimiento de nuevos modelos de respuesta del sistema a los estímulos externos. (8) Una representación del ambiente, que viene dada, dependiendo de la aplicación que vaya a resolver el modelo de red neuronal, por la información empírica disponible o por una función estocástica que varía temporalmente sobre el espacio de patrones de entrada.

Tomando en cuenta estas ocho componentes básicas de toda red neuronal, los distintos modelos de red neuronal pueden clasificarse de acuerdo con cuatro criterios básicos: (1) la naturaleza de las señales de entrada y salida, (2) la topología de la red, (3) el mecanismo de aprendizaje que utilizan y (4) el tipo de asociación de las señales de entrada y salida, además de la forma de representar estas señales. Las distintas posibilidades de presentarse estos aspectos junto con las distintas funciones de activación y transferencia permiten la clasificación de los distintos modelos. De acuerdo con la naturaleza de las señales de entrada y de salida se puede clasificar las redes neuronales en: (1) Redes analógicas, que procesan datos de entrada de naturaleza analógica, valores reales continuos, habitualmente acotados y usualmente en el intervalo [-1,1]. Las redes analógicas suelen presentar funciones de activación continuas, habitualmente lineales o sigmoides. Entre estas redes neuronales destacan las redes de Retropropagación, la red continua de Hopfield, la de Contrapropagación, la Memoria Lineal Asociativa y los modelos de Mapas Auto-Organizados de Kohonen. (2) Redes discretas binarias, que procesan datos de naturaleza discreta para acabar emitiendo una respuesta discreta. Entre las redes binarias destacan la Maquina de Boltzman, la Máquina de Cauchy, la red discreta de Hopfield el Cognitrón y el Neogognitrón. (3) Redes híbridas, que procesan entradas analógicas para dar respuestas binarias, entre ellas destacan el Perceptrón, la red Adaline y la Madaline.

La red Adaline ha sido ampliamente utilizada en el procesamiento de señales; para valorar el real aporte de esta red en ese campo, se presentan las herramientas empleadas en los procesos de filtrado. A comienzos del estudio de las comunicaciones electrónicas, se diseñaban filtros analógicos empleando circuitos de resistencias, inductores y condensadores para eliminar el ruido en las señales empleadas en las comunicaciones; este procesamiento se ha transformado en una técnica de múltiples facetas, destacándose el uso de “procesadores digitales de señales”, que pueden llevar a cabo los mismos tipos de aplicaciones de filtrado ejecutando filtros de convolución, los cuales se construyen mediante programación convencional, en cualquier lenguaje de programación conocido.
El proceso de filtrado sigue ocupando un lugar muy importante en la industria, pues siempre será necesario eliminar el ruido en señales portadoras de información. Considere una transmisión de radio en amplitud modulada, las técnicas electrónicas de comunicación, bien sean para señales de audio o de datos constan de una codificación y una modulación de la señal. La información que hay que transmitir, se puede codificar en forma de una señal analógica que reproduce las frecuencias y las amplitudes del sonido original. Dado que los sonidos que se están codificando representan un valor continuo que va desde el silencio, pasando por la voz, hasta la música, la frecuencia instantánea de la señal normalmente varia con el tiempo, oscilando entre 0 y 10.000 Hz aproximadamente. En lugar de intentar transmitir directamente esta señal codificada, se transmite de la forma más adecuada para la transmisión por radio; esto se logra modulando la amplitud de una señal portadora de alta frecuencia con la señal de información analógica. Para la amplitud modulada, la frecuencia portadora estará en el intervalo de los 550 a los 1650 kHz, dado que esta frecuencia es muy superior a la frecuencia máxima de la señal de información, se pierde muy poca información como consecuencia de la modulación; la señal modulada puede ser transmitida después a una estación receptora, en la cual la señal se demodula y se reproduce en forma de sonido.

Guillermo Choque Aspiazu
www.eldiario.net
Junio 23 de 2008

Razonamiento con Incertidumbre

Crear conclusiones útiles a partir de información incompleta o incierta no es una tarea imposible, los seres humanos realizan este proceso en casi todos los aspectos cotidianos. Los médicos realizan diagnósticos correctos y recomiendan tratamiento a partir de síntomas ambiguos, los informáticos analizan los problemas del manejo de información a partir de observaciones, y la mayor parte de los seres humanos comprenden el lenguaje hablado, el corporal o el lenguaje escrito a pesar de contar con frases incompletas, y también es posible reconocer a otras personas a través de sus voces o gestos. De este modo para realizar el proceso de toma de decisiones se utiliza la lógica; con la lógica algunas piezas de conocimiento son utilizadas en el razonamiento y pueden ser parte de las explicaciones o conclusiones.

Por su parte, en términos netamente académicos, el ser humano está familiarizado con investigaciones empíricas, tales como exploraciones científicas e investigaciones criminales, en las cuales los científicos deben examinar eventos físicos y objetos para resolver problemas o ganar conocimiento acerca de algún fenómeno. Por ejemplo, en muchos casos criminales, los científicos forenses examinan rastros de sangre para descubrir la identificación única del ácido desoxirribonucléico de la muestra. Este tipo de investigaciones requieren de gran precisión, particularmente porque las muestras son frecuentemente muy pequeñas, y particularmente por pequeñas desviaciones en la precisión de la medición de elementos microscópicos pueden resultar en una mala identificación. De este modo, los científicos que trabajan en estas áreas en particular, tienen que ser consistentes en mantener un alto grado de precisión.

Otro fenómeno que impone límites por encima del evidente deseo de precisión es que se utiliza el lenguaje natural para describir y comunicar información y conocimiento. Se ha tenido la experiencia de malinterpretar un resultado por haber utilizado palabras en una forma diferente al patrón de una determinada conversación. El entendimiento del significado de una palabra trae consigo la cultura y las asociaciones personales, así que aunque se tenga una parte de la esencia del significado y además sea posible comunicarlo con un grado aceptable, la mayoría de las veces no se puede estar de acuerdo en el simple significado de una palabra. En pocas palabras, el lenguaje natural tiene la característica distintiva de incertidumbre. La incertidumbre puede también ser el resultado de varios usuarios del lenguaje natural, los cuales aceptan ligeramente significados diferentes de un término. Por ejemplo una persona acostumbrada a vivir en La Paz puede tener un significado para el término “calor” que es diferente del significado aceptado por un residente de la región amazónica de Pando.

El término incertidumbre significa razonamiento aproximado o inexacto de la información. De manera general, sólo se conoce con certeza una pequeña parte de un determinado dominio del mundo, la información restante puede ser incierta por diversas causas, tales como: imprecisión, incapacidad para tomar medidas adecuadas, falta de conocimiento, vaguedad, etc. Existe un cambio dramático en los paradigmas de la incertidumbre durante los últimos años: hasta la década de los sesenta, la incertidumbre se relacionó con significados negativos. Ningún científico quería tomar decisiones vagas, pues temía que su trabajo no fuera tomado con la debida seriedad, por lo que la incertidumbre fue considerada como algún disturbio que debería ser evitado en modelos, teorías y enunciados. La única teoría que trataba con incertidumbre fue la teoría de probabilidad y estaba restringida a situaciones en las cuales la incertidumbre podría ser atribuida a aspectos relacionados con la aleatoriedad o el azar. A partir de la década de los años 1960 esto cambió, se aceptó el hecho de que la incertidumbre es una parte de la realidad, la cual no se puede cambiar. Por lo tanto fue necesario incluirla en los modelos de desarrollo. Esto ha conducido a un incremento en el número de teorías de incertidumbre durante las últimas décadas y a numerosos intentos por modificar los métodos formales existentes de modo que se acerquen más a la realidad y al comportamiento humano.
Sin embargo, al enfrentarse a problemas tales como los de diagnóstico, era inevitable tener que tratar la incertidumbre, y en aquellos años la única técnica disponible, aún con todas sus limitaciones, era el método probabilista clásico, a veces llamado Bayes ingenuo, con el que se construyeron los primeros sistemas de diagnostico, los cuales obtuvieron un éxito razonable en problemas que hoy parecen pequeños en tamaño, pero que en aquella época eran imposibles de abordar de ninguna otra forma. No obstante, el método probabilista clásico presentaba dos inconvenientes principales: el primero de ellos era la dificultad de obtener las probabilidades condicionales necesarias para construir el modelo. La aplicación del teorema de Bayes “en bruto” requería un número exponencial de parámetros, por lo que se hacía necesario introducir hipótesis simplificadoras, que eran básicamente dos: la exclusividad de los diagnósticos y la independencia condicional de los hallazgos. Aún así, el número de parámetros seguía siendo relativamente elevado, sobre todo teniendo en cuenta que raramente había bases de datos a partir de las cuales se pudieran obtener las probabilidades objetivas, por lo que en la mayor parte de los casos se hacía necesario recurrir a estimaciones subjetivas, poco fiables. Además las hipótesis eran poco verosímiles, sobre todo la de independencia condicional, sobre la que se escribieron páginas y páginas en los año 1970. Por estos motivos, la mayor parte de los investigadores estaban de acuerdo en que la probabilidad no era un método adecuado para la inteligencia artificial.

En paralelo con esta evolución histórica de crisis y resurgimiento de la probabilidad, se desarrolló la teoría de los conjuntos difusos, frecuentemente llamada lógica difusa. La motivación inicial no fue el estudio de la incertidumbre, sino el estudio de la vaguedad, que es algo diferente. Por ejemplo, si se sabe que Andrés mide 1.78 m., no se puede decir rotundamente que es alto, pero tampoco se puede decir que no lo es: se trata de una cuestión de grado; en este caso hay vaguedad intrínseca, pero no hay incertidumbre, con lo que se demuestra que son dos conceptos en principio independientes, aunque existe una cierta relación en el sentido de que si se recibe una información imprecisa, por ejemplo, si se dice que Juan es alto, pero no se dice su estatura exacta, se tiene un cierto grado de incertidumbre. En realidad, la necesidad de tratar la vaguedad surge de una antigua paradoja, que se podría expresar de la siguiente manera: una persona que sólo tiene 10 centavos de boliviano es sumamente pobre en términos cuantitativos, ahora bien, si a esa persona que es sumamente pobre se le da otros 10 centavos de boliviano, sigue siendo sumamente pobre; aplicando esta regla repetidamente se llega a la conclusión de que una persona que tiene 1 millón de bolivianos es sumamente pobre. La solución a esta paradoja es que el concepto de “pobre” o “sumamente pobre” no tiene un límite completamente definido, sino que a medida que se le da 10 centavos tras otro, hasta llegar al millón de bolivianos, en el supuesto de que se tuviera esa cantidad de dinero, el grado de pobreza va disminuyendo paulatinamente: no hay un único centavo que haga pasar a la persona de ser pobre a ser rico.

Por eso, la brillante idea de Lofti Zadeh, considerado como el “padre” de la lógica difusa, no solo por haber tenido la idea original, sino también por la gran cantidad de líneas que ha abierto en el campo desde entonces, consiste en permitir que el grado de pertenencia a algunos conjuntos sea un número entre 0 y 1, de modo que, por ejemplo, para quien no tiene más que 2 bolivianos, su grado de pertenencia al conjunto de personas pobres es casi 1, mientras que para quien tiene 100 millones de bolivianos es casi 0; en cambio, para una persona que tiene 500.000 bolivianos ahorrados el grado de pertenencia podría ser 0.4 o 0.5. Lamentablemente, el punto más débil de la lógica difusa es la carencia de una definición operativa que permita determinar objetivamente el grado de pertenencia, con lo que toda la teoría queda un tanto coja desde su nacimiento; esto no ha impedido el extraordinario desarrollo de la lógica difusa, con miles de artículos, libros, revistas y congresos dedicados al tema.

Para muchos casos prácticos, las soluciones de los problemas se conducen en presencia de incertidumbre en los datos o el conocimiento Para este tipo de problemas es posible utilizar técnicas numéricas, o también, la incertidumbre puede ser manejada con una aproximación lógica en forma de rastro. El razonamiento en la presencia de incertidumbre sucede en ejemplos típicos de diagnostico y análisis de datos. Los sistemas expertos, cuya función consiste en el diagnóstico en sus juicios de razonamiento emplean reglas de condición-conclusión que van acompañadas de una estimación de certidumbre, en donde se tiene un procedimiento numérico y la necesaria revisión de la credibilidad.

Guillermo Choque Aspiazu
www.eldiario.net
Junio 16 de 2008

Agentes de Software

A mediados de estos años que transcurren del siglo XXI, es cada vez mayor la necesidad de programas o aplicaciones computacionales flexibles, que sean capaces de anticiparse a las necesidades de los usuarios de sistemas informáticos y de adaptarse a ellas. Los agentes aparentan constituir una solución adecuada a esa necesidad. Un agente de software es una entidad autónoma que puede interaccionar con su entorno; James Hendler considera que los agentes de software no difieren mucho de los agentes humanos mencionando: “los agentes podrían encontrar posibles maneras de cumplir las necesidades de los usuarios y ofrecer al usuario elecciones para su realización. Del mismo modo que un agente de viajes podría darle una lista de varios vuelos que podría tomar, o una elección entre volar o tomar un tren, un agente podría ofrecer una lista de posibles maneras de obtener lo que necesita.

Los agentes proceden de los campos de la inteligencia artificial y de la ingeniería del software, en particular de la orientación a objetos. Desde un punto de vista conceptual los agentes tienen su origen en el modelo de actores concurrentes que propusieron Carl Hewitt, Peter Bishop y Richard Steiger el año 1973. Los actores, directos predecesores de los agentes, fueron definidos por Hewitt el año 1977 como “objetos autocontenidos, interactivos y que se ejecutan concurrentemente, que poseen estado interno y capacidad de comunicarse” y como “agentes computacionales que tienen una dirección de correo y un comportamiento”. Los actores se comunican mediante un intercambio de mensajes y llevan a cabo sus acciones de manera concurrente, es decir, sus acciones pueden ejecutarse en paralelo, sin secuencias fijadas de antemano. La principal diferencia entre los actores y los agentes es que estos últimos suelen tener restricciones relacionadas con metas o propósitos.

Existe una fuerte relación entre los agentes y la inteligencia artificial: los agentes provienen del campo de la inteligencia artificial distribuida, que estudia métodos y técnicas para la resolución de problemas mediante la colaboración de diversas entidades distribuidas, autónomas e inteligentes. En la inteligencia artificial distribuida se entremezclan dos disciplinas: la inteligencia artificial y los sistemas distribuidos. Un sistema distribuido es, según George Coulouris: “un sistema en el que los componentes de hardware o software localizados en computadoras en red se comunican y coordinan sus acciones intercambiando mensajes”. En la inteligencia artificial distribuida, la colaboración de unas entidades con otras produce comportamientos colectivos que resuelven problemas que serían irresolubles si se abordaran individualmente o que proporcionan soluciones eficaces en cuanto a tiempo, velocidad o calidad. Un ejemplo de inteligencia “natural” distribuida es proporcionado por una colonia de termitas: la colaboración entre ninfas, obreras, soldados y la reina permite la supervivencia de la colonia. Las termitas por separado no podrían sobrevivir, los soldados no pueden alimentarse por sí solos, la reina apenas puede moverse y las obreras no pueden defenderse; pero su cooperación les ha permitido existir desde hace millones de años en este planeta.

La inteligencia artificial distribuida consta de tres grandes ramas de investigación: (1) Sistemas multiagente. Que estudian, en primer lugar, sistemas en los cuales un conjunto de agentes cooperan, coordinan y se comunican para conseguir un objetivo común; en segundo lugar estudian la solución distribuida de problemas, donde se intenta conseguir la solución de problemas mediante procesamientos descentralizados y, en tercer lugar la inteligencia artificial en paralelo, donde se desarrolla métodos y algoritmos paralelos de inteligencia artificial. Al interior de la inteligencia artificial distribuida los agentes tiene sus orígenes en los sistemas multiagente, estos últimos son grupos de agentes autónomos, generalmente heterogéneos e independientes, que colaboran entre sí para conseguir ciertos objetivos; esta colaboración implica que cooperen, se coordinen y negocien unos con otros. En un sistema multiagente no hay un control global del sistema ni existe un lugar donde se encuentre toda la información. Por consiguiente, un agente de software es una parte del software que actúa para un usuario u otro programa como agente. El agente tiene la autoridad de decidir cuándo una acción es apropiada. La idea es que los agentes no son estrictamente invocados para una tarea, sino que se activan por cuenta propia.

El término “agente” describe una abstracción de software, una idea o concepto, similar a los métodos, funciones y objetos en la programación orientada a objetos. El concepto de agente proporciona una forma conveniente y poderosa de describir una compleja entidad de software, que es capaz de actuar con cierto grado de autonomía, para cumplir tareas en representación de de personas. Pero a diferencia de los objetos, los cuales son definidos por métodos y atributos, un agente es definido a través de su comportamiento. Un agente de software es un programa informático que habita en computadoras y redes informáticas, se encarga de ayudar a los usuarios en tareas relacionadas con el uso de la computadora como tal. El agente de software se diferencia del software normal en que está personalizado y adaptado al cliente, tiene iniciativa, una vida larga y capacidad de adaptación autónoma. Otra definición de agente que goza de especial prestigio sobre todo entre la escuela finlandesa, afirma que un agente es una entidad informática autorizada para actuar a nombre de una persona.

Varios autores han propuesto diferentes definiciones de agentes, en su mayoría estas definiciones incluyen generalmente los siguientes conceptos: (1) Persistencia. Se produce cuando el código no es ejecutado bajo demanda sino que se ejecuta continuamente y decide por sí mismo cuándo debería llevar a cabo alguna actividad. (2) Autonomía. Se produce cuando los agentes tienen la capacidad de seleccionar tareas, priorizarlas, tomar decisiones sin intervención humana, etc. (3) Capacidad o habilidad social. Se produce cuando los agentes son capaces de tomar otros componentes, a través coordinación y comunicación, capaces de colaborar en una determinada tarea. (4) Reactividad. Se produce cuando los agentes perciben el contexto en el cual operan y reaccionan a éste de manera apropiada.

Una interrogante interesante es saber ¿Cómo trabajan estos pequeños programas de software para volverse inteligentes?. La respuesta lógica es que están programados para aprender; los primeros agentes se basaban en la programación del usuario, eran prototipos lentos, poco inteligentes y limitados, útiles únicamente para el autor del invento. A continuación vinieron los “basados en conocimiento” que incluían en su programación una base de conocimiento; pese a todo seguían careciendo de efectividad y sobre todo de flexibilidad. Esto provocó un cambio en el enfoque, dando como resultado la programación de agentes con capacidad de aprendizaje, proporcionando cuatro formas básicas de aprender. La primera consiste en espiar al usuario, cuando éste está realizando tareas en la computadora, el agente “mira por encima del hombro” para estudiar hábitos, gustos, páginas preferidas, etc. La segunda forma básica consiste en recibir realimentación positiva o negativa por parte del usuario. La tercera es que responden a instrucciones explícitas dadas por el usuario, y finalmente, aprenden de otros agentes de software con los que intercambian información.
En la actualidad se pueden encontrar muchos tipos de agentes, con tantas clasificaciones como criterios se utilicen. Una de las más útiles se basa en el criterio de la función que desempeña el agente. Aún así la variedad de agentes es bastante grande, sin embargo es posible definir los siguientes tipos: En primer lugar se encuentran los agentes incansables, cuya misión consiste básicamente en ejercer las funciones de un buen secretario, esto incluye entre otras cosas la gestión de agenda y de citas. Otro tipo importante es el de los agentes guía, los cuales constituyen una categoría de agentes de software creados para facilitar la navegación en Internet, su misión habitual consiste en localizar páginas Web cuyo contenido coincide con una serie de palabras clave que se le asignan, esto es lo que se conoce como búsqueda por tópicos, solamente señala las páginas, pero no bucea en su interior. Los desmemoriados también tienen un agente que les echa una mano, se trata de los agentes recordatorio. Este tipo particular de agente se encarga de recordar fechas y citas, su utilidad no acaba ahí, algunos agentes recordatorio van más allá. Si el usuario está redactando un documento sobre un determinado tema, el agente le recuerda si tiene ya redactados o en su poder documentación sobre ese tema, así como su localización.

Guillermo Choque Aspiazu
http://www.eldiario.net/
Junio 9 de 2008

Programación Lógica

Se puede tomar al gran filósofo Aristóteles (384-322 a.C.) con su teoría silogística como el gran precursor de la lógica matemática y en consecuencia de la programación lógica. La teoría silogística, que estudia una clase particular de implicaciones con dos premisas y una conclusión, también fue tratada por filósofos contemporáneos de Aristóteles y fue largamente estudiada en siglos posteriores, aunque no se produjeron innovaciones de interés hasta el siglo XVII con los trabajos realizados por Descartes y Leibnitz. Dos siglos después George Boole dio un paso importante en el sistema de razonamiento aristotélico poniendo en relación la lógica y el algebra. Los trabajos de Boole fueron modificados y ampliados mas tarde por lógicos y matemáticos como Jevon, Pierce, Schroeder y Huntington entre otros. Se llega así a finales del siglo XIX y principios del XX con la revolución en el fundamento de las matemáticas gracias a los trabajos de Frege, Cantor, Peano, Russell y Whitehead entre otros que marcan el periodo más apasionante y de mayor actividad en la historia de la lógica matemática.

En el primer tercio del siglo XX y tras la publicación de los “Principia Matemática” por parte de Russell y Whitehead continuo la actividad frenética de innovación de la mano de investigadores de la talla de Post, Hilbert, Ackerman, Broker, Godel y por supuesto Skolem y Herbrand. Llegada la mitad del siglo XX, de manera paralela al desarrollo de la lógica, se produce un espectacular avance de las llamadas “maquinas de calcular”, avance sobre el que reflexiona Alan Turing en un artículo titulado: “¿Pueden pensar las máquinas?”, publicada en 1950 y que constituye el punto de partida del área que revoluciona los sistemas inteligentes, conocida como inteligencia artificial. En los años siguientes a la publicación del artículo de Turing, avanzó bastante la demostración automática con trabajos como los de Gilmore, Davis, Putnam y Prawitz, tomando siempre como referencia los trabajos de Skolem y Herbrand relacionados con la lógica de primer orden.

Un hito importante en la historia de la demostración automática la marco Robinson en 1965 con la presentación de su método de resolución, punto de partida para los trabajos de otros investigadores como Chang, Lee, Loveland y Wos. No obstante no es hasta la primera mitad de los años 1970, con los trabajos de Kowalsky y el primer lenguaje de programación Prolog de Colmerauer, cuando nace la programación lógica como rama de la demostración automática con personalidad propia. En palabras de Kowalski y Hogger se mencionaba en ese entonces: “La programación lógica puede ser brevemente definida como el uso de la lógica simbólica para la representación de problemas y sus bases de conocimiento asociadas, junto con el control de la inferencia lógica para la solución efectiva de esos problemas”

La programación lógica, junto con la funcional, forma parte de lo que se conoce como programación declarativa. En los lenguajes tradicionales, la programación consiste en indicar cómo resolver un problema mediante sentencias agrupadas en un algoritmo; en la programación lógica, se trabaja de una forma descriptiva, estableciendo relaciones entre entidades, indicando no cómo, sino qué hacer. La ecuación de Robert Kowalski de la Universidad de Edimburgo, establece la idea esencial de la programación lógica: “programa=lógica+control”. Es decir, un programa se construye especificando conocimiento en un lenguaje formal, tal como la lógica de primer orden, y el problema se resuelve mediante un mecanismo de inferencia o control que actúa sobre dicho programa.

La programación lógica consiste en la aplicación del corpus de conocimiento sobre lógica para el diseño de lenguajes de programación. Se ha convertido en el pilar de una nueva generación de lenguajes de programación. Junto con la programación funcional forma parte de lo que se conoce como programación declarativa. La programación declarativa gira en torno al concepto de predicado, o relación entre elementos. La programación funcional se basa en el concepto de función, que no es más que una evolución de los predicados, de corte más matemático. En los lenguajes tradicionales se intenta resolver un problema mediante sentencias, en la programación lógica se trabaja de forma descriptiva, estableciendo relaciones, y no indicando un cómo sino un qué hacer. Es decir el programa que se quiera diseñar se construye especificando un conocimiento en un lenguaje formal y para resolverlo se utiliza la inferencia o control que actúa sobre el mismo.

Históricamente, las computadoras se han programado utilizando lenguajes muy cercanos a las peculiaridades de la propia máquina: operaciones aritméticas simples, instrucciones de acceso a memoria, etc. Un programa escrito de esta manera puede ocultar totalmente su propósito a la comprensión de un ser humano, incluso uno entrenado. Actualmente, estos lenguajes pertenecientes al paradigma de la programación imperativa han evolucionado de manera que ya no son tan críticos. En cambio, la lógica matemática es la manera más sencilla, para el intelecto humano, de expresar formalmente problemas complejos y de resolverlos mediante la aplicación de reglas, hipótesis y teoremas. De ahí que el concepto de “programación lógica” resulte atractivo en diversos campos donde la programación tradicional es un fracaso.

La mayoría de los lenguajes de programación lógica se basan en la teoría lógica de primer orden, aunque también incorporan algunos comportamientos de orden superior. En este sentido, destacan los lenguajes funcionales, ya que se basan en el cálculo lambda, que es la única teoría lógica de orden superior que es demostradamente computable, por lo menos hasta el momento. El lenguaje de programación lógica por excelencia es el “PROLOG”, que cuenta con diversas variantes. La más importante es la programación lógica con restricciones, que posibilita la resolución de ecuaciones lineales además de la demostración de hipótesis.

La programación lógica permite formalizar hechos del mundo real, por ejemplo: (1) las aves vuelan; (2) los pingüinos no vuelan; (3) “calita” es un ave; (4) “aceituno” es un perro; (5) “alegría” es un ave. Además formaliza reglas o restricciones: (1) una mascota vuela si es un ave y no es un pingüino. Ante dicha regla o “programa” es posible establecer hipótesis que no son más que preguntas o incógnitas, por ejemplo: (1) ¿”aceituno” vuela?; (2) ¿qué mascotas vuelan?. Gracias a que la lógica de primer orden es computable, la computadora será capaz de verificar la hipótesis, es decir, responder a las incógnitas: (1) Es cierto que “calita” vuela; (2) “calita” y “alegría” vuelan. Observe que el programa lógico no solamente es capaz de responder si una determinada hipótesis es verdadera o falsa. También es capaz de determinar que valores de la incógnita hacen cierta la hipótesis.

El anterior ejemplo es claramente académico y quizá un poco complicado de entender. Sin embargo, considere el siguiente ejemplo relacionado con el sistema de control de semáforos de la ciudad de La Paz. El estado de cada uno de los semáforos (verde, rojo o ámbar) constituye los hechos del mundo real. El programa en sí consiste en unas cuantas reglas de sentido común: determinados semáforos no pueden permanecer simultáneamente en verde, un semáforo solamente puede transitar de verde a ámbar y de ámbar a rojo, etc. La hipótesis es el estado en el que deberían estar cada uno de los semáforos en el siguiente instante de tiempo. Éste es un ejemplo bastante complicado de resolver mediante programación tradicional, ya que la lógica subyacente al comportamiento de los semáforos en su conjunto queda enmascarada por simples órdenes imperativas del tipo “cambiar color de tal o cual semáforo”.

La programación lógica encuentra su hábitat natural en aplicaciones de inteligencia artificial u otras aplicaciones relacionadas, entre las que destacan: (1) Sistemas expertos, donde un sistema de información imita las recomendaciones de un experto sobre algún dominio de conocimiento. (2) Demostración automática de teoremas, donde un programa genera nuevos teoremas sobre una teoría existente. (3) Reconocimiento de lenguaje natural, donde un programa es capaz de comprender (con limitaciones) la información contenida en una expresión lingüística humana. La programación lógica también se utiliza en aplicaciones más “mundanas” pero de manera muy limitada, ya que la programación tradicional es más adecuada a dichas tareas de propósito general.

Guillermo Choque Aspiazu
www.eldiario.net
Junio 2 de 2008