Rodolfo Christian Catunta Uturunco
Juan Alonso Alcala
Me solucionaste la duda de inmediato . Gracias !!
Luis Angel José Portillo Arévalo
¿Qué es la descomposición en valores singulares?
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:
¿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 A A = np.array([[1, 2, 3], [3, 4, 5]]) # Calculando la descomposición en valores singulares U, 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:
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!
Rodolfo Christian Catunta Uturunco
Juan Alonso Alcala
Me solucionaste la duda de inmediato . Gracias !!
Luis Angel José Portillo Arévalo
María José Medina
Pedro Alejandro Montaño Herrera
Lindo código! gracias.
Nicolas Mauricio Cuadrado Avila
Gran aporte, gracias!
Benjamín Guzmán
Para entender chido la matemática detrás comparto estos recursos que me ayudaron a mí.
Clase del MIT
Notas/resume de la clase del MIT
Interpretación 1
Interpretación 2
Alfonso Andres Zapata Guzman
Lista de reproducccion del curso del mit que indicas, youtube permite colocarle subtitulos.
https://www.youtube.com/playlist?list=PLE7DDD91010BC51F8
Sinceramente yo ya estaba iniciando en la lectura de un libro de introduccion al algebra, pero con esta formacion gratuita del mit, cambie de planes.
Julián Cárdenas
Gracias excelente aporte!!
Para calcular la matriz de vuelta esta es una solución genérica usando las propiedades de las matrices
m = np.array([[1,2 ,3], [3 ,4, 5]]) U, D, V = np.linalg.svd(m) DMatrix = np.diag(D).dot(np.eye(len(U), len(V))) U.dot(DMatrix).dot(V)
Wilson Fernando Antury Torres
U, D, V = np.linalg.svd(A, full_matrices=True) print(U.shape) print(D.shape) print(V.shape) (2, 2) (2,) (3, 3) S = np.zeros((2, 3)) S[:2,:2] = np.diag(D) print(S) [[7.97638869 0. 0. ] [0. 0.61418515 0. ]] A_calc = U.dot(S).dot(V) print(A_calc) [[1. 2. 3.] [3. 4. 5.]]
Luis Raúl González Romo
Encontré este documento y me ayudo a profundizar un poco más en el tema
Valores singulares. ¿Què son?.¿Para què sirven?
Gerardo González García
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 in range( k ): matriz_vacia[ i , i ] = D[ i ]
Pueden comprobarlo haciendo el producto:
U @ matriz_vacia @ V
Rubén Cuello
Por alguna razón el profesor no realiza la demostración. Para los que no la pudieron hacer:
D = np.diag(D)
D = np.append(D,[[0],[0]],axis=1)
calc_A = U.dot(D).dot(V)
Joseph Humberto Cueva
Alguien me puede explicar que hace esta linea de código?
U, D, V = np.linalg.svd(A)
Diego Alejandro Lesmes
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
:green_heart:
Jhon Freddy Tavera Blandon
**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 SVD U, S, V = np.linalg.svd(M) # Imprimir las matrices U, S y V print("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.
Pedro Alejandro Montaño Herrera
¿Alguien tiene algún recurso o puede explicar geométricamente que son los valores singulares?
Rafael Alejandro Santos Trujillo
En esta página hay un pdf muy bueno www.ehu.eus/izaballa/Cursos/valores_singulares.pdf
Diego Alejandro Muñoz Camayo
En este link encontré la información:
Lo pongo en código por que no me deja subirlo normal
Lino Barreiro
Por qué no carga esta clase? El svd es de lo que más quería aprender
Kevin Morales
Es raro, a mi me carga con el server C. Tal vez podrías probar con otro navegador.
Rodrigo Josue Goitia Quiroga
En algunas clases pasa eso. Usualmente cambiando de servidor funciona.
Matias Alexander Ibarra Trujillo
como es posible multiplicar una matriz 2x2 con una 3x3
Ricardo Moreno
Hola Matias, eso no se puede hacer..
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!
Jorge Hernandez
Solo se pueden multiplicar matrices de igual tamaño Columna y fila
Hector F
¿Siempre es posible descomponer una matriz con este método?
Herman Castillo R
Al parecer sí, en la documentación que he revisado no existen restricciones para aplicar el método SVD
Santiago Ahumada Lozano
Recomiendo fuertemente seguir Esta serie de videos para comprender la descomposición en valores singulares.
rusbel bermúdez rivera
Dejo una imagen de mi notebook de esta clase:
rusbel bermúdez rivera
Jonathan Fernando Santana Quispillo
Que son los vectores izquierdo y derechos?
Federico Mario
Recomiendo mucho la lectura de este libro para complementar la clase. En la página 119 estan las definiciones que pedís.
Yonatan Efraín Jara Boza
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.
Mario Alexander Vargas Celis
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:
📌 ¿Para qué sirve?
🐍 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:
📌 Resumen
ComponenteSignificadoUUDirecciones principales de las filas (izquierda)Σ\SigmaImportancia relativa (energía) de cada direcciónVTV^TDirecciones principales de las columnas (derecha)
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:
magicMatrix = np.concatenate((diagonalD, columnaCeros), axis=1)
resumido seria asi:
magicMatrix = np.concatenate((np.diag(D),np.zeros((2,1))), axis=1)
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
Matrices aleatorias:
B = np.random.randint(1, 5, size=(3,4))
Descomposicion:
def SVD(A): U,D,V = np.linalg.svd(A) D = np.diag(D) if D.shape[1] != V.shape[0]: n_columns = np.abs(D.shape[0]-V.shape[0]) extend = np.zeros(( D.shape[0] , n_colums )) D = np.append(D, extend, axis=1) return U,D,V
Como pueden ver funciona bien :D
.
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)
#Forma 1 Agregar 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. ]])
#Forma 2 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 creditos de los metodos mas otras formas adicionales en este link https://www.it-swarm.dev/es/python/como-agregar-una-columna-extra-una-matriz-numpy/941160214/