Este post es la PARTE-1 de dos posts. La PARTE-1 repasará la descomposición de matrices utilizando las técnicas de Singular Vector Decomposition (SVD), randomized Singular Vector Decomposition (rSVD) y Nonnegative Matrix Factorization (NMF) principalmente para la compresión de imágenes.

La PARTE-2 estudiará la eliminación del fondo de los vídeos utilizando randomized SVD y robust PCA.

Singular Vector Decomposition (ejemplo simple)

Singular Vector Decomposition (SVD) es una técnica matemática para descomponer una matriz en tres matrices separadas, cada una con propiedades especiales. En esencia, SVD transforma las variables correlacionadas en un conjunto de variables no correlacionadas.

SVD se puede utilizar para comprender mejor un conjunto de datos porque te indica el número de dimensiones importantes, así como también te puede simplificar el conjunto de datos reduciendo el número de columnas eliminando -desde el punto de vista del álgebra lineal- las que tienen dependencia lineal. Por lo tanto, SVD puede utilizarse para reducir un conjunto de datos de muchas dimensiones a un número menor de dimensiones, conservando al mismo tiempo la información importante.

Supongamos que A es una matriz con cada variable en una columna, y las observaciones en filas, entonces SVD está compuesto por:

A = U · d · VT

Donde:

  • A: matriz original (m x n)
  • U: matriz ortogonal (m × n)
  • d: matriz diagonal (n × n)
  • V: matriz ortogonal (n × n)

SVD diagram

Empecemos con un pequeño ejemplo utilizando una matriz A: 10 x 3, con 3 variables (o columnas) y 10 registros (o filas).

El siguiente código transformará la matriz A en 3 matrices (matriz diagonal: d, y las matrices u y v) de acuerdo con la descomposición del SVD y usando la función svd(). A continuación se pueden ver estas matrices:

Hay que tener en cuenta algunos aspectos de los resultados de las matrices SVD:

  • Cada fila de la matriz u se corresponde con cada fila de la matriz original.
  • Las columnas de la matriz v coinciden con las columnas de la matriz original.
  • Las columnas de la matriz u deben ser consideradas como topic_1, topic_2 y topic_3 y no coinciden directamente con las columnas originales de la matriz (feature_1, feature_2, feature_3).
  • La matriz diagonal (d) se corresponde con cada tema, y está ordenada por la importancia del tema (el primer elemento es más importante y así sucesivamente).

De acuerdo con eso, podemos poner nombres a cada columna de modo aclaratorio:

Observa la correlación entre las columnas de la matriz u:

Como ejemplo, y sólo para ver las diferencias entre las características o features (de la matriz original) y los topics, podemos replicar la matriz A en el objeto B, y luego poner ceros en la feature_3:

Ahora podemos calcular la SVD de la matriz B. Como se puede ver abajo, los valores cero son visibles sólo en la matriz diagonal, y en la matriz v, pero no en la matriz u.

Ahora podemos reconstruir la matriz B original usando las matrices u,v y d y calculando B=u·d·vT.

Ahora podemos comprobar si la matriz B original y la matriz B_ reconstruida son iguales (o casi iguales) simplemente restando las matrices. Se puede ver que las dos matrices coinciden muy bien.

También podemos calcular el RMSE de todos los valores:

Singular Vector Decomposition (ejemplo con imagen)

Ahora supongamos que queremos reducir el tamaño de una imagen comprimiéndola. ¡Podemos usar SVD para este trabajo!

En primer lugar, necesitamos instalar/cargar el paquete rsvd, que además contiene una imagen de ejemplo de un tigre que utilizaremos para nuestro propósito, las dimensiones de la imagen son en escala de grises de 1600 x 1200 (8 bits[0-255]/255).

El siguiente paso es utilizar svd() a la imagen tiger, por lo que obtenemos nuestras tres matrices: u, d, y v.

A continuación, podemos representar en una gráfica la importancia de los “topics”, recordemos que están ordenados por orden de importancia, por lo que en el lado izquierdo de la gráfica se sitúan los más importantes y el lado derecho los menos importantes:

plot of chunk matrix_decomposition_part_1-16

Para este ejemplo, seleccionaremos los 100 “topics” más importantes. Recuerde que los topics están ordenados, así que es tan sencillo como seleccionar las 100 primeras columnas de las matrices.

Así que de 1200 topics, sólo escogeremos los primeros 100 y luego reconstruiremos la imagen usando las matrices reducidas:

En esencia, estamos usando sólo la parte naranja de las matrices para reconstruir la matriz A. Ver el diagrama de abajo.

SVD diagram

Finalmente, podemos mostrar la imagen original y la imagen reducida:

plot of chunk matrix_decomposition_part_1-19

También podemos estimar el tamaño de las matriz reducida, ésta se ha reducido hasta ocupar un 9,52% de la original.

Randomized SVD (ejemplo con imagen)

En el apartado anterior, utilizamos el método SVD para comprimir las imágenes. También podemos usar el método randomized SVD (usando el paquete rsvd) que es equivalente al SVD clásico pero más rápido. Puedes echarle un vistazo en PDF para detalles del benchmark tiempos de proceso.

Una simple comparación de velocidad entre los dos métodos se muestra a continuación.

Como puedes ver, en este caso, el randomize SVD es mucho más rápida que el SVD clásico. A continuación, veremos cómo funciona rSVD, ten en cuenta que tienes que indicarle a la función el número de topics o el low-rank decomposition (el argumento k de la función) de antemano.

Comparando los resultados gráficos del SVD y rSVD, se ven similares.

plot of chunk matrix_decomposition_part_1-23

Calcularemos ahora el error (RMSE) de la descomposición en función del valor de k:

Como se puede observar a continuación, incrementando el valor de k (low-rank decomposition) disminuye el RMSE y aumenta el tamaño que ocupan en memoria las matrices:

plot of chunk matrix_decomposition_part_1-25

A continuación observaremos las diferentes imágenes resultantes de diferentes valores de k:

plot of chunk matrix_decomposition_part_1-26

Non-negative Matrix Factorization (ejemplo con imagen)

Non-negative matrix factorization (NMF) es otro método de descomposición matricial. Descompone una matriz V en dos matrices W y H:

V = W · H

Las columnas de W se llaman vectores de base y las columnas de H representan las codificaciones, que están en correspondencia uno a uno con los vectores de base de W.

Una gran diferencia con respecto al SVD es que las tres matrices no tienen elementos negativos. SDV puede tener valores negativos, en NMF no es posible tener valores negativos, los valores no negativos son más fáciles de interpretar que los valores negativos, por lo que ésta es la razón principal de la popularidad de NMF sobre SVD. En contrapartida, usando NMF no se podrá recuperar la matriz original si ésta originalmente tiene números negativos.

Puede obtener más información sobre el paquete NMF en PDF.

Hay que tener en cuenta que el NMF es computacionalmente intensivo en el cálculo y se vuelve inviable para datos masivos. Podemos ver abajo que el tiempo consumido para procesar nuestra imagen tiger es enorme, unas 900 veces más lento que rSVD.

A continuación podemos encontrar la imagen original, y las tres transformaciones utilizadas en este post con una “low-rank decomposition” de 100.

plot of chunk matrix_decomposition_part_1-29

En este post hemos visto los métodos de descomposición de matrices de SVD, rSVD y NMF aplicados a imágenes. En la PARTE-2 utilizaremos estas técnicas a videos de videovigilancia para la eliminación del fondo de los vídeos y así separar el fondo de los objetos en movimiento.

Nos vemos en el próximo post!


Session Info:

Appendix, all the code:

Share it!:

Leave a Reply

Your email address will not be published. Required fields are marked *