Friday, October 30, 2015

¿Tienen alguna utilidad las cadenas de oración?



Hace tiempo escribí sobre si sirve el rezar y la conclusión a la que llegué es que no, no sirve, es inútil. Sin embargo, con el evento del huracán Patricia, que supuestamente iba a devastar la región correspondiente pegada al océano Pacífico -y que no pasó nada, surgieron en las redes sociales imágenes para hacer "cadenas de oración" por quienes iban a sufrir el meteoro. Se habló tanto de que éste era el huracán más peligroso de toda la historia de la humanidad, que se esperaba lo peor, pero nada pasó. Entonces los que creen en las cadenas de oración atribuyeron que "Patricia" se degradara a tormenta tropical fue un asunto de la oración que los mexicanos practicaron.

Pero si esto hubiese sido poco, salió Enrique Peña Nieto a decir que gracias a las oraciones de los mexicanos, en parte, no había pasado nada. Vamos, que esto está fuera de lugar El mandatario no tiene porqué atribuir que no pasó nada cuando probablemente la ciencia pueda dar argumentaciones más racionales y lógicas.

Pero la pregunta sigue ahí: ¿Sirve orar? ¿Sirven las cadenas de oración? Comentaba con Pilar y ella me dijo que pensaba que podían servir. De hecho, me dio un argumento que no pude rebatir: "si en la física un experimento lo modifica porque lo observamos, ¿Por qué una cadena de oración, en donde mucha gente pida lo mismo, no podría modificar la trayectoria de -por ejemplo- un huracán".

En la física se sabe que la observación de un experimento modifica a éste. Así, la naturaleza onda/partícula puede verse reflejada cuando hacemos un experimento y lo observamos -o no. Ya escribí al respecto aquí. ¿Por qué pasa esto? no se sabe. La realidad es que el hecho de observar (con un aparato, no tiene que ser un ser consciente), modifica el experimento. Pensemos que una gran cadena de oración podría cambiar un evento como el del huracán. ¿Podría ser? No lo sé aunque claramente poder probar que algo en el comportamiento del huracán ocurre porque se reza no veo cómo probarlo.

Sin embargo, me di a la tarea de pensar una manera de ver si las oraciones en particular sobre un tema, podrían alterar el comportamiento de algo externo. Se me ha ocurrido entonces hacer un programa de computadora que por ejemplo, seleccione un número del 1 al 10 y entonces -antes de seleccionarlo- el usuario tenga por ejemplo 25 segundos para pensar fuertemente con un número en particular, intentando mentalmente que la máquina -con su algoritmo pseudo-aleatorio- producirá después de que pase ese tiempo de fuerte concentración del individuo que usa el software. Con la máquina podemos hacer un registro de los intentos y si el programa "cedió" al rezo o a la petición mental del usuario y entonces el sistema azaroso puso el número que el usuario pensó.

Para asegurarse que no se haga trampa, el usuario deberá tener lápiz y papel en donde anotará el número que quiere que la máquina produzca. El sistema a los 25 segundos (se puede cambiar el tiempo para concentrarse en el número que se piensa), producirá un número del uno al diez y preguntará al usuario si acertó. Se puede entonces hacer una estadística trivial. Si los resultados son azarosos, el usuario tendrá 1/10 de probabilidades de que aparezca el número que pensó. Si un usuario puede modificar al programa, tendría que ser estadísticamente significativo.

Cabe decir que ya alguna vez escribí un programa para saber si se tenía percepción extrasensorial. Aquí la cuestión va por otro derrotero. Se trata de influir en la decisión del software para poner un número de diez posibles después de concentrarse en un número en particular por 25 segundos. De hecho, no se pone un botón para que la máquina dé su resultado para no "interferir" con la concentración del usuario.

Cuando le comenté a Pilar de mi idea de hacer un programa de esta naturaleza, me dijo que los usuarios deben creer que el creer en algo, en que el orar, puede ser significativo y que puede hacer un cambio.

Pues bien, en mi siguiente artículo hablaré de este programa y lo pondré a disposición de todos los que se interesen en el mismo.

Monday, October 19, 2015

¿Pueden tener las computadoras intuición en el ajedrez?



El tema de la intuición siempre nos lleva por caminos misteriosos porque de alguna manera, quien por intuición, sin tener toda la información sobre un problema, halla la solución, nos asombra y no podemos explicar cómo es que lo hizo. Hay jugadores de ajedrez que desde muy pequeños saben dónde deben ir las piezas. Capablanca era uno de ellos. Kaspárov también desde chico mostró habilidades notables al respecto. Muchos otros jugadores de altísimo nivel nos han enseñado que desde pequeños tuvieron esa capacidad impresionante para jugar bien.

Uno podría preguntarse si la intuición se puede aprender. Yo estoy convencido que sí y además, explico qué hay que hacer en mi librito publicado por Chessy "Desarrolla la Intuición en Ajedrez". Pero más allá de eso, ¿Puede aprenderse la intuición de forma que pueda ser programada en un motor de ajedrez? ¿Cómo se podría hacer esto? Pues bien, hallé un estupendo librito "Chess and Machine Intuition" (1998), de George W. Atkinson. En él hace un desarrollo bastante completo del "estado del arte" en el tema del ajedrez, las computadoras y la intuición. Fragmentos del libro pueden hallarse en Google y dan una buena idea del contenido si no se quiere comprar el libro físico, que cuesta unos 30 dólares.  Atkinson hace un interesante viaje por los primeros programas de computadora, los errores, los fracasos y al final de cuentas, los avances que se empezaron a ver después de que los científicos estudiaron el problema por alrededor de unos 50 años, llegando a la postre a derrotar al Campeón Mundial Garry Kaspárov, en un encuentro a seis partidas.


Y aunque el libro se lee casi de una sentada, para decirlo de manera coloquial, el capítulo 10 y 11 (los dos últimos), son extraordinarios. En el capítulo 10 Atkinson se pregunta cómo es que aprendemos y de hecho, pone ejemplos de sistemas que buscan aprender. Habla de perceptrones, de su boom inicial para después ser destrozado por la crítica científica. Y ese capítulo en particular es del que quiero hablar aquí. Atkinson se pregunta cómo es que los seres humanos llegamos a sintetizar información, a clasificarla. Y además, pone ejemplos de cómo las máquinas y sus programadores han intentado emular esta cuestión. Realmente el asunto lo lleva incluso a hablar de Hollander y de su sistema de "algoritmo genético", fundamental en el desarrollo de la "Vida Artificial" (como en el librito que escribí de ese tema y que está publicado como libro electrónico en Kindle/Amazon bajo el título "Jugando a ser Dios").

Entonces Atkinson y sus argumentos me dejaron pensando. ¿Podría haber manera no de clasificar patrones o configuraciones ganadoras en ajedrez, a partir de los conocimientos humanos sino que, al contrario, la propia máquina tuviese alguna manera de hallar los elementos que hacen de una combinación ganadora? Es una pregunta que simplemente por el momento no puedo contestar. Me gustaría decir que sí, que se puede, pero francamente no se me ocurre ninguna idea para empezar a trabajar sobre ello. ¿Habrá que crear quizás una serie de primitivas (algo así como si fuesen axiomas), para pasar a este posible nivel de abstracción donde la computadora reconoce posiciones favorables? ¿Cómo hacer eso? Misterio.

Por lo pronto aquí dejo las cosas. En la medida que se me vayan ocurriendo ideas, las plasmaré en este blog.

Tuesday, October 13, 2015

Compresión de imágenes: Codificación/decodificación RLE (Parte II)


En el artículo pasado hablamos de una manera sencilla de comprimir imágenes en tonos de gris. Desde luego que esta idea es limitada y finalmente no funciona de forma muy adecuada para las imágenes en color. Pero antes de discutir el caso de las imágenes en color, debemos considerar otras alternativas que pueden usarse para comprimir imágenes en tonos de gris. Uno de los algoritmos más usados es el llamado RLE (Rule Length Encoding). La idea funciona así: sabemos que una imagen en tonos de gris contiene una serie de números que se repiten, en particular tripletas de pixeles (en sus componentes R, G y B), los cuales son el mismo color. Si tenemos regiones en donde se repiten estos valores R, G y B, bien podríamos pensar en sustituirlos por el byte que hemos leído y un contador que nos indique cuantas veces se repite el mismo. Esto es básicamente el RLE.
Supongamos que tenemos una imagen de puntos al azar, de todos los posibles tonos de gris. Si son al azar, probablemente no tengamos secuencias largas de un solo tono de gris, por lo que por ejemplo, si la imagen original contiene los siguientes bytes (en hexadecimal):

de de de de de de de de 98 98 98 98 98 98 ff ff 01

podríamos crear un nuevo archivo que tuviese los siguiente valores:

de 08 98 06 ff 02 01 01

Lo cual nos diría que tendríamos 08 bytes con el valor de, 06 bytes con el valor 98, 2 bytes con el valor ff y finalmente un byte con el valor 01.

Cabe señalar que el esquema RLE bien podría usarse para comprimir no solamente imágenes, sino cualquier archivo, aunque muchos no son muy susceptibles de sacar ventaja de la repetición de símbolos. Por ejemplo, sería mala idea usar RLE para comprimir textos, pues estos no tienen repeticiones de letras contíguas. Por ende, no es el mejor de los esquemas para archivos de esa naturaleza.

Los algoritmos básicos de codificación y decodificación son los siguientes

CODIFICACIÓN RLE:



DECODIFICACIÓN:



Nótese que este par de rutinas funcionan con todo el archivo que se desea procesar, lo cual no necesariamente es la mejor idea. Lo más sensato es usar el "canvas" (en donde reside la imagen en un eventual software de procesamiento de imágenes) y aplicar RLE a los pixeles. De hecho, si se procesa, como en este caso, un archivo completo, estamos intentando también comprimir el encabezado que muchos formatos gráficos tienen, incluso los archivos BMP. De nuevo, se advierte que esto es simplemente una idea y el artículo muestra una primera implementación general para ilustrar lo que hay que hacer.

En pruebas hechas con estos algoritmos se halló que una imagen en tonos de grises (que contenía simplemente un bloque en un solo tono de gris), que ocupaba originalmente 212 Kbytes, se redujo a 3Kbytes. Para saber el factor de compresión, dividimos (3K / 212K) * 100, lo cual entrega 1.415, es decir, el archivo comprimido ocupa menos del 2% del archivo original. Desde luego, las imágenes cotidianas no son tan buenas para la compresión. Sin embargo, en casos como en el del ejemplo, es espectacular la compresión de las imágenes.

Si por ejemplo, usásemos este algoritmo para procesar una imagen en tonos de gris que están al azar en una imagen, pudiese no tener ni remotamente los resultados mencionados. Utilizando la siguiente imagen



hallamos que la compresión llego a 141 KBytes, cuando la imagen original fue de 212 KB. Es decir, 66.50 % de compresión sobre la imagen original.

Sunday, October 11, 2015

Introducción a los algoritmos de compresión de imágenes


En el curso que doy de Proceso Digital de Imágenes (PDI), es siempre importante hablar de un tema que muchas veces es difícil de abordar. Se trata del de la compresión de archivos, en particular, del de la compresión de imágenes, el cual en alguna medida permite que las mismas ocupen menos espacio en los medios de almacenamiento y mejor aún, que la transmisión de las imágenes y fotos sea más rápido. Por ejemplo, si puede reducir una imagen al 10% de su tamaño en bytes, pues puedo, en principio, enviar diez imágenes por el precio de una, para decirlo de manera coloquial. Así, la compresión ayuda muchas veces a ser más eficientes en lo que se refiere al uso del ancho de banda por Internet. Por otra parte, la compresión permite usar menos espacio de almacenamiento.

Hay básicamente dos esquemas usados en este tema:

  • Compresión sin pérdida de información (losseless)
  • Compresión con pérdida de información (lossy)


En la primera, la compresión y descompresión del archivo (para convertir la imagen comprimida y podamos verla), no pierde información del archivo original. Vamos, al descomprimir la imagen es estrictamente igual a la original. La segunda compresión, en cambio, pierde información y el efecto de comprimir quizás no lo note el ojo humano al descomprimir y mostrar la imagen, pero si vemos a detalle veremos que habremos perdido información de la imagen original.

Cabe decir que a cambio de ahorrar bytes en el archivo original de almacenamiento, la versión comprimida debe descomprimirse y eso finalmente lleva tiempo. En cómputo no existe ningún procedimiento ganar-ganar. Si ganamos en espacio perdemos en tiempo y viceversa. Esto es un buen ejemplo de ello.

Los esquemas de compresión de imágenes son variados y los más usados son JPG o TIFF. Hace unos años, más de 20, el formato PCX, del cual hablaré en otro artículo próximamente, era uno de los más usados y simples, pero cayó en desuso ante sofisticados esquemas de compresión como los que plantean TIFF o JPG.

Pensando en cómo ejemplificar la compresión de imágenes, como una primera aproximación al problema, se me ocurrió que podía reducir a una tercera parte cualquier imagen que estuviese en tonos de grises. La razón de ello es simple: en 24 bits de color tenemos 8 bits para el rojo, 8 para el verde y otros 8 para el azul. Así, tenemos más de 16 millones de posibles colores con combinación de bytes R,G,B, que es el modelo conocido precisamente como RGB. Pero en tonos de gris tenemos solamente 256 tonos posibles. Cada tripleta R,G,B contiene R=G=B, es decir, las componentes de color en RGB son idénticas entre sí. Por ello, tenemos el tono de gris más oscuro (el negro), como (0,0,0), un poco menos negro será (1,1,1), menos negro aún será (2,2,2) y así sucesivamente. El blanco será (255,255,255).

Si esto es así, una imagen en tonos de gris puede reducirse a la tercera parte de su tamaño original leyendo una sola componente (el R, el G o el B de cada pixel de la imagen) y escribiendo en un archivo de bytes esa componente de cada pixel en la imagen. La idea es muy simple de programar y el algoritmo es éste:


(dar click en la imagen para verla más grande)

Cabe decir que cuando tengo la imagen que voy a procesar, primero la paso a tonos de gris tomando las componentes R, G y B, sumándolas y dividiendo de manera entera entre 3, es decir:

Gris := (R + G + B) div 3;

Así me aseguro que la imagen es de tonos de gris. De hecho, al convertir de color a tonos de gris ya perdemos información de color de la imagen, pero en este caso no es el asunto que discutimos.

Ahora bien, ¿cómo podríamos mostrar la compresión lossy, que es donde sí se pierde información al recuperar la imagen comprimida? Una idea sencilla resultó ésta: Tomemos una imagen en color y entonces revisemos las componentes de color (R,G,B). Tomemos el Rojo, la R y listo, digamos que ése es el tono de gris. Por lo tanto la imagen final en cada pixel tendrá el componente (R,R,R) en donde había antes un (R,G,B). ¿Qué tanto podría cambiar la imagen original en blanco y negro usando solamente la componente R de cada pixel?

He aqui dos imágenes. La de la derecha es la imagen en tonos de gris original. La de la izquierda es utilizando solamente la componente R(ed) para formar el tono de gris.



Tonos de gris vs Lossy (usando la coordenada R)

La diferencia visual quizás no es muy notable, pero de alguna manera, si nos fijamos con cuidado, veremos que la imagen "lossy" es un poco más oscura. Si en lugar de usar la componente R usáramos la B, encontraríamos un resultado "lossy" más obvio:


Tonos de gris vs Lossy (usando la coordenada B)

De hecho, se me ha ocurrido hacer un experimento más: Tomemos la imagen original en tonos de gris y saquemos los tres componentes de color, R, G y B, tomando uno de ellos al azar para formar el pixel correspondiente como (R,R,R), (G,G,G) o (B,B,B). Tal vez así, al elegir consistentemente el R, el G o el B de forma que se distribuyan esos tonos de gris formados con una sola componente, el resultado final podría ser mejor. Hice la prueba, pero me llevé una sorpresa inesperada:



Tonos de gris vs Lossy al azar (entre coordenadas R,G y B)

En resumen, usar una sola componente parece que no es tan descabellado si es que usamos la componente R o la G. Con la componente B la descompresión si muestra que se ha perdido mucha información de la imagen original. Probablemente la coordenada R sea la mejor opción en este caso.

El esquema mostrado reduce las imágenes a un 33% del tamaño original, lo cual quizás no puede considerarse malo, peor por ejemplo, esta misma imagen en JPG se reduce dos veces lo que podemos lograr con esta idea.

Aún así, no hay ninguna mejora con respecto al tamaño de la imagen comprimida. Digamos que es independiente de la componente elegida aunque para fines ilustrativos, usar el tono de gris calculado antes de procesar la imagen nos da una imagen resultante en donde no se pierde información de la imagen original.

Quien quiera mi programa de demostración, pídamelo a morsa@la-morsa.com y a vuelta de correo lo recibirá de manera gratuita.

Saturday, October 10, 2015

El Bachoco fue a la "estética"


Jorge es un muy buen amigo. Por algún tiempo, aparte de sus actividades deportivas (nadador consumado que en el 2013 cruzó el canal de la mancha en relevos), se dedica a tener los automóviles impecables. Pronto va a abrir un negocio en Queretaro, una especie de "estética" para que los autos que le manden se vean no limpios, sino limpísimos, sin mancha alguna. El otro día me dijo Pilar que regresara antes de las cino de la tarde a casa porque Jorge iba a pasar por mi coche para "llevarlo a la estética". Me hizo gracia la puntada y ahí estuve.

Jorge se llevó mi coche y pensé mientras se iba "¿pues qué tanto puede cambiar al 'Bachoco', que ha dado tantos años de fiel servicio?". Con 16 años de vida, mi Chevy -pensaba- quedaría relativamente limpio pero no mucho más allá de mis expectativas. Pero la sorpresa vino cuando Jorge me mandó las fotos del proceso realizado. Sólo tengo una palabra: ¡Sorprendente!

Agradezco las atenciones para con el Bachoco. Quedó como dicen en la TV: "Rechinando de limpio".











___
(*) Se puede dar click a las imágenes para verlas en su tamaño real

Friday, October 09, 2015

Fallece Alejandro Preve



El artífice del Torneo Carlos Torre, que se lleva a cabo cada diciembre en Mérida, Yucatán, falleció este 9 de octubre. Físico de profesión, habiendo nacido un 23 de abril, pero diez años antes que yo, dedicó un gran esfuerzo por hacer del Torneo en memoria del Gran Maestro mexicano Carlos Torre, uno de los mejores del mundo. Por sus ediciones, que creo se cuentan fácil más de 20, desfilaron jugadores de la talla de Leinier Domínguez, Vassily Ivanchuk, Milov, Vera, Bruzón, Miles, Gilberto Hernández. José González, etcétera. Preve le dio un empuje al Torre extraordinario y sé de primera mano que muchas veces tuvo que poner dinero de su bolsa para pagar premios y para que no hubiese nada que manchara este enorme esfuerzo.

Alejandro Preve, además de ser uno de los organizadores de ajedrez más importantes en nuestro México, era un hombre extremadamente bondadoso. Preve probablemente logró que Yucatán se colocara como un ejemplo a seguir para que niños y jóvenes dedicaran su tiempo al ajedrez. Difícil hallar alguien con ese empuje. Como buen yucateco, era amable con todos y diría yo, demasiado amable. Lo vamos a extrañar y esperamos que la familia de Alejandro encuentre consuelo, aunque eso sé que siempre es difícil. Descanse en paz el buen amigo.

Monday, October 05, 2015

Las reglas del ajedrez competitivo


En la pasada Copa Mundial, que acaba de ganar Sergey Karjakin, surgió un problema entre el representante estadounidense y número 2 del mundo, Hikaru Nakamura, y su contrario Ian Nepomniachtchi. En una de las partidas del desempate, Nakamura tocó simultáneamente el rey y la torre para enrocarse. La regla dice que si se va a enrocar, primero se mueve el rey y después se desplaza la torre a su nueva posición. Nepomniachtchi perdió esa partida y fue eliminado de la Copa Mundial. Posteriormente, el gran maestro derrotado presentó una protesta indicando que los jueces debieron haber detenido el encuentro y obligar a Nakamura a mover la torre impidiéndole el enroque. De hecho, el encuentro se estaba grabando en video y se puede ver que por fracciones de segundo, Nakamura toca primero la torre.

Pero ningún juez hizo nada y el propio Nepomniachtchi tampoco. Hay muchas razones para no hacer nada. No lo notó en su momento y después, cuando vio el video, se dio cuenta de ello. No dijo nada porque su rival es el número 2 del mundo y resulta feo hacer un reclamo de esta naturaleza. Pero las reglas son las reglas y si los árbitros no hicieron nada, ¿por qué el afectado tampoco hizo el reclamo en su momento? Cabe decir que Nepomniachtchi tuvo una experiencia parecida contra Karpov, que en un torneo de partidas rápidas, éste último movió primero la torre y luego el rey para enrocarse. Ahí Nepomniachtchi buscó con la vista a algún árbitro pero eventualmente, sin que hiciese una reclamación en el momento, la partida continuó.

Hay que decir que las reglas del ajedrez competitivo son estrictas: pieza tocada, pieza jugada. Esa regla en particular suscitó una dificultad hace unos años en la partida entre Judit Polgar y Kasparov. El Campeón Mundial de ese entonces tocó un caballo y lo movió a otra casilla, pero aún no soltaba la pieza y entonces lo cambio a otra posición. De nuevo Judit, como Nepomniachtchi levantó la vista al juez pero no reclamó nada. El video de la partida muestra que Kasparov soltó la pieza por dos décimas de segundo, imperceptibles al ojo humano. El propio Kasparov dice que no sabe si soltó o no la pieza y yo en lo personal le creo. De nuevo, ¿por qué Judit no reclamó? Porque jugaba con el número 1 del mundo, porque probablemente no sabía si de verdad su rival había soltado la pieza.

Ahora bien, hay en el mundo del deporte algo que la FIFA llamó "fair play". Si pasaomo del futbol al mundo del ajedrez, podemos pensar que por ejemplo, tanto Karpov como Nakamura querían enrocarse y sí, lo hicieron de manera impropia pero seamos francos, era claro que buscaban enrocarse. Y sí, la regla indica el procedimiento pero ¿alguien le va a decir al excampeón del mundo que no conoce el procedimiento? Yo creo que el fair play se aplica perfectamente en este caso. Curiosamente, en el asunto con Nakamura, cuando se le informó de la protesta de su rival, el estadounidense dijo que en ningún momento pensó que había hecho algo mal. Yo en particular le creo.

El reglamento del ajedrez indica también que éste no puede contemplar todas las posibles situaciones que pueden darse en una partida de ajedrez y se deja al criterio del árbitro en todo caso las decisiones que no estén en el reglamento. Si los árbitros en la partida de Nepomniachtchi vs Nakamura no dijeron nada, si el gran maestro que perdió tampoco dijo nada, pues no hubo falta y ya el resultado no se puede cambiar ni se repite la partida.

Nepomniachtchi debe aprender la lección que debe extenderse a todos los ajedrecistas. Si uno, al estar jugando observa una irregularidad, puede pedir la intervención del árbitro. Si no lo hace y el juez tampoco dice nada, la falta queda sin consecuencias. Y me paso al plano cotidiano: si voy a comprar algo y noto que me dan mal el cambio ¿no digo nada? ¿tiene que estar un juez de lo civil ahí observando para ver si dice algo? No. Es obligación del afectado reclamar. Si se va de la tienda y regresa al día siguiente diciendo que le dieron mal el cambio, quizás no se analice el asunto ni le devuelvan nada. Será un castigo a no reclamar en el momento.