Está en la página 1de 20

7.

01 Análisis Topológico
El análisis topológico de datos es una ciencia nueva que aplica los conceptos de topología algebraica al
análisis de datos. La topología es una rama del Álgebra que se dedica a estudiar la forma de los objetos
de forma independiente de sus características geométricas, como por ejemplo sus coordenadas. Un
ejemplo muy usado es el que compara una taza de café con una dona o rosquilla:

Desde el punto de vista de la topología una dona y una taza de café son la misma cosa, es decir que son
un “homomorfismo” ya que existe una deformación continua que permita transformar una dona en una
taza y esta transformación tiene una inversa que también es continua.

Para estudiar los datos desde el punto de vista topológico es necesario ver a los datos como un objeto
con forma y para esto es necesario definir una métrica que nos permita obtener la distancia entre dos
puntos cualesquiera de nuestro set de datos. Esta métrica puede ser cualquier distancia y es
fundamental ya que de ella depende todo el análisis que podemos hacer de nuestros datos.

Algunas métricas posibles:

- Distancia euclideana (norma l2)


- Distancia Manhattan (norma l1)
- Norma l0
- Norma l-inf
- Distancia de Malahanobis
- Distancia de edición o Levenshtein
- Distancia normalizada de compresión
- Distancia de Jaccard
- Distancia Coseno

Propiedades del Análisis Topológico

Hay tres propiedades fundamentales del análisis topológico de datos:

1. Independencia del sistema de coordenadas.


2. Invariancia a deformaciones
3. Representación compacta de los datos

En el transcurso del capítulo van a quedar más claros estos tres conceptos pero intentemos una breve
explicación preliminar.
La independencia del sistema de coordenadas establece que desde el punto de vista topológico las
coordenadas en las cuales residen los puntos no son realmente importantes sino que importa la forma
que tienen nuestros datos y para la forma lo importante es la distancia entre los puntos y no su ubicación.

La invariancia a las deformaciones establece que si aplicamos una deformación continua e inversible a
nuestros datos el resultado es topologicamente idéntico al original. Esto se denomina “homomorfismo”.
Un hexágono y un círculo son homomórficos ya que es posible aplicar una deformación continua para
pasar de uno a otro y viceversa.

La representación compacta implica que vamos a mostrar nuestros datos como un grafo en donde la
cantidad de nodos y aristas será significativamente menor a la cantidad de puntos en nuestro set de
datos. Esto se ve claramente en la equivalencia topológica entre el círculo y el hexágono. Un hexágono
está formado por 6 puntos y 6 lados y es topológicamente idéntico a un círculo que tiene infinitos puntos.

Los Datos como un Grafo

Una vez que tenemos una métrica podemos representar a los datos como un grafo en el cual cada punto
es un vértice y cada arista representa la distancia entre dos nodos. El grafo completo que tiene aristas
entre todos los nodos no resulta útil desde el punto de vista topológico por lo que debemos establecer un
criterio para decidir cuáles aristas incluir en el grafo y cuáles no. Vamos a ver dos variantes para esta
construcción.

Grafo KNN

En el grafo KNN fijamos un parámetro “k” y luego cada nodo queda ligado mediante una arista a sus “k”
vecinos más cercanos. El grado de cada nodo del grafo es entonces igual a “k”.

La siguiente función se encarga de generar el grafo en función de un set de datos X y el valor de “k”.
Para representar el grafo usaremos una matriz dispersa en la cual almacenaremos las aristas del grafo.
Es decir que si almacenamos algo de tipo:

(10,21) = 3.05

Indicamos que hay una arista del nodo 10 al nodo 21 cuyo peso es 3.05. En nuestro caso almacenamos
la distancia entre nodos como peso de la arista. Si por algún motivo quisiéramos que la arista represente
la semejanza entre los nodos entonces deberíamos convertir esa distancia en un valor de semejanza o
afinidad usando por ejemplo un gaussiano. Esto sería equivalente a la matriz de afinidad que se usa en
los algoritmos del estilo de clustering espectral. Por el momento simplemente almacenemos las
distancias.
La función auxiliar “SaveGraph” cuyo código omitimos almacena el grafo en disco guardando un archivo
csv con los nodos y otro con las aristas de forma tal que puedan importarse en Gephi para su
visualización y posterior estudio.

A continuación mostramos el grafo resultante para un subset de MNIST con 1000 nodos y diferentes
valores de “k”.

K=1
K=5
K=20

Grafo Vietoris-Rips

El complejo de Vietoris-Rips se construye en base a un parámetro ϵque es la distancia máxima para que
dos nodos sean vecinos. Es decir que cada nodo queda conectado con todos los nodos que estén a
distancia ϵo menos. Esto es equivalente a construir bolas de radio ϵalrededor de cada punto y luego
tender una arista con todos los nodos que queden comprendidos dentro de esta bola n-dimensional.
Decimos “bola” y no esfera ya que en topología la esfera solo es la superficie de una bola.

La siguiente función construye el grafo de Vietoris-Rips para un set de datos X y un cierto parámetro ϵ.
A continuación mostramos el grafo resultante para el mismo set de datos y diferentes valores de ϵ
eps=3

eps=5
eps=10

Como puede verse con diferentes valores de “k” o de ϵse obtienen grafos completamente diferentes. Hay
varias cosas que pueden estudiarse a partir de los grafos de los datos, en particular es interesante
comparar las características del grafo resultante en contraste con las características que tendría un nodo
aleatorio con igual cantidad de nodos y aristas. Por ejemplo veamos la comparación con el grafo KNN y
K=5.

Grafo KNN K=5 Grafo Aleatorio


Otra comparación interesante es estudiar la cantidad de componentes conexos en el grafo a medida que
variamos “eps” en el complejo de Vietoris-Rips y comparar esta cantidad con la cantidad de
componentes conexos en un grafo aleatorio de igual cantidad de nodos y aristas.

El plot nos muestra que MNIST no se comporta como un set de datos aleatorio, es decir que hay una
cierta estructura en los datos que hacen que los clusters que se forman con diferentes valores de epsilon
sean muy diferentes a los que se formarían con un grafo aleatorio. En concreto llegamos a tener un grafo
conexo (clusters=1) con un epsilon bastante mayor al necesario para un grafo aleatorio. Esto permite
deducir la existencia dentro de MNIST de subgrafos fuertemente localizados en donde sus miembros
están muy cercanos unos a otros pero a su vez cada uno de estos subgrafos está alejado de los otros
subgrafos. Es decir que el gráfico nos permite deducir la existencia de clases en MNIST, en otras
palabras que hay diferentes grupos o clusters de datos, en nuestro caso, por supuesto, dígitos.

Algoritmo Mapper

Mapper es un algoritmo para el análisis topológico de los datos, se basa en la creación de un grafo,
similar a los que hemos visto pero con características diferentes. El algoritmo cuenta con varios pasos el
primer paso es aplicar un filtro a los datos de forma tal que cada dato quede representado por un número
real. Se puede usar cualquier tipo de filtro siempre y cuando cada dato quede representado por un
número. A estos filtros se los llama “lentes” ya que, haciendo una analogía, equivalen a cambiar de lente
en una cámara para ver las cosas de formas diferentes.

Filtros
i-ésima Dimension
Este es el filtro más simple de todos, simplemente devolvemos la i-ésima dimensión de los datos.

Eccentricidad

El lente o filtro de eccentricidad calcula para cada punto el promedio de las distancias entre el punto y
todos los demás.

i-ésimo autovector de la matriz de distancias

La matriz de distancias del grafo es simétrica por lo tanto sus autovalores son reales y podemos calcular
el i-ésimo autovector asociado al i-ésimo autovalor como un filtro.

Centralidad

El filtro de centralidad nos devuelve para cada punto la distancia máxima a cualquier otro punto del set
de datos.
Distancia al K-Vecino más cercano

Este lente devuelve la distancia desde cada punto al k-ésimo vecino más cercano. K tiene que ser mayor
a 1 ya que con k=1 el filtro vale 0 para todos los puntos ya que el punto más cercano a cada punto es el
punto mismo con distancia cero.

Distance to Measure

Aquí medimos por cada punto el promedio de distancias entre el punto y sus k-vecinos más cercanos. Si
k=m entonces este filtro es igual el de eccentricidad.

Autovectores del Laplaciano del Grafo

Al igual que en clustering espectral podemos construir el espectro del grafo de nuestro set de datos y a
partir de allí tomar el i-ésimo autovector del espectro como resultado del filtro. Necesitamos definir un
parámetro sigma para la matriz de afinidad y el método a usar para construir el Laplaciano, que por
defecto es simplemente D-W, siendo D la matriz diagonal con el grado de cada vértice en la matriz de
afinidad W que se genera en base a un gaussiano para un cierto parámetro sigma.

Así como hemos definido estos filtros/lentes se pueden definir docenas o incluso cientos más, el único
requisito es obtener un vector de “m” valores reales correspondientes a los “m” puntos de nuestro set de
datos.

A continuación mostramos el resultado de algunos filtros sobre un set de datos muy simple
representando una dona. Los generamos de la forma:

>> scatter(donut(:,1),donut(:,2),4,LensX(donut,1),'filled');colormap(jet)
Datos Dim1 Dim2

KNNLens K=3 KNNLens K=7 KNNLens K=50

Distance to Measure K=3 DistanceToMeasure K=20 DistanceToMeasure K=200

Eccentricity Centrality EigenDistance e=1

EigenDistance e=2 EigenDistance e=3 SpectralLens i=1


Como podemos ver diferentes lentes generan un mapeo de los datos completamente diferente por lo que
es muy importante probar este algoritmo con diferentes lentes para ver cual nos da los resultados que
son más lógicos y sencillos de interpretar.

Una vez que tenemos los datos filtrados por un cierto lente el siguiente paso es cubrir los datos con un
cierto número de grupos con solapamiento en base al valor del filtro aplicado.

Cubriendo los datos

Una vez que aplicamos el filtro tenemos a nuestros datos representados por números reales. El siguiente
paso consiste en particionar los datos en “r” grupos con solapamiento. A “r” lo vamos a denominar
“resolución” y al nivel de solapamiento “s” siendo el mismo un número entre 0 y 1. Si usamos, por
ejemplo, r=20 y s=0.2 estamos indicando que queremos particionar a nuestros datos en 20 grupos con
un 20% de solapamiento entre los mismos.

Por ejemplo supongamos que tenemos los siguientes valores para un conjunto de 14 (catorce) datos

1,3,5,8,11,12,13,21,23,24,28,31,32,40

El intervalo total que tenemos es el [1,40] ahora queremos subdividir este intervalo en una cierta cantidad
de grupos con solapamiento. La siguiente función encuentra la longitud de cada uno de los intervalos en
base al rango, cantidad de intervalos y solapamiento.

Con 10 intervalos y 25% de solapamiento el segmento es de longitud 5.1613. Es decir que nuestro
primer grupo es [0,5.16] el segundo grupo empieza en 0+5.1613*(1-0.25) es decir 3.87 entonces el
segundo intervalo es: [3.87, 9.03] los diez intervalos son entonces:

[0,5.16]
[3.87,9.03]
[7.74,12.90]
[11.61,16.77]
[15.48,20.64]
[19.35,24.51]
[23.22,28.38]
[27.09,32.25]
[30.96,36.12]
[34.83,40]

En base a estos intervalos los elementos de nuestro set de datos quedan repartidos de la siguiente
forma:

[0,5.16]: {1,3,5}
[3.87,9.03]: {5,8}
[7.74,12.90]: {8,11,12}
[11.61,16.77]: {12,13}
[15.48,20.64]
[19.35,24.51]: {21,23,24}
[23.22,28.38]: {23,24,28}
[27.09,32.25]: {28,31,32}
[30.96,36.12]: {32,32}
[34.83,40]: {40}

Vamos que quedan definidos los diez grupos y que elementos de nuestros datos quedan asignados a
cada grupo. Cada grupo es una partición de nuestros datos (con reemplazo).

La siguiente fase del algoritmo es aplicar clustering dentro de cada grupo.

Fase de Clustering

En la fase de clustering vamos a aplicar dentro de cada grupo un algoritmo de clustering. Es necesario
poder detectar de forma automática el número de clusters dentro de cada grupo ya que lo
desconocemos. Puede usarse cualquier algoritmo de clustering y cualquier método para seleccionar la
cantidad de clusters. En nuestro código hemos elegido clustering jerárquico como algoritmo de
clustering. Para seleccionar la cantidad de clusters a crear hemos elegido el siguiente método:

- en cada paso clustering jerárquico une dos clusters y nos devuelve la distancia entre los mismos.
- es decir que tenemos como resultado un vector de distancias
- estas distancias las discretizamos en una cierta cantidad de buckets (sin solapamiento)
- el primer bucket vacío nos da la cantidad de clusters a usar.

El resultado es que por cada grupo de nuestros datos tenemos una cierta cantidad de clusters formados,
desde 1 hasta la cantidad de puntos en el grupo. En conjunto el resultado final es una cantidad de
clusters de puntos de nuestro set de datos. La última fase del algoritmo consiste en armar el grafo.

Construcción del grafo

Para construir el grafo final vamos a tomar a cada cluster como un nodo y vamos a conectar entre sí a
con aristas a los clusters que tengan puntos en común. Esta etapa es relativamente sencilla.
A continuación mostramos el código del algoritmo Mapper, hemos obviado la parte que genera los grafos
guardándolos en disco por claridad. En la distribución está, por supuesto, todo incluido.

Ejemplo:

Para nuestro set de datos “donut” aplicamos el filtro LensX(donut,1) que nos devuelve para cada punto la
coordenada “x”. Y usamos como resolución 10 grupos con 50% de solapamiento. Usamos 10 buckets
para discretizar los resultados de clustering jerárquico.

Este es el set de datos y los puntos coloreados de acuerdo al valor del lente:
Y el resultado luego de aplicar el algoritmo mapper con los parámetros indicados:

Los nodos fueron coloreados de acuerdo al promedio del valor del lente para los puntos dentro del
cluster.
Es sencillo ver como el algoritmo nos ha creado una representación topológica de nuestros datos,
tenemos los “bordes” de la dona representados como dos “flares” y el “loop” representado como un ciclo
dentro del grafo. Notemos que esta representación es invariante a transformaciones geométricas sobre
la dona, si la estiarmos o aplastamos un poco el resultado de Mapper será prácticamente el mismo.

Los “flares” y los “loops” son las características topológicas que nos permiten entender los datos, es de
destacar que estas estructuras no aparecen en sets de datos aleatorios. Por ejemplo podemos construir
un set de datos aleatorio de igual cantidad de puntos que nuestra dona y aplicar mapper con los mismos
parámetros.

>> r=rand(5877,2)
>> scatter(r(:,1),r(:,2),4,LensX(r,1),'filled');colormap(jet)

>> ttt=Mapper(r,20,0.5,10,LensX(r,1),1:5877,'random');

El resultado es una cadena de clusters sin estructura, aunque la ausencia de estructura es una
estructura debemos visualizar la diferencia entre un conjunto de puntos aleatorios y los puntos en
nuestra “dona”.

Veamos un ejemplo bastante divertido. Tenemos una nube de puntos que representan un elefante en 3D.

Mostramos el set de datos y coloreamos en función del valor de la tercera dimensión.


Aplicamos mapper con resolución=50 y solapamiento 0.5 el resultado es el siguiente:

Lo que vemos es una representación topológica de un elefante. En rojo aprece la trompa con los
colmillos, luego en naranja las dos orejas y la cabeza. Las patas delanteras (amarillo), luego el cuerpo
(verde) y las patas traseras y la cola. Usando diferentes valores para la resolución y solapamiento
podemos obtener diferentes representaciones.

Conclusiones

Mapper nos permite obtener una representación topológica de nuestros datos que luego podemos usar
para detectar patrones que ocurren en los datos, entender la forma de los mismos y poder en base a
observaciones detectar cosas que son muy difíciles de observar sobre los datos en crudo.
Uno de los usos más prácticos del análisis topológico es presentar diferentes visualizaciones del mismo
set de datos y poder comparar sets de datos o subsets de un mismo set entre sí aplicando los mismos
lentes y parámetros, es sorprendente la cantidad de información que podemos obtener en base a estas
herramientas.

Referencias

[Gunnar Carlson] “Topology and Data”


http://www.ams.org/journals/bull/2009-46-02/S0273-0979-09-01249-X/S0273-0979-09-01249-X.pdf

[Gurjeet Singh, Facundo Mémoli and Gunnar Carlsson] “Topological Methods for the Analysis of High
Dimensional Data Sets and 3D Object Recognition”
http://www.ayasdi.com/wp-content/uploads/2015/02/Topological_Methods_for_the_Analysis_of_High_Dim
ensional_Data_Sets_and_3D_Object_Recognition.pdf

Python Mapper: http://danifold.net/mapper/

También podría gustarte