Processing math: 100%

30 votos

¿Cómo se relaciona el espacio nulo con la descomposición en valores singulares?

Se dice que el espacio nulo de una matriz se puede derivar de QR o SVD. Intenté un ejemplo: A=[13121121] Estoy convencido de que QR (más precisamente, las últimas dos columnas de Q) da el espacio nulo: Q=[0.377960.682520.176430.600150.377960.364010.730340.437310.377960.591520.436290.562930.755930.227510.49510.36288] Sin embargo, ni U ni V producidos por SVD (A=UΣV) hacen que A sea cero (Probé con 3 bibliotecas: JAMA, EJML y Commons): U=[0.730390.274290.523780.031870.096030.695360.427750.66349] Σ=[4.26745001.94651] V=[0.471860.881670.881670.47186] Esto contradice a

Usando el SVD, si A=UΣV, entonces las columnas de V correspondientes a los valores singulares pequeños (es decir, las entradas diagonales pequeñas de Σ ) conforman una base para el espacio nulo.

8voto

Antoni Parellada Puntos 276

[El OP está respondido, pero me gustaría incluir un recordatorio rápido y conciso de cierta observación sobre simetrías...]


1. Espacio nulo izquierdo:

A=[13121121]

En lenguaje estadístico R,

A = matrix(c(1,1,1,2,3,2,-1,1), ncol = 2)
r = qr(A)$rank            # Rango 2
SVD.A = svd(A, nu = nrow(A)) 
SVD.A$u    # Extrayendo la matriz U de él...

U=[0.730385600.274285490.17642700.60014820.523780890.031873090.73033870.43731350.096033220.695364110.43629370.56293350.427747670.663491020.49510270.3628841]

t.U.A = t(SVD.A$u)
(left_null = t.U.A[(r + 1):nrow(t.U.A),])
           [,1]      [,2]       [,3]       [,4]
[1,] -0.1764270 0.7303387  0.4362937 -0.4951027
[2,] -0.6001482 0.4373135 -0.5629335  0.3628841

colSums(left_null) %*% A

Por lo tanto,

[α[0.17642700.73033870.43629370.4951027]+β[0.60014820.43731350.56293350.3628841]][13121121]=0

con α y β siendo escalares.


2. Espacio nulo derecho:

Definiendo la matriz B como la transpuesta de A,

B=[11123211]

B = t(A)
r = qr(B)$rank  # Naturalmente también tendrá rango 2.
SVD.B = svd(B, nv = ncol(B)) 
SVD.B$v    # Extrayendo la matriz V de él...

V=[0.730385600.274285490.17642700.60014820.523780890.031873090.73033870.43731350.096033220.695364110.43629370.56293350.427747670.663491020.49510270.3628841]

(right_null = SVD.B$v[ ,(r + 1):ncol(B)])
           [,1]       [,2]
[1,] -0.1764270 -0.6001482
[2,]  0.7303387  0.4373135
[3,]  0.4362937 -0.5629335
[4,] -0.4951027  0.3628841

B %*% rowSums(right_null)

Por lo tanto,

[11123211][α[0.17642700.73033870.43629370.4951027]+β[0.60014820.43731350.56293350.3628841]].


En Matlab:

% Null izquierdo:

A = [1 3; 1 2; 1 -1; 2 1];
rank(A);
[U,S,V] = svd(A);
left_null_A = transpose(U);
rows = (rank(A) + 1): size(left_null_A,1);
left_null_A = left_null_A(rows,:)
(left_null_A(1,:) + left_null_A(2,:)) * A

% Null derecho:

B = transpose(A);
rank(B);
[U,S,V] = svd(B);
right_null_B = transpose(V);
rows = (rank(B) + 1): size(right_null_B,1);
right_null_B(rows,:)
right_null_B = transpose(right_null_B(rows,:))
B * (right_null_B(:,1) + right_null_B(:,2))
---

En Python:

Python:

# Null izquierdo:

import numpy as np

A = np.matrix([[1,3], [1,2], [1, -1], [2,1]])
rank = np.linalg.matrix_rank(A)
U, s, V = np.linalg.svd(A, full_matrices = True)
t_U_A = np.transpose(U)
nrow = t_U_A.shape[0]
left_null_A = t_U_A[rank:nrow,:]
left_null_A
np.dot((left_null_A[0,:] + left_null_A[0,:]), A)

# Null derecho:

B = np.transpose(A)
rank = np.linalg.matrix_rank(B)
U, s, V = np.linalg.svd(B, full_matrices = True)
t_V_B = np.transpose(V)
ncols = t_V_B.shape[1]
right_null_B = t_V_B[:,rank:ncols]
right_null_B
np.dot(B, (right_null_B[:,0] + right_null_B[:,1]))

7voto

Vini Puntos 196

Para una matriz m×n, donde mn, la SVD "completa" está dada por A=UΣVt donde U es una matriz m×m, Σ es una matriz m×n y V es una matriz n×n. Has calculado la versión "económica" de la SVD donde U es m×n y S es n×n. Por lo tanto, has perdido la información sobre el espacio nulo izquierdo dada por la matriz "completa" U. La SVD completa está dada por U=[0.73040.27430.17640.60010.52380.03190.73030.43730.09600.69540.43630.56290.42770.66350.49510.3629],

Σ=[4.2674001.94650000],

V=[0.47190.88170.88170.4719]. Si necesitas los espacios nulos entonces debes usar la SVD "completa". Sin embargo, la mayoría de los problemas no requieren la SVD "completa".

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X