Wednesday, April 3, 2013

Arboricultura: parte 1

Leí algo que había leído hace como un millón de años: los arboles de Huffman. La pregunta que responde es simple: dado un texto formado por símbolos, ¿cual es la forma de codificar cada símbolo para minimizar el tamaño final del texto codificado? Para responder esto, se arma un árbol binario, de abajo para arriba. Pensando en los tipos de árboles que se pueden generar, me intrigó uno en particular: Desde la raíz para abajo, todos los nodos tienen: una hoja y una bifurcación. (mas abajo hay dibujitos donde queda claro). Como se genera este tipo de arboles? Si \(\left\vert{\text{simbolo}_i}\right\vert > \sum_{j > i}\left\vert{\text{simbolo}_j}\right\vert\), entonces vamos a generar ese tipo de árbol. En particular, si  \(\left\vert{\text{simbolo}_i}\right\vert = 2^{n-i}\), vamos a estar observando ese tipo de árbol. O, si vemos ese tipo de árbol, podemos hacer una transformación a un texto donde los símbolos tienen esta relación de ocurrencia: existe una ley de potencia detrás. Entonces, refinando la pregunta: sirve analizar la topología del árbol de Huffman para detectar leyes de potencia? Existe la definición de distribuciones Fat-tailed , que no es la misma que Heavy-tailed. El tema es que esta definición pide que exista una ley de potencia en la cola de la distribución. No hace falta que sea en toda la distribución. Entonces, podremos detectar este tipo de distribuciones usando los árboles? No lo sé, pero creo que sí :)

Para probarlo hice lo siguiente:

  • generé muestras de tamaño \(n = 100000\) de varias distribuciones. 
  • de cada distribución tomé el histograma usando nBins (\(\approx 1000\) )
  • Usando este histograma armé el árbol de Huffman, pero solo tomando los bins con al menos una ocurrencia


Existen dos casos patológicos: la (predecible) uniforme, mostrando un árbol binario perfecto y la distribución de plank, que es un perfecto ejemplo del tipo de árbol que quería encontrar.

 

(para la uniforme utilicé solamente 10 bins porque de otra forma necesitaba hacer un gran zoom para notar la estructura).

Las distribuciones Heavy tailed muestran la estructura similar a la de Plank (sin ser tan extremo), pero ademas, hay distribuciones que tienen (en sus colas) una estructura similar a la de Plank. Dos casos que me llamaron la atención son: la Geometrica y la Poisson



Posiblemente esto esta relacionado con lo que dice (not-so)weak-pedia:
"Fat tail distributions have power law decay in the tail of the distribution, but do not necessarily follow a power law everywhere"
Puede ser que sean solo propiedades de muestra finita.

Ahora queda esta pregunta: ¿como detectar numéricamente esta estructura analizando el grafo? Sería agradable encontrar un estadístico (una variable aleatoria con una distribución de probabilidad) sobre la cual hacer test de hipótesis. No encontré nada de eso.
Probé varias medidas, pero ninguna me convence. Las que pongo acá son las siguientes:

  • el número de Strahler: mide la complejidad de las ramas. Los resultados son interesantes. Va de \(1\) a \(\lceil\log_2 \text{nBins}\rceil\). La uniforme tiene el número mas alto
  • Bifurcation Ratio (bf): En teoría hay un Teorema Central del Limite sober este estadistico y arboles aleatorios, pero los resultados no fueron para nada buenos
  • \(\psi\): Es el promedio de la distancia de los leafs al root dividido por \(\lceil\log_2 \text{nBins}\rceil\) (la cantidad de bits necesaria para representar a los leafs)
resultado para nBins = 1025

*** normal ***
bf ratio: 1.30154390424
strahler: 9
distance (psi): 1.222749 upperBound: 41.100122
*** uniform ***
bf ratio: 1.82279829545
strahler: 11
distance (psi): 1.004502 upperBound: 47.727359
*** weibull ***
bf ratio: 1.33107640276
strahler: 9
distance (psi): 1.233694 upperBound: 41.600120
*** Heavyweibull ***
bf ratio: 1.25439814815
strahler: 6
distance (psi): 1.665082 upperBound: 11.500679
*** pareto ***
bf ratio: 1.2426702689
strahler: 6
distance (psi): 1.843468 upperBound: 13.875563
*** lognormal ***
bf ratio: 1.26271929806
strahler: 6
distance (psi): 1.539683 upperBound: 19.111435
*** lognormalHeavy ***
bf ratio: 1.25248954477
strahler: 5
distance (psi): 1.705980 upperBound: 6.144518
*** vonmises ***
bf ratio: 1.34570436657
strahler: 9
distance (psi): 1.279363 upperBound: 39.300127
*** expovariate ***
bf ratio: 1.32432288929
strahler: 8
distance (psi): 1.311187 upperBound: 36.700136
*** zipf ***
bf ratio: 1.16205357143
strahler: 4
distance (psi): 2.105769 upperBound: 4.336538
*** planck ***
bf ratio: 1.09090909091
strahler: 2
distance (psi): 1.750000 upperBound: 1.522727
*** burr ***
bf ratio: 1.22805961483
strahler: 6
distance (psi): 1.878981 upperBound: 9.875796
*** cauchy ***
bf ratio: 1.29671439671
strahler: 5
distance (psi): 1.650579 upperBound: 5.287645
*** levy ***
bf ratio: 1.25
strahler: 3
distance (psi): 1.250000 upperBound: 1.277778
*** geom ***
bf ratio: 1.125
strahler: 3
distance (psi): 1.965517 upperBound: 3.006897
*** t ***
bf ratio: 1.25474980384
strahler: 6
distance (psi): 1.484777 upperBound: 15.667062
*** poisson ***
bf ratio: 1.11538461538
strahler: 3
distance (psi): 1.487500 upperBound: 1.612500
*** gamma ***
bf ratio: 1.31289744848
strahler: 8
distance (psi): 1.257250 upperBound: 33.500149

Acá va el resto de los grafos


















El proximo post, va a compartir con este solo las hormigas (espero)

[EX-POST: como los árboles de Huffman están relacionados con la entropía, y esta es una propiedad de las distribuciones, puede ocurrir que la estructura sea un invariante de las distribuciones. Esto sería muy bueno. Por ejemplo, se podría determinar la distribución (o familia de) mirando la estructura. Supongo que hay que hacer bastante trabajo para demostrar esto]


apéndice

parámetros de las funciones
  normal(0, 1), uniform(0, 1) weibull(1, 1.7) weibull(1, 0.3) (heavy) pareto(2.5)  lognormvariate(0, 1) lognormvariate(0, 2.5)(heavy) vonmises(0, 4) exponential(4) zipf(3) planck(1) burr(2, 1) cauchy() levy(c=4) geom(0.3) t(4) poisson(4) gamma(2, 2)

Sunday, February 24, 2013

La culpa no es de los floats

Sino, del que le da de comer.

Al final del ultimo post, comenté mi preocupación por la lenta convergencia, y culpe apresuradamente al uso de los objetos de tipo float. 
Haciendo cuentas noté que no había nada raro en la convergencia.

El estimador era:
\[\tilde{\pi} = 4 * \frac{\sum^n_{t=1}I(\text{punto i esta dentro de circulo})}{n}\]
Esto se puede reescribir de la siguiente forma:
\[\tilde{\pi} = 4 * \tilde{F}\], donde \[\tilde{F} = \frac{\sum^n_{t=1}I(\text{1 si punto i esta dentro de circulo})}{n}\] Sabemos que \(I(\text{1 si punto i esta dentro de circulo})\) es una variable aleatoria Bernoulli, entonces
\(\tilde{F} = \frac{Y}{n}\) donde Y es una variable Binomial con parámetros \(n\) y \(p = \pi/4\).
\[E[\tilde{\pi}] = 4 * \frac{E[Y]}{n} = 4 * \frac{\pi}{4} * n * \frac{1}{n} = \pi\]

Ahora, la varianza es lo que nos interesa.
\[\begin{aligned}Var[Y] &= np(1-p)\\
Var[\tilde{F}] &= \frac{np(1-p)}{n^2} = \frac{p(1-p)}{n} = \frac{\tilde{F}(1-\tilde{F})}{n}\\
Var[\tilde{\pi}] &= 4^2Var[\tilde{F}] = 8\frac{\tilde{F}(1-\tilde{F})}{n}
\end{aligned}\]

Ahora, quiero generar un intervalo de confianza del \(95\%\) (usando la normal, porque \(n\) es muy grande), y quiero que ese intervalo tenga un tamaño del orden de \(10^{-4}\). Teniendo la formula de la varianza del estimador, podemos calcular el \(n\) para esa precisión: \(n = 1035989708.4897318\). Acá queda claro que floats no tenía nada que ver con la falta de precision. Fue solo una cuestión de ansiedad.
De hecho, si usamos \(n=10^9\), luego de un tiempito, tenemos el siguiente resultado


\[\tilde\pi = 3.141564804\, (3.67207693157*10^{-5})\]
y con un \(\alpha = 5\%\) podemos construir el intervalo: \( [3.14149283129\; 3.14163677671]\)



Wednesday, February 20, 2013

Pi con Montecarlo


Hablando con tenuki sobre como usar montecarlo (ese pariente cercano a bootstrapping) para estimar objetos matematicos no aleatorios, me comentó que, por ejemplo, se podía estimar pi. De hecho, resultaba bastante facil hacerlo.
Imaginemos un cuadrado de lado 2, y dentro un circulo de radio 1. También pensemos en puntos que se distribuyen según una distribución uniforme dentro de ese cuadrado.
La probabilidad de que un punto esté dentro del circulo es pi/4 (la integral en el recinto definido por el circulo de f(x) = 1/area_del_cuadrado).
Una forma de estimar esta probabilidad es contando los puntos que estan dentro del circulo y dividir por n, lo que tiene como esperanza pi/4
Entonces, 4*puntos_dentro/total_puntos = pi

Es notable que la convergencia no es monotona, y puede tardar bastante en lograr buena precisión. Supongo que el uso de floats tiene algo que ver en el asuntó (en limitar la uniformidad de los puntos).


 



Friday, December 31, 2010

Generación de variables normales con una matriz de covarianzas

Este es un problema que tuve hace un tiempo, que lo solucione de otra forma (no me acuerdo como). Hace poco se me apareció esta solución, y me pareció interesante.
Nosotros tenemos una matriz de NxN de covarianzas (C). Queremos generar m samples aleatorios de N normales que respeten esa matriz de covarianzas.
Como la matriz C es real y simétrica, podemos encontrar una eigen decomposition:
C = RDR^tr
donde R es una matriz orthogonal formada por los autovectores, y D una matriz diagonal con los autovalores en la diagonal.
Por otro lado, si tenemos m realizaciones de n variables normales aleatorias independientes (con media cero) en una matriz X de mxn, la estimación de la matriz de Covarianzas sería:
C = 1/mX^trX.
Si las n variables son independientes, entonces, 1/mX^trX. va a ser una matriz diagonal, y el elemento {i,i} de la diagonal va a corresponder con la varianza de la variable i-esima.
Ahora, si generamos m realizaciones de n variables aleatorias, y cada variable aleatoria tiene media cero, y varianza igual al i-esimo autovalor, tenemos que
D = 1/mX^trX
Por lo que, si definimos a
U = XR^tr
tenemos una matriz de n variables con m realizaciones, y con matriz de covarianzas igual a
= 1/mU^trU
= 1/mRX^trXR^tr
= R( 1/mX^trX)R^tr
= RDR^tr
C = RDR^tr.

Que era lo que estábamos (bue, estaba buscando yo, no se si todos estábamos buscando eso) buscando.

Este metodo es super costoso si la matriz de covarianzas cambia siempre -por lo costoso de calcular los autovalores-, pero realmente sirve para entender por que PCA funciona. En realidad, habría que tener en cuenta los residuos, espero en algún momento del próximo año hacer un post sobre eso
Feliz año


Tuesday, February 9, 2010

Web Semantica

Esto lo pensamos con amigos hace varios años, y lo encontre por casualidad... Puede ser cualquiera, lo tendria que releer :)

Modelo


Primero definimos semántica: Una semántica para una palabra determinada es la forma en que se relaciona esta palabra con un conjunto de palabras.


En Internet existe en cada punto de la red una semántica propia para ese punto. Esta semántica esta dada por las conexiones que tiene una pagina hacia otras, por los contenidos que tiene esta pagina, por la forma en que están organizados internamente los contenidos, por las paginas que linkean a una pagina, etc. Esta semántica existe, y no podemos alterarla, así que la podemos definir como semántica f'áctica.


También existen agentes (supongamos), estos agentes tienen intereses. Estos intereses los podemos representar con el significado que le dan a distintas palabras. Entonces los agentes crean significados (son significantes), y sus significados son propios. Podemos decir que tienen una semántica subjetiva. Un ejemplo de esto seria que para algunas personas la palabra c# significa una nota (do sostenido), para otras personas significa un lenguaje de programación. Acá, implícitamente se esta armando una red entre distintas palabras para armar el significado de un símbolo (ver http://en.wikipedia.org/wiki/Semantic_networks ). La información va a ser interesante para el agente en tanto responda al orden que define en su semántica subjetiva (por construcción). Entonces, podríamos decir que para que el agente tenga una buena experiencia de navegación por Internet, la información tendría que estar organizada según su semántica.

Sabemos que el agente, cuando navega por la red, necesariamente esta moviéndose por un mundo donde la información esta organizada según la semántica fáctica, sin embargo, la navegación la hace con el mapa de la semántica subjetiva. El agente va a estar tratando de maximizar todo el tiempo la proximidad con su semántica, y eso se va ver, por ejemplo, cuando decide hacer clic en un determinado link, o cuando decide ignorarlo. Por ejemplo, si alguien va a clarín.com, la información esta organizada segundo lo que a clarín le parece, pero esta persona va a leer lo que a esta persona le parece que son noticias. Por ejemplo, si a esta persona le parece que los pozos que hay en Palermo no son noticias, no va a pedir mas información al respecto. Y si esta persona tiene un interés por las noticias internacionales, va a hacer clic directamente en la sección de internacionales.


Entonces, el problema se puede resumir a conseguir una función que mapeé de la semántica fáctica a la subjetiva (es decir, que pueda transformar el orden que tiene la información en la red, en un orden que le produce interés al agente).

Supongamos que esta función existe

Como existe esa función, vamos a aproximarla usando redes neuronales.

Estas redes van a ser tan grandes, que cada agente va a ser una simple neurona. Esta neurona va a estar relacionado con otros neuronas. La fuerza que los une va a representar lo cerca que van a estar las semánticas para algunas palabras. Incluso van a existir relaciones de segundo orden. La neurona A esta conectado con B que a la vez esta conectado con C. La fuerza con la que A esta conectado con C depende de la relación que tiene A con B y B con C. Cuando B nota que la relación A(B)C es suficientemente fuerte, puede presentar C a A, entonces se creara la relación AC. De esta forma, se va a estar creando una forma de aproximar las función de traducción semántica, usando las relaciones entre los agentes.


Esta nueva red va a tener una topología particular, y distinta de la topología fáctica y las topologías subjetivas, es decir, va a tener un significado propio, emergente de la relación entre los agentes

.



Una aplicación alternativa.


Una aplicación nueva que se le puede dar a este modelo es la enseñanza.

Una de las cosas que me parece a mi que significa enseñar, es transmitir un significado para un grupo de símbolos. (Crearle significado, o resignificarlos). Entonces, me imagino a un profesor universitario diciéndole a su grupo de alumnos: “agréguenme a su lista de contactos mandatory”. En esta situación, lo que esta haciendo el profesor es diciéndole que el va a ser el significante, el que va a cargar de significado la información que busquen los alumnos. De esta manera, el profesor puede transmitir una manera de ver el mundo a los alumnos, transmitiéndole la semántica que el supuestamente tiene.

Una aplicación similar se puede dar en un equipo de research, o en algún equipo de trabajo. Cuando empieza una persona nueva a trabajar con el equipo, el tech lead puede ofrecerse como el significante, de esta manera, cuando la persona nueva busque algo en la red, la información va a salir de los lugares a los que el tech lead acude cuando necesita información, pudiéndole transmitir ese conocimiento.

El comportamiento de esto es interesante por que, si bien el significante es definido, los símbolos a los que se les quiere dar significado van a estar ingresados por el agente final, y van a ser distintos por su subjetividad a lo que podría el significante haber pensado, lo que produce cierto significado emergente.



TODO:

Pensar sobre privacidad

Como se implementa? Simplemente indexando todo?


Un regalito




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