La descomposición en valores singulares (SVD) de una matriz es una factorización de esa matriz en tres matrices. Tiene algunas propiedades algebraicas interesantes y proporciona importantes conocimientos teóricos y geométricos sobre la transformación lineal. También tiene varias aplicaciones importantes en la ciencia de datos. En este artículo, intentaré explicar la intuición matemática detrás de SVD y su significado geométrico.
Matemáticas detrás de SVD
La SVD de una matriz A de mxn viene dada por la fórmula:
lugar:
- tu: MXN matriz de autovectores ortonormales de
. - VT: transponer un nxn matriz que contiene los vectores propios ortonormales de A^{T}A.
- W: un nxn la matriz diagonal de los valores singulares que son las raíces cuadradas de los valores propios
.
Ejemplos
- Encuentre el SVD para la matriz A =
- Para calcular el SVD, Primero, necesitamos calcular los valores singulares encontrando los valores propios de AA^{T}.
- La ecuación característica de la matriz anterior es:
por lo que nuestros valores singulares son:
- Ahora encontramos los vectores singulares correctos, es decir. un conjunto ortonormal de exponentes de ATA. Valores propios ATA es igual a 25, 9 y 0, y como ATA es simétrico, sabemos que los vectores propios serán ortogonales.
Para
los excesos pueden reducirse a:
Un vector unitario está en la dirección de:
De manera similar, para lambda = 9, el vector propio es:
Para el tercer vector propio, podríamos usar la propiedad de que es perpendicular a v1 y v2 como:
Resuelva la ecuación anterior para generar el tercer vector propio
Ahora, calculamos U usando la fórmula u_i = frac{1}{sigma} A v_i y esto da U =
Aplicaciones
- Calcular pseudo-inverso: Una pseudo inversa o inversa de Moore-Penrose es una generalización de la matriz inversa que puede no ser invertible (como las matrices de bajo rango). Si la matriz es invertible su inversa será igual a Pseudo inversa pero existe una falsa inversa para la matriz que no es invertible. Se define por A+.
Supongamos que necesitamos calcular la falsa inversa de la matriz M:
Entonces, la SVD de M se puede dar como:
Multiplica ambos lados por M^{-1}.
Multiplica ambos lados por V:
Multiplica por W^{-1}. Como W es la matriz singular, existe una inversa de W
aumentarlo
La ecuación anterior da la pseudo-inversa.
- Solución de una Ecuación Lineal Homogénea (Mx = b): si b=0, calcule SVD y tome cualquier columna de VT en relación con un valor singular (es decir, W) igual a 0.
Dos
aumentarlo
Por la Pseudo-inversa, sabemos que
Desde allí,
- Clase, rango y espacio nulo:
- El rango de la matriz M se puede calcular a partir de SVD por el número de valores singulares distintos de cero.
- La matriz de rango M son los vectores singulares izquierdos de U correspondientes a los valores singulares distintos de cero.
- El espacio nulo de la matriz M son los vectores singulares del lado derecho de V correspondientes a los valores cero singulares.
- Problema de ajuste de curvas: La descomposición de valores singulares se puede utilizar para minimizar el error de mínimos cuadrados. Utiliza el pseudo inverso para aproximarlo.
- Además de la aplicación anterior, la descomposición en valores singulares y la pseudoinversa también se pueden utilizar en el procesamiento de señales digitales y el procesamiento de imágenes.
Implementación
- En este código, intentaremos calcular la descomposición automática de valores usando Numpy y Scipy. Calcularemos SVD y también realizaremos una pseudo-inversa. Finalmente, podemos aplicar SVD para comprimir la imagen
Python3
# Imports import numpy as np from scipy.linalg import svd """ Singular Value Decomposition """ # define a matrix X = notario público. editar ([[ 3 , 3 , 2 ], [ 2 , 3 , - 2 ]]) print (X) # perform SVD U, singular, V_transpose = svd(X) # print different components print ( "U: " ,U) print ( "Singular array" ,s) print ( "V^{T}" ,V_transpose) """ Calculate Pseudo inverse """ # inverse of singular matrix is just the reciprocal of each element singular_inv = 1.0 / singular # create m x n matrix of zeroes and put singular values in it s_inv = np.zeros(A.shape) s_inv[ 0 ][ 0 ] = inv_singular[ 0 ] s_inv[ 1 ][ 1 ] = inv_singular[ 1 ] # calculate pseudoinverse M = np.dot(np.dot(V_transpose.T,s_inv.T),U.T) print (M) """ SVD on image compression """ import numpy as np import matplotlib.pyplot as plt from skimage import data from skimage.color import rgb2gray cat = data.chelsea() plt.imshow(cat) # convert to grayscale gray_cat = rgb2gray(cat) # calculate the SVD and plot the image U,S,V_T = svd(gray_cat, full_matrices = False ) S = np.diag(S) fig, ax = plt.subplots( 5 , 2 , figsize = ( 8 , 20 )) curr_fig = 0 for r in [ 5 , 10 , 70 , 100 , 200 ]: cat_approx = tu[:, :r] @S[ 0 :r, :r] @VERMONT[:r, :] hacha[curr_fig][ 0 ].imshow( 256 - cat_approx) hacha[curr_fig][ 0 ].set_title( "k = " + str (r)) hacha[curr_fig, 0 ]. espalda ( 'off' ) hacha[curr_fig][ 1 ].set_title( "Original Image" ) hacha[curr_fig][ 1 ].imshow(gato_gris) hacha[curr_fig, 1 ]. espalda ( 'off' ) curr_fig + = 1 plt.show() |
Producción:
[[ 3 3 2] [ 2 3 -2]] --------------------------- U: [[-0.7815437 -0.6238505] [-0.6238505 0.7815437]] --------------------------- Singular array [5.54801894 2.86696457] --------------------------- V^{T} [[-0.64749817 -0.7599438 -0.05684667] [-0.10759258 0.16501062 -0.9804057 ] [-0.75443354 0.62869461 0.18860838]] -------------------------- # Inverse array([[ 0.11462451, 0.04347826], [ 0.07114625, 0.13043478], [ 0.22134387, -0.26086957]]) ---------------------------
Imagen original vs SVD k-imagen