Saturday, June 7, 2008

K-means y gravedad

Espero que este articulo cierre con un moño azul

 

Disclaimers: Articulo computronico. Drito, no te quejes

Mirando un poco una implementación de k-means me di cuenta que uno de los problemas que tenia era que los puntos no tenían “conciencia” de su posición en el espacio ni de su entorno. Básicamente, un punto era un placeholder de coordenadas, y nada mas.

Como resolver este problema era algo que empezó a dar vueltas por mi cabeza. No llegue a ninguna solución (me adelanto, y bajo las expectativas sobre este post). A pesar de eso, me di cuenta de que el universo esta todo el tiempo haciendo k-means. Básicamente, la gravedad es una función de la distancia entre los cuerpos (y también de la masa, pero gracias al 1, podemos olvidarnos momentáneamente de eso).

Los cuerpos en el espacio “sufren” y la atracción gravitacional de otros cuerpos (no toman conciencia de esa atracción, pero tiene un impacto sobre estos cuerpos). Entonces, el modelo que planteo es pensar a los distintos puntos como distintos cuerpos (a priori, con masa igual a 1), y en determinar los clusters en base a los conjuntos donde las relaciones gravitatorias son mas fuertes (de la misma manera que existen planetas, sistemas planetarios, sistemas de estrellas, galaxias, etc.). Ahora se produce un cambio de la relación, en vez de ser la relación de cada punto contra la media teórica de los clusters, la relación es entre cada unos de los cuerpos (creo que es un poco lo que se hace en fuzzy k-means).

Hasta ahora este cambio de metáfora no aporta nada (es mas, agranda la complejidad algorítmica, lo que no es bueno). Sin embargo, creo que se pueden hacer agregados de cuerpos. Esto seria, definir un Epsilon, y en base a ese Epsilon crear esferas, cuya densidad depende de la cantidad de puntos de esta esfera y del tamaño del Epsilon (volvemos a algo parecido a k-means). Ahora, estos cuerpos pasan a ser iguales a el resto de los cuerpos (no agregados), y solamente difieren en la densidad (y acá si podemos empezar a utilizar feature propios de la gravedad).

Ahora aparece un problema con la definición de un Epsilon. Si hacemos una esfera de un radio determinado, estamos suponiendo implícitamente que los puntos van a estar distribuidos uniformemente en las n dimensiones. Este supuesto es demasiado fuerte. Quizás, algo que se podría hacer es hacer una ponderación en las dimensiones donde los puntos tienen mayor variabilidad. Bueno, básicamente esto seria proyectar todos los puntos en el espacio de los autovectores de la matriz de varianza/covarianza. Es decir, utilizar PCA (sin perdida de información).

Una vez que realizamos esta proyección, nos queda una topología donde, en principio, tiene mas sentido utilizar una esfera para crear los agregados.

 

Creo que una de las ventajas que puede tener esta metáfora es con respecto a las proyecciones.

Pensando por ejemplo en el tiempo. Si el tiempo no es una variable endógena (no es una de las n dimensiones), y quisiéramos hacer una extrapolación. Es decir, quisiéramos hacer una proyección sobre la posición futura de los distintos cuerpos, creo que tiene sentido estadístico utilizar los mismos modelos que se utilizan en la física para establecer la posición futura de un cuerpo en movimiento (es decir, para donde caen las manzanas). Creo que los datos pasados nos podrían ayudar para calcular la velocidad de los cuerpos, y quizás nos ayudarían a detectar “agujeros negros” en nuestra muestra.

De cualquier manera, estas son especulaciones teóricas, recién tengo planeado cursar física del CBC el cuatrimestre próximo, ahí quizás tenga alguna idea mas acabada sobre este tema

Monday, March 24, 2008

(algo de ) Lo que no me enseñaron sobre la correlacion

Ante todo, buenas tarde

Hace un par de meses, Marianita me paso un paper sobre analisis de lenguaje natural, o algo por el estilo. 

Lo interesante (para mi) de ese paper es que utilizaban como medida de distancia de dos variables, el coseno del angulo que forman los vectores de sus realizaciones (normalizadas).

Esto realmente no tenia demasiado sentido para mi. 

         1.         Angulo entre vectores en espacios n-dimensionales?! Donde estaba el cateto opuesto y la hipotenusa (ok, podian ser las soluciones a ecuaciones diferenciales, pero no me simplificaba el panorama)

         2. Que era lo que media el coseno ahi?

Bueno, el punto uno me costo un tiempo entenderlo (el dos mas), pero mas o menos la idea es asi:

Suponga que queremos ver como en distintos documentos (n documentos) aparecen distintas palabras (m palabras). -si tuve que uzar un ejemplo concreto, por que me estaba haciendo un rollo con la abstraccion-

Para cada palabra, tenemos un vector (en realidad, un punto) con las apariciones en los n documentos, es decir, tenemos un vector n-dimensional por cada palabra. Esto nos da m vectores n dimensionales.

Ahora, queremos sacar el coseno entre dos palabras

Un vector, ademas de ser una n-upla (algo que tiene n elementos),  define un segmento (y una recta) que pasa por el 0 (si, claro, un vector... :) ) 

Entonces, nosotros teniamos dos vectores, es decir, que por ahi oculto, y bastante callado, habia otro punto inportante (que a priori, es el unico que tienen en comun todos los vectores), el 0.

Agregando el 0, pasamos a tener 3 puntos! (de vuelta, de dimension n). Pero aca esta la magia, de la misma manera que en un espacio euclideo, dos puntos definen una recta, 3 puntos definen un plano! (si, obvio, pero…)

Entonces, si vemos los vectores en el plano definido por los 3 puntos (las dos palabras mas el 0), vemos que, por construccion, los vectores estan en el mismo plano, y pasan en (por lo menos) un punto. Es decir, podemos calcular el coseno!!!

Bueno, esto ahora tenia un poco mas de sentido, pero todabia tenia un par de cosas haciendome ruido en la cabeza.

Por ejemplo, cual era el espacio original en el que estabamos trabajando? Era un espacio n-dimensional, haci que tenia que ser el espacio de las posibles realizaciones, donde cada uno de los puntos definia un conjunto complete de realizaciones para una variable (si estaba normalizado, no importaba para que variable). 

La existencia de este espacio me parece un poco rara, e interesane –voy a pensar mas al respecto J -

 

Ahora nos queda el Segundo punto, que es el significado de esta medida.

Si vemos la forma compacta -sin hacer explicita la formula del plano- de calcular el coseno para dos angulos (la copiaria, pero major vallan a wikipedia), nos vamos a dar cuenta que es la misma que la formula de la funcion de correlacion (para valores centrados)!!

Una de las cosas a la que le da sentido esto, es que cuando tenemos variables independientes, los vectores son ortogonales, y el angulo es un angulo de 90º!!

 

Esto esta buenisimo, por que todo lo que dije sobre la creacion del plano en el que aparecen los vectores es algo que hacemos implicitamente cuando calculamos la correlacion!

Me da lastima que despues de tantos años de facultad, eso sea algo de lo que nunca he odio, pero me parece que puede ser interesante pensar un poco sobre eso.

 

(puf, post innecesariamente largo, como este fin de semana…)

saludos

/jb

 

Thursday, March 13, 2008

Accion farmacologica

"el pantopazol inhibe selectivamente la bomba de protones localizada en la membrana apical de las celulas parietales de la mucosa gastrica. Este bloqueo irreversible provoca una inhibicion mas pronunciada de la secrecion acida en comparacion con los antagonistas de los receptores histaminergicos H2.
En el interior de la celula parietal el pantoprazol alcanza su forma activa, una sulfenamida ciclica cationica, que luego se une a los residuos de cisteina de la bomba protonica, inhibiendo asi la accion de la misma"
y esto se puede conseguir en cualquier farmacia...

Saturday, February 9, 2008

finance google no funciona tan bien

disclaimer: Este no es un post computronico
Y eso me pone contento :)

Le estaba mostrando a un amigo (juan pablo) finance.google.com, y el descubrio un pequeño bug.
Por curiosidad, quizimos ver como andaba tenaris ( http://finance.google.com/finance?q=NYSE%3ATS ), y al ver el Market Cap, me dijo: "che, eso no esta bien. el numero es 111.56B, pero esta mal", de hecho, en http://finance.yahoo.com/q?s=ts, el Market Cap era 22.31B, es decir, una pequeña diferencia de 89.25B, casi nada, digamos :)

El me dijo que no estaban teniendo e cuena que tenaris era un ADR, pero no pude encontrar otro titulo donde el error sea tan grosero.

Realmente me alegra que a la gente de google no le salgan siempre tan perfecto las cosas (si, es envidia :) )

Por si no se entiende, donde dice B se lee Billions, que es mil millon dollars (mucha mucha plata)

Wednesday, January 30, 2008

kmeans y c++ template metaprogramming

Estoy haciendo una implementacion de kmeans tratando de hacer la maxima cantidad de cosas posibles con templates metaprogramming, para transferir en el codigo el conocimiento que ya tengo en tiempo de compilacion.
Me aparecio este petit problema (gracias g++, sos lindo... por suerte ya lo resolvi):
iChing:~/.../code/kmeans jb$ make maing++ main.cpp -o maini686-apple-darwin8-g++-4.0.1: Internal error: Illegal instruction(program cc1plus)Please submit a full bug report.See <URL:http://developer.apple.com/bugreporter> for instructions.make: *** [main] Error 1

Friday, December 28, 2007

Information Entropy y k-means

Hace un par de semanas me encontre con la medida de la entropia de Shannon. Es simplemente esta formula:
I = -∑pi*ln2(pi) donde pi = Ni / N

N es la cantidad de elementos en todo el conjunto, y Ni es la cantidad de elementos en cada uno de los k i-subconjuntos

Parece una formula simple, pero en realidad, simplemente mirandola, no podia entender su significado.
En principio parece una esperanza, en particular, la -E(ln2pi), esto seria algo asi como la cantidad de bits necesarios para representar, en promedio, los elementos existentes en cada uno de los i grupos.
Pero seguia sin decirme demasiado, asi que gracias a la ayuda de Manuk, empezamos a destripar esta formula.
Partimos de:
I = -∑pi*ln2(pi

= -∑pi*ln2(Ni/N)
= -∑pi*[ln2(Ni) - ln2(N)]
= ∑piln2(N) - ∑piln2(Ni)

como ln2(N) no depende de i, es una constante, y puede ser extraido de la suma.

= ln2(N)*∑pi - ∑pi*ln2(Ni)

como ∑pi = 1, y el segundo termino es una esperanza, nos queda:
=ln2(N) - E(ln2(Ni))

El primer termino es constante, siemre que se mantengan constantes las cantidades de elementos del conjunto, entonces, si queremos maximizar o minimizar la entropia, tenemos que modificar el segundo termino (la distribucion de los elementos dentro de los conjuntos).

De hecho, la entropia va a ser maxima cuando cada conjunto tenga exactamente la misma cantidad de elementos. Es decir, cuando los N elementos esten distribuidos entre los k conjuntos. 
Cuando eso ocurra vamos a tener que Ni = N / k
Entonces,
I = ln2(N) - ∑N/k*ln2(N / k))
= ln2(N) - ∑N/k*[ln2(N) - ln2 (k))]
= ln2(N) - [ln2(N) - ln2 (k))]
= ln2(N) - ln2(N) + ln2 (k))
=ln2(k)
es decir, a la cantidad de bits necesarios para representar a todos los conjuntos

Todo esto con respecto a la entropia, ahora vayamos a k-means.
k-means , es un algoritmo para agrupar un conjunto de datos en k subconjuntos, minimizando alguna distancia (en general, la distancia euclidea).

la funcion a minimizar es la siguiente
V = ∑ijdist(xij;ci)

donde ci es el centro del subconjunto.
Si utilizamos el error cuadratico medio, lo que vamos a estar minimizando es esperanza de la varianza intragrupos (es decir, dentro de los grupos)
Esto de encontrar grupos que tengan algun sentido (minimizen alguna distancia), parecia que tenia bastante que ver con la teoria de la informacion, asi que empezamos a pensar un poco al respecto (aca vortex y tenuki me ayudaron un poco).
Como la funcion distancia, puede ser cualquier funcion distancia, que cumpla con las condiciones de una funcion distancia, utilize la distancia discreta multiplicada por ln(Ni)
dist(xij;ci) = 0 sii xij = ci
dist(xij;ci) = ln2(Ni) sii xij != ci

como ninguno de los Ni elementos es ci,  (si alguno fuese, multiplicamos y dividimos la distancia por algun valor, y el problema se resuelve), entonces,
∑dist(xij;ci) = Ni*ln(Ni)
reemplazando en V, tenemos
V = ∑iNi*ln(Ni)

dividiendo m. a m. por N, tenemos
V / N =∑iNi*ln(Ni)/N
como Ni = pi, entonces
V / N =∑ipi*ln(Ni)
V / N = E(ln(Ni)

Que es el segundo termino de la medida de la entropia.
Por lo tanto, en el espacio metrico definido por esta funcion distancia, es equivalente minimizar la distancia, a maximizar la informacion (No hay que olvidarse que en la formula de la informacion, el segundo termino aparece restando). Y es ahi donde las dos cosas tienen algo que ver.

Pero sin embargo, este resultado no me dejo completamente contento.
Por un lado, no refleja lo que yo queria (que era mostrar la cantidad de informacion que se concentra en los ci; de hecho, estos ni siquiera se utilizan).
Ademas, quise utilizar otra funcion de distancia, como por ejemplo, la distancia de Hamming, pero no pude obtener el resultado que queria.
Espero que a alguien que lea este post se el ocurra alguna funcion distancia mas entretenida

saludos
/jb

ps: Tambien tengo que agradecer a tomas, que desde el mas alla (mas alla del meridiano de greenwich), siempre me da una mano con estas cosas

Thursday, December 13, 2007

Acoplamiento y No Convexidad

Disclaimer:
  • Este articulo tenia ganas de escribirlo hace un tiempo, pero habia un par de cosas que no me cerraban del todo, y queria esperar a que tenga el concepto cerradito y monono. Eso no paso, pero lo que si paso fue que me canse.
  • Este es un articulo computronico
Lo que queria hacer era relacionar funciones, metodos, clases,  y namespaces con conjuntos.
Supongamos que tenemos una clase que sea una estacion climatica. Esta estacion climatica tiene sensores, como por ejemplo, termometros. 
Nosotros somos consumidores exernos de informacion, y solamente nos interesa lo
 que la estacion climatica nos puede ofrecer.




La imagen anterior vendria a ser una representacion de nuestro mundo.
A travez de los metodos, se producen relaciones entre los objetos.
Por ejemplo, si el consumidor externo quiere saber la temperatura, le pregunta a la estacion climatica la temperatura, se produce una relacion entre el consumidor y la estacion climatica.
Como la clase que define el consumidor tiene como variable de instancia una estacion climatica, la relacion ya esta establecida en la propia clase, por lo tanto, la relacion que genera el metodo es una relacion que va de la clase a la clase. 
A pesar de que por claridad yo dibuje las flechitas como saliendo de las clases, cuando estos nos encontramos con estos metodos, en realidad lo que ocurre es que todas las relaciones se producen dentro del conjunto que define la clase. Lo que se parece bastante al concepto de convexidad.

Por otro lado, puede ocurrir que el consumidor externo, en vez de preguntarle a la estacion climatica la temperatura, le pida su sensor de temperatura, y a la vez a este le pida la temperatura actual.
Esto es lo que vemos en este grafico:




En este caso, la relacion que generaria el metodo para obtener la informacion de la temperatura, iria mas alla de lo que define el conjunto de la clase consumidor externo (aunque volveria al consumidor externo, "salio por un rato" para buscar la temperatura).
Si trazacemos las flechas que define las relaciones producidas por este metodo, veriamos que pasa por la clase "sensor de temperatura", el cual no es conocido por el consumidor externo.
En este caso, las relaciones son relaciones no convexas, y por otro lado, este es un buen ejemplo de alto acoplamiento entre clases.
En que sentido esto no esta piola? 
Bueno, si por ejemplo cambiamos el sensor de temperatura por uno construido en el imperio, con las temperaturas medidas en grados farengein, en vez de en grados celcios, tendriamos un gran problema, ya que el consumidor externo no sabria nada sobre eso (problema que seguro estaria resuelto por la estacion climatica).

Por otro lado, hay algo interesante. A pesar de que estas tres clase estan acopladas entre si, las relaciones que producen sus metodos se mantienen dentro del conjunto definido por esas tres clases.
Si quisieramos definir un namespace que englobe esas tres clases, podriamos hacerlo, y tendriamos las caracteristicas de convexidad para ese namespace. 
Por lo que estariamos encapsulando este micromundo en ese namespace. Y maravillosamente, el minimo conjunto convexo que contiene a una serie de puntos se llama capsula convexa (o clausura convexa), por lo que el nombre de encapsulamiento parece tener aun mas sentido :)

Bueno, espero que a alguien le guste este post, a mi realmente no me gusta, pero ya no queria pensar mas en esto, y esta es la mejor manera de sacar un tema de la cabeza :)

saludos
/jb