La descomposición en valores singulares (SVD por sus siglas en inglés) es una herramienta matemática esencial, especialmente útil en el análisis de datos y procesamiento de imágenes. Cuando nos enfrentamos a una matriz que no es cuadrada, la SVD nos permite extraer y condensar información esencial. En esta técnica, una matriz se descompone en tres componentes: dos matrices ortogonales y una matriz diagonal.
¿Como se representa la descomposición?
Dentro de la descomposición en valores singulares, una matriz A se descompone en:
U: Una matriz ortogonal donde todos sus vectores son ortonormales. Contiene los vectores singulares izquierdos.
Σ: Una matriz diagonal que tiene en su diagonal los valores singulares de la matriz original, y fuera de la diagonal, ceros.
V^T: La transpuesta de una matriz ortogonal que alberga los vectores singulares derechos.
¿Cuál es la importancia de cada componente?
Vectores singulares (izquierdos y derechos): Son esenciales para comprender cómo se transforma la información en su representación simplificada. Los vectores singulares derechos (V) y los vectores singulares izquierdos (U) ofrecen un sistema de coordenadas para visualizar el efecto de la transformación.
Valores singulares: Estos están contenidos en la matriz diagonal Σ y determinan la influencia de los vectores singulares. Cuanto más grande es un valor singular, más impacto tiene el correspondiente vector singular en la reconstrucción de la matriz original.
¿Cómo se ejecuta la descomposición en Python?
La descomposición de matrices en valores singulares se puede realizar fácilmente en Python usando la biblioteca NumPy. Aquí se muestra un ejemplo de cómo llevarlo a cabo:
import numpy as np
# Definiendo la matriz AA = np.array([[1,2,3],[3,4,5]])# Calculando la descomposición en valores singularesU, S, Vt = np.linalg.svd(A)print("Matriz U:")print(U)print("Valores singulares:")print(S)print("Matriz V^T:")print(Vt)
¿Qué nos muestra el resultado?
Matriz U: Muestra los vectores singulares izquierdos, cada columna es un vector.
Valores singulares en S: En su forma económica, muestra solo los valores singulares no nulos.
Matriz V^T: Contiene los vectores singulares derechos en sus filas.
Aplicaciones y recomendaciones para el uso de SVD
La descomposición en valores singulares es ampliamente utilizada en diferentes áreas, tales como:
Procesamiento de imagen: Para reducir el ruido y comprimir imágenes.
Análisis de datos: En reducción dimensional o en la recomendación de sistemas para identificar patrones significativos.
Leer más y experimentar
La SVD es un concepto fundamental para los científicos de datos e ingenieros que buscan optimizar recursos al trabajar con grandes conjuntos de datos. Se recomienda explorar distintas bibliotecas y entornos de programación que proporcionan funcionalidades avanzadas para operaciones con matrices, tales como TensorFlow o SciPy, para obtener una experiencia práctica profunda.
No se quede solo en la teoría; la práctica es clave. Experimente con matrices de diferentes tamaños y observe el comportamiento de la descomposición para entender cómo sus datos pueden ser manipulados y analizados de manera más eficiente.
¡Continue explorando el mundo de las matemáticas y el álgebra lineal para mejorar sus habilidades en ciencia de datos y programación!
Al final de la clase el profesor hace mencion de una operacion entre matrices que hace que volvamos a tener la matriz original. En este caso multiplica U D V en ese orden.
Sin embargo no lo hace en codigo y a simple vista puede salirnos un error de compatibilidad de dimensiones, pues U es 2x2, D (como lo hizo el profesor) es 2x2 y V es 3x3. Y no se puede multiplicar una matriz 2x2 con una 3x3. Lo que hice y dio resultado fue aumentar una columna extra de 0's al vector D para que ahora sea de 2x3 y realice la multiplicacion y el metodo SVD queda comprobado aqui les dejo el codigo.
import numpy as np
A= np.array([[1,2,3],[3,4,5]])print(A)U,D,V= np.linalg.svd(A)magicMatrix = np.array([[D[0],0,0],[0,D[1],0]])A_calc=U.dot(magicMatrix).dot(V)
magicMatrix tendra ese cambio que mencione arriba y A_calc puede comprobarse que es igual a la matriz A original
Chevere, magicMatrix tambien se puede obtener creando una columna de ceros y concatenandola a la matriz diagonal de D:
Creamos la diagonal de D:
diagonalD = np.diag(D)
np.zeros crea una matriz rellena de ceros recibiendo como parametro el shape de la matriz, en este caso 2,1 nos da la columna de ceros que necesitamos:
columnaCeros = np.zeros((2,1))
con np.concatenate le agregamos la columna de ceros a la matriz diagonal de D:
Hice esta pequeña funcion para comprobar con matrices aleatorias la descomposicion por valores singulares. En la función verifico que las dimensiones de las matrices concuerden para realizar la operacion, y si no es asi, les agrego las columnas extras para que coincidan. La dejo aqui por si quieren practicar tambien
Descomposición de una matriz en valores singulares
La descomposición por autovectores sólo es aplicable a matrices cuadradas. El presente método permite descomponer cualquier matriz en tres matrices:
U → vectores izquierdos singulares
D → matriz diagonal de valores singulares
V → vectores derechos singulares
Estos valores se obtienen en python mediante el método:
U,D,V= np.linalg.svd(matriz)
Nota:
Podemos ve a una matriz rectangular como una subtransformación del espacio, es decir podemos condensar información de tres a dos dimensiones.
**Descomposición en valores singulares: **Tendremos una matriz con los vectores derechos singulares, Una matriz con los vectores izquierdos singulares, éstas dos son matrices ortogonales.(todos los vectores son ortonormales.), Una matriz diagonal con los valores singulares.
Hola, el siguiente código completa la matríz D para que el productos sea consistente:
import numpy as np
A= np.array([[1,2,3],[3,4,5]])U,D,V= np.linalg.svd(A)m =U.shape[1]n =V.shape[0]k =min( m , n )matriz_vacia = np.zeros(( m , n ))for i inrange( k ): matriz_vacia[ i , i ]=D[ i ]
El método single value decomposition ".svd" del modulo de algebra lineal ".linalg" de la librería numpy "np", arroja tres resulados relativos a la matriz "A", que son guardados en tres variables, respectivamente:
U → vectores izquierdos singulares
D → matriz diagonal de valores singulares
V → vectores derechos singulares
**La descomposición en valores singulares (SVD) también se puede aplicar a matrices no cuadradas. La descomposición SVD de una matriz rectangular M de tamaño m x n, donde m es el número de filas y n es el número de columnas, se puede realizar de la siguiente manera **
import numpy as np
# Definir una matriz no cuadrada
M= np.array([[1,2,3],[4,5,6]])# Calcular la descomposición SVDU,S,V= np.linalg.svd(M)# Imprimir las matrices U,S y Vprint("Matriz U:")print(U)print("Matriz S:")print(np.diag(S))print("Matriz V:")print(V)
La función np.linalg.svd() devuelve tres valores: U, S y V. La matriz U contiene los autovectores izquierdos, la matriz S es una matriz diagonal con los valores singulares en el orden descendente y la matriz V contiene los autovectores derechos.
Es importante tener en cuenta que en el caso de una matriz no cuadrada, la matriz S no será una matriz cuadrada, sino que tendrá dimensiones m x n, donde m es el número de filas de M y n es el número de columnas de M.
Se podría multiplicar una matriz de 2x3 con una de 3x2,
dando como resultado una matriz de 2x2
ó
Se podría multiplicar una matriz de 3x2 con una de 2x3,
dando como resultado una matriz de 3x3
pero no como la que mencionas porque sus dimeciones no son compatibles.
Saludos!
En el minuto 2 el profesor habla de trabajar con matrices no cuadradas, si intentas hacer el producto interno de las matrices obtendrás un error (inténtalo y lee detenidamente el error).
Bien para solucionar esto es necesario que todas las matrices tengan o la misma dimensión, o al menos dimensiones compatibles para realizar el producto interno, esto lo logramos agregando artificialmente 1 columna auxiliar con ceros a U y a V. (En este punto desconozco el fundamentado matemático que nos permita o nos de la pauta para ello, pero me recuerda a la matriz aumentada en eliminacion de gauss, si alguien tiene mas info, se agradece).
Aqui varias formas de agregar esa columna (tambien dejare como agregar un renglon como contenido extra)
#Forma1Agregar columna hstack y fila vstack
np.hstack((U,np.zeros((2,1))))array([[-0.46410668,-0.88577931,0.],[-0.88577931,0.46410668,0.]])np.vstack((U,np.zeros((1,2))))array([[-0.46410668,-0.88577931],[-0.88577931,0.46410668],[0.,0.]])
#Forma2 utilizando append
>>> a = np.array([[1,2,3],[2,3,4]])>>> a
array([[1,2,3],[2,3,4]])>>> z = np.zeros((2,1), dtype=int64)>>> z
array([[0],[0]])>>> np.append(a, z, axis=1)array([[1,2,3,0],[2,3,4,0]])
Los vectores singulares izquierdo y derecho de la matriz A por si los buscas.
Si los comparas con la descomposición de matrices cuadradas (clases anteriores) serian como los eigenvectors o vectores propios, salvo que en este caso A no es cuadrada y no se le puede hallar la determinante y por tanto A no tiene eigenvectors...
Esos vectores singulares izquierdo y derecho de la matriz A si son eigenvectors pero de A.T@A y A@A.T respectivamente.
PD. Al multiplicar una matriz por su adjunta el resultado siempre es una matriz no solo cuadrada por fin sino también simétrica, y al calcular su matriz de eigenvectors esta siempre será una mayriz ortogonal.
Recomiendo ir a la documentación en numpy.linalg.svd y a estos videos.
La Descomposición en Valores Singulares (SVD, por sus siglas en inglés: Singular Value Decomposition) es una de las herramientas más poderosas y versátiles del álgebra lineal aplicada a datos, machine learning, compresión, procesamiento de imágenes, recomendadores, y más.
🔷 ¿Qué es la descomposición SVD?
Para cualquier matriz A∈Rm×nA \in \mathbb{R}^{m \times n}, se puede descomponer como:
A=UΣVTA = U \Sigma V^T
Donde:
U∈Rm×mU \in \mathbb{R}^{m \times m}: matriz ortogonal con vectores propios de AATA A^T
Σ∈Rm×n\Sigma \in \mathbb{R}^{m \times n}: matriz diagonal rectangular con los valores singulares de AA
VT∈Rn×nV^T \in \mathbb{R}^{n \times n}: transpuesta de matriz ortogonal con vectores propios de ATAA^T A
📌 ¿Para qué sirve?
Reducción de dimensiones (PCA usa SVD)
Compresión de imágenes
Eliminación de ruido
Sistemas de recomendación (Netflix, Amazon)
Resolver sistemas sobredeterminados o mal condicionados
🐍 Ejemplo en Python con NumPy
import numpy as np
# Matriz original (puede no ser cuadrada)
A = np.array([[3, 1, 1],
[-1, 3, 1]])
# Descomposición SVD
U, S, VT = np.linalg.svd(A)
print("Matriz U:")
print(U)
print("\nValores singulares (S):")
print(S)
print("\nMatriz V transpuesta (V^T):")
print(VT)
# Para reconstruir A:
Sigma = np.zeros((U.shape[0], VT.shape[0]))
np.fill_diagonal(Sigma, S)
A_reconstructed = U @ Sigma @ VT
print("\nMatriz A reconstruida:")
print(A_reconstructed)
📊 ¿Qué representan los valores singulares?
Los elementos de Σ\Sigma (valores singulares) indican cuánta información (energía, varianza) está contenida en cada componente. Se ordenan de mayor a menor.
🎯 Reducción de Dimensión con SVD
Si solo usas los primeros kk valores singulares:
Ak=UkΣkVkTA_k = U_k \Sigma_k V_k^T
Esto da una aproximación de menor rango, ideal para:
Visualización
Compresión
Velocidad de cómputo
📌 Resumen
ComponenteSignificadoUUDirecciones principales de las filas (izquierda)Σ\SigmaImportancia relativa (energía) de cada direcciónVTV^TDirecciones principales de las columnas (derecha)