Beat the Big Bit

ideas rápidas

Sometimes libs happen

Some days ago I faced the problem of deploying OpenCV and its Python wrapper to Heroku.

At first sight, it seems a pretty easy task, just a combination of “pip install”s and “make install” should work… as you may guess, this was not the case.

Firstly, since OpenCV’s main python wrapper is not installed using pip install, we need to add a buildpack to our configuration. This buildpack downloads the OpenCV package, compiles it and installs it. To my surprise it also has to download, compile and install cmake.

So, once I understood how to add the buildpack, I did the magic heroku deploy, which translates to git push heroku master and the buildpack started to download cmake and compile it. Again, as you may guess, not only it didn’t work, but I didn’t get any error message to understand why it was not working.

So I had to learn how buildpacks work, log into the machine using ssh, and do the buildpack steps by hand. The problem was that the url from where the buildpack was trying to download the code did not exist any more.

Perfect, cloned the buildpack repo, fixed that, tested that it actually worked when logged into the machine, and changed my heroku configs for it to use my fixed version of the builpack.

However - of course -, when I tried to deploy it didn’t work. It seemed like some kind of timeout failure, since the error was always at different points in the deploy. I changed some heroku’s obscure configuration using some labs stuff and the COMPILE_TIMEOUT variable and it didn’t work. I also tried incresing my ssh timeout configuration…

So I realized… I can compile outside heroku and copy the binaries, I also have a 64bit linux server! At first, it seemed to work, but I only needed more files, until I got to the libc.so.6. The problem is that heroku has a 2.11 version, and I have a 2.14 one… After asking, that is because they have an Ubuntu 10.10!!

By the way, having both libraries coexisting makes even ls seg fault.

Ok, I’m not deploying it on heroku, but luckily, I could manage to get something good out of this. I made a script that gets you all the dependencies of a given set of .so files.  It works recursively, so it finds the dependencies closure. Take a look

Perceptual basis of evolving western musical styles

Music evolves through history in recognizable form, driven in part by technical and societal changes, but largely following its own dynamics. These changes lead to characteristic usages of different musical features.

The question that we asked ourselves was: Can we actually measure that?image

We used the Peachnote corpus to find patterns in the melodic interval statistics, and found that these statistics almost categorically clustered the years around Baroque, Classic, Romantic and post-Romantic periods.

Once we found evidence that those statistics are useful for recognizing styles, we applied a pattern recognition technique to try to understand the clusters. The results were surprising, patterns were musically and cognitively interpretables

The cognitive interpretation follows from the fact that when we listen to music, we  continuously predict what is going to sound next. That predictions must somehow agree with the statistics of a massive corpus, otherwise we would constantly expect unlikely events.

Do you want to get into the details? Read the full article!

Perceptual basis of evolving Western musical stylesby Pablo H. Rodriguez Zivic, Favio Shifres, and Guillermo A. Cecchi. 

 

In the news

The paper appeared in several media. The following video was taken from the Royal Institution of Australia (the article is reviewed at minute 2:03)

The article was also reviewed in the Advancement of Science newsitalian Scientific American, University of Buenos Aires newsengadget the IBM research blog, DRadio Wissengolem.de (a german magazine) and Indonesia Raya News

Archivado en Music perception Pattern Recognition

Subtitle downloads correlates with reported number of viewers

A couple of months ago I decided to start watching The Big Bang Theory. I have to admit I never gave it a try. So, I started to watch from the first season’s Pilot owards.

When I finished the second season, I noticed something unusual on the number of downloads of the subtitles of the first episode of season three: it was twice as big as the previous episode!

Thus, I wondered whether it is related to the actual Nielsen-like rating of the series. 

In order to answer it, I made two quick and dirty scrappers. One for tvsubtitles.net, whose code can be downloaded from here. The other was used to get the actual number of viewers. For this case, the fan page the-big-bang-theory.com was of great help, whose scrapper is here.

Once I got the data, it was time for plotting it. The following figure depicts four curves. The first three are a scaled version of the number of downloads of English, Spanish and Russian subtitles. The last is the scaled version of the actual number of viewers.

image

The  black colored dashed line marks the end of the fifth season. It can be seen that from that point on, the trends have very different behaviour. This may be due to a lag between the number of viewers of a tv series and the number of downloads of a subtitles.

One can tell that the curves correlate just by seeing them. Nevertheless I run a  Spearman’s correlation, and a goodness of fit test resulting in a significative correlation between the downloads of English subtitles and the rating of the show, \(\rho = 0.64\), p-value < \(3.6\times10^{-15}\)

The question that now rises is: Who are we measuring by counting the number of downloads of English subtitles? and, Why does it correlate with the number of viewers?

Nonetheless, there’s more! After checking that there is an actual correlation, I made some scatter plots to see how the distribution looks like. To my surprice, the dots follow a specific trajectory in the space of number of viewers vs. number of downloads, as it is depicted on the following figures.

image

image

image

I hope you find it as intriguing as me!

Información mutua

Suelo tener la falencia de programar cosas y luego darme cuenta que había una librería que lo calculaba por mi.

Puede que este sea el caso, pero bueno, ya es demasiado tarde, porque ya está programado.

Necesitaba calcular la información mutua que tienen variables contínuas con una variable discreta. Después de buscar un rato, decidí que iba a ser más rápido programarlo yo. 

Dejo el código por si a alguien le pasó lo mismo que a mi.

Como para testear que anda bien, podemos probar dos cosas.

1) Ver que una variable dependiente de otra tiene alta información mutua y que dos variables independientes tienen baja información mutua

Para ver esto podemos definir 3 variables aleatorias

\( X \sim Normal(0,1) \)

\(Y_1 = 1 \Leftrightarrow X < 0, Y_1 = 0 \) si no y

\(Y_2 = Binomial(1,\frac{1}{2}) \)

2) Ver que valga la propiedad de que

\[I(X;Y) = H(X) - H(X|Y) = H(Y) - H(Y|X)\]

En este caso, la función que calcula la información mutua no es estríctamente simétrica, porque el vector x contiene valores reales, pero el vector y no. Esto hace que haya que discretizar a x en un caso:

Este código arroja el siguiente resultado

¿Tu mail es muy largo? Parte II

Después de la publicación del último post@marcelorinesi me preguntó si la distribución de la longitud de los mails podría relacionada con la longitud de los nombres de las personas.

Hace un tiempo tuve acceso a una base de datos de nombres de Argentina, asi que hice un comparación veloz.

Por un lado calculé la distribución de nombres y apellidos. Nuevamente si tu nombre/apellido esta entre 4 y 9 letras, sos una persona muy normal.

Además, calcule la suma entre estas dos variables usando la ley de probabilidad total:

\[ P(|nom| + |ap| = s) = \sum_{i=1}^{s-1} P(|nom| = i)\times P(|ap|=s-i) \]

Donde \(|nom|\) y \(|ap|\) representa la longitud del nombre y apellido respectivamente

¿Qué se puede ver entonces en el gráfico de arriba?

Bueno, primero que la longitud de los mails tiene muchisima más variabilidad que los nombres y apellidos. Sin embargo, la longitud de los mails está entre los nombres/apellidos y los nombres + apellidos, lo cual sugiere que es común la utilización de iniciales en los mails como mi mail de la facu prodriguez@dc.uba.ar.

De todas formas, también hay mails del estilo estacasillanoexiste@gmail.com que nada tienen que ver con los nombres, sin embargo parece no ser el caso, dado que sólo un 25% de las casillas no contienen un nombre/apellido. 

¿Tu mail es muy largo?

Siempre estuvo delante mio, pero nunca le presté atención. 

Hace rato que tengo una base de datos mediana de direcciones de mail: ¡¡Todas las a las que alguna vez escribí o me escribieron!!

Si bien no son muchos, 15k direcciones es un número suficientemente grande como para jugar un poco. Así que me hice esa pregunta ¿Mi mail es demasiado largo?

Muy facil de medir: Midamos la longitud de los 15k mails que tengo!

Como resultado se ven dos cosas. Primero, que parece haber una longitud preferida por la gente de 22 caracteres (incluyendo la parte de @blabla.com).

Segundo, hay como picos extrañisimos muy muy lejos! Esas direcciones son del estilo de las que usa Twitter para avisarte de cosas.

Así que si tu mail mide entre 20 y 25 caracteres sos una persona muy normal

Taller de composición algoritmica en la ekoparty

Por más extraño que parezca, estuve en la Ekoparty - conferencia de seguridad informática - dando un taller de composición algorítmica de música.

Si queres hacer la experiencia del taller en tu casa, seguí estos pasos:

1) Instalar estos paquetes

sudo apt-get install python-setuptools graphviz graphviz-dev libgraphviz-dev python-matplotlib timidity

sudo easy_install ipython==0.13
sudo easy_install ipdb==0.7
sudo easy_install pygraphviz==1.1

2) Bajarse https://dl.dropbox.com/u/11150175/taller_musica.tgz

3) Descomprimirlo (tar xvf taller_musica.tgz)

4) cd lib/midistuff; sudo python setup.py install

5) Mirar las slides

6) A programar! 

La matriz más grande que no tira MemoryError

Hace poco le puse más memoria a mi maquina, y recién me pregunte: ¿Cuál es la matriz llena más grande que no tira MemoryError cuando la creo desde Python?

Asi que programe en el mismo interprete un script que usando búsqueda binaria se fija eso. Lo divertido que la condición para decidir ir por un lado o por el otro en este caso, es que te salte una excepcion de MemoryError :D

¡Ojo al correr esto que te va a dejar la maquina medio muerta durante el proceso!

Ordenando las ideas

Ya hace varios años que soy docente en exactas. Una de las materias donde más tiempo estuve se llama Algoritmos y Estructuras de Datos II, algo2 para los amigos. Esta materia es central en la carrera y toca muchísimos temas que uno debe saber si quiere ser un buen computólogo. Yo acá me voy a concentrar en uno sólo: cómo ordenar cosas.

Aunque parezca un poco tonto, ordenar es un problema que aparece siempre en sistemas de computación. Por ejemplo, en todas las páginas de compras se puede ordenar por precio, o en un local que tiene cuentas a cobrar, probablemente les interese saber cuales son los clientes que más deben, o cuando uno analiza una colección de documentos, desea ver las palabras que ocurren con mayor frecuencia en él.

Todos estos problemas se reducen a lo mismo: tengo n números desordenados y quiero que queden ordenados lo más rapido posible.

Todo es muy bonito hasta tenés que aprender a programarlos, ahi a veces es un poco doloroso: son muchos, muy distintos y con diferentes propiedades. Entonces, en algún momento de la historia de la materia (previa a mi), se decidió hacer un taller de sorting donde los alumnos puedan programar, visualizar sus algoritmos y ver quién programa el algoritmo más rápido.

Luego, por esas cosas de la vida, ese software quedó en el olvido. Un dia me tocó dar el taller de sorting. ¿Qué hice? ¡Lo programé de nuevo!

Hace ya como dos años que se usa el taller, y como cada vez que el taller lo da un docente nuevo - ya no soy más docente de la materia - tenía que explicarle como instalarlo/usarlo, decidí ponerlo a disposición de la comunidad y subirlo a este repo github.

Si estás ansioso y queres ver como se ven los algoritmos, acá te dejo un video de algoritmos de varios alumnos que me prestaron su código con estos propósitos. Los números se muestran apilados uno sobre otro, y están representados por un palito del largo correspondiente.