Cambio de base

Un espacio vectorial \(V\) de dimension \(n\) se identifica naturalmente con \(\real^n\) o sea con el conjunto de su coordenadas sobre una base \(B\). De hecho podemos pensar a \(B\) como la base canonica de \(\real^n\), compuesta por vectores con componentes nulas sino solo una con 1 en la \(i\)-esima posición, \(i = 1,\dots,n\). En el caso \(n=3\) se tiene:

b_1           <- c(1,0,0)
cat("b_1 =", b_1,"\n")
## b_1 = 1 0 0
b_2           <- c(0,1,0)
cat("b_2 =", b_2,"\n")
## b_2 = 0 1 0
b_3           <- c(0,0,1)
cat("b_3 =", b_3,"\n")
## b_3 = 0 0 1
B_V           <- cbind(b_1,b_2,b_3)
cat("B_V =\n", fmti(B_V),"\n")
## B_V =
##      1     0     0 
##      0     1     0 
##      0     0     1 
## 

Observen que los tres vectores, escritos uno a la vez, aún por fila, se entiende que sean vectores-columna, ya que un vector-fila se escribe como traspuesto:

t(b_1)
##      [,1] [,2] [,3]
## [1,]    1    0    0

como si fuera una matriz \(1 \times 3\). Se puede también definir un vector como una matriz, y en este caso como \(3 \times 1\) con:

as.matrix(b_1)
##      [,1]
## [1,]    1
## [2,]    0
## [3,]    0

Nótese la diferencia con el mismo comando aplicado al vector transpuesto:

as.matrix(t(b_1))
##      [,1] [,2] [,3]
## [1,]    1    0    0

que se resulta una matriz \(1 \times 3\).

Suponemos ahora de definir una nueva base, y sea \(C_V\):

c_1           <- c(1,2,3)
cat("c_1 = ", c_1,"\n")
## c_1 =  1 2 3
c_2           <- c(2,3,1)
cat("c_2 = ",c_2,"\n")
## c_2 =  2 3 1
c_3           <- c(3,1,2)
cat("c_3 = ",c_3,"\n")
## c_3 =  3 1 2
C_V           <- cbind(c_1,c_2,c_3)
cat("C_V = \n", fmti(C_V),"\n")
## C_V = 
##      1     2     3 
##      2     3     1 
##      3     1     2 
## 
M_BC          <- C_V
cat("M_BC = \n", fmti(M_BC),"\n")
## M_BC = 
##      1     2     3 
##      2     3     1 
##      3     1     2 
## 

La matriz de cambio de base \(M_{BC}\) tal que \(C_V = B_V M_{BC}\) en este caso coincide con \(C_V\), ya que \(B_V\) es la matriz idéntica.

Por otro lado, la matriz \(M_{CB}\) que pasa de la base \(C_V\) a \(B_V\) resulta ser su inversa: \(M_{CB} = M_{BC}^{-1}\):

M_CB          <- solve(M_BC)
cat("M_CB = \n", fmtr(M_CB),"\n")
## M_CB = 
##  -0.2778 0.0556 0.3889 
##  0.0556 0.3889 -0.2778 
##  0.3889 -0.2778 0.0556 
## 
cat("C_V M_CB = \n", fmtr(C_V%*%M_CB),"\n")
## C_V M_CB = 
##  1.0000 -0.0000 0.0000 
##  0.0000 1.0000 0.0000 
##  0.0000 0.0000 1.0000 
## 

De hecho, el comando solve() calcula la matriz inversa.

Definimos otra matriz de cambio de base $M_{CD} y empleamo esta para construir una nueva base \(D_V\):

M_CD          <- matrix(c(1,2,3,5,4,-1,2,3,-5),nrow=3,ncol=3)
cat("M_CD = \n", fmti(M_CD),"\n")
## M_CD = 
##      1     5     2 
##      2     4     3 
##      3    -1    -5 
## 
M_CD1         <- solve(M_CD)
cat("M_CD1 = M_DC = \n", fmtr(M_CD1),"\n")
## M_CD1 = M_DC = 
##  -0.3400 0.4600 0.1400 
##  0.3800 -0.2200 0.0200 
##  -0.2800 0.3200 -0.1200 
## 
M_DC          <- M_CD1

El hecho que \(M_{CD}1 = M_{CD}^{-1}\) exista nos segura que \(M_{CD}\), en cuanto invertible, es un cambio de base. Entonces se resulta la nueva base \(D_V\):

D_V           <- C_V%*%M_CD
cat("D_V = \n", fmti(D_V),"\n")
## D_V = 
##     14    10    -7 
##     11    21     8 
##     11    17    -1 
## 
cat("d_1 = ",D_V[,1],"\n")
## d_1 =  14 11 11
cat("d_2 = ",D_V[,2],"\n")
## d_2 =  10 21 17
cat("d_3 = ",D_V[,3],"\n")
## d_3 =  -7 8 -1

Claro que se resulta

cat("D_V M_DC = C_V = \n", fmtr(D_V%*%M_DC),"\n")
## D_V M_DC = C_V = 
##  1.0000 2.0000 3.0000 
##  2.0000 3.0000 1.0000 
##  3.0000 1.0000 2.0000 
## 

correspondiente a la base \(C_V\).

Cambio de coordenadas

Si tenemos un vector \(w\) con coordenadas \(w_D\) con respecto a \(D_V\), la misma matriz \(M_{CD}\) que cambia la base de \(C_V\) a \(D_V\) proporciona las coordenadas \(w_C\) de \(w\) con respecto a \(C_V\), ya que \(w = D_V w_D = C_V M_{CD} w_D = C_V w_C\), así que \(w_C = M_{CD} w_D\). Al revés, se resulta \(v = C v_C = D_V M_{DC} v_C = D_V v_D\), así que \(v_D = M_{DC} v_C\).

v_C           <- c(2,1,2)
cat("v_C = ", v_C,"\n")
## v_C =  2 1 2
cat("M_DC = \n", fmtr(M_DC),"\n")
## M_DC = 
##  -0.3400 0.4600 0.1400 
##  0.3800 -0.2200 0.0200 
##  -0.2800 0.3200 -0.1200 
## 
v_D           <- as.vector(M_DC%*%v_C)
cat("v_D = ", v_D,"\n")
## v_D =  0.06 0.58 -0.48
w_D           <- c(5,6,7)
cat("w_D = ", w_D,"\n")
## w_D =  5 6 7
w_C           <- as.vector(M_CD%*%w_D)
cat("w_C = ", w_C,"\n")
## w_C =  49 55 -26
w_Dn          <- as.vector(M_DC%*%w_C)
cat("w_D = ", w_Dn,"\n")
## w_D =  5 6 7

Se exprime este resultado diciendo que la coordenadas de un vector son contravariantes con respecto a la matriz de cambio de base, ya que, si \(C_V = B_V M_{BC}\) \(v_C = M_{CB} v_B\), con \(M_{BC} = M_{CB}^{-1}\).

Nótese que el comando as.vector() se ha usado para que el vector no se imprimía como matriz columna.

Formas lineales

Una forma lineal es una función \(f: V \longrightarrow \real\) que respecta las combinaciones lineales. Esta se exprime por un vector-fila, ya que así su aplicación a cualquier vector se resulta en la forma vector-fila por vector-columna.

f_C           <- t(c(1,2,3))
cat("f_C = ", f_C,"\n")
## f_C =  1 2 3
cat("f_C v_C = ", f_C%*%v_C,"\n")
## f_C v_C =  10

¿Que sucede si de \(C_V\) se pasa a \(D_V\)? Claro que, como tiene que ser \(f v = f_C v_C = f_D v_D\) y por lo tanto, si \(v_D = M_{DC} v_C\) tiene que ser \(f_D = f_C M_{CD}\), de modo que resulte \(f v = f_D v_D = f_C M_{CD} M_{DC} v_C = f_C v_C\) ya que \(M_{CD} M_{DC} = I\).

Se resulta por tanto que las componentes de una forma cambian por respecto a un cambio de base en modo covariante. Efectivamente, se consigue:

#v_C
#v_D = M_DC%*%v_C
cat("f_C v_C = ", f_C%*%v_C,"\n")
## f_C v_C =  10
f_D           <- f_C %*% M_CD
cat("f_D = ", f_D,"\n")
## f_D =  14 10 -7
cat("v_D = ", v_D,"\n")
## v_D =  0.06 0.58 -0.48
cat("f_D v_D = ", f_D%*%v_D,"\n")
## f_D v_D =  10

Formas bilineales

Analogamente a una forma lineal, una forma bilineal \(Q: V\times V\longrightarrow \real\) se encuentra definida una vez que se define su valor por cualquier pareja de vectores de una base. Por consequencia, data una base \(C_V\) una forma bilineal corresponde a una matriz cuadrada \(Q_C = \{q_ij\} = \{q(b_i,b_j\}\). Su aplicación se resulta ser data para el producto matricial \(Q(v,w)=v_C' Q_C w_C\).

Q_C           <- matrix(c(3,2,3,-1,4,2,6,4,6),nrow=3,ncol=3,byrow=TRUE)
cat("Q_C = \n", fmti(Q_C),"\n")
## Q_C = 
##      3     2     3 
##     -1     4     2 
##      6     4     6 
## 
vw            <- t(v_C)%*%Q_C%*%w_C
cat("vw = Q_C(v_C,w_C) = ", vw,"\n")
## vw = Q_C(v_C,w_C) =  1193

Si se quiere calcular la matriz para otra base, por ejemplo \(B_V\), se resulta \(Q_B = M_{CB}' Q_C M_{CB}\), o sea hay que multiplicar a la derecha para la matriz del cambio de base y a la izquierda por su traspuesta:

Q_B           <- t(M_CB) %*%Q_C%*% M_CB
cat("Q_B = \n", fmtr(Q_B),"\n")
## Q_B = 
##  0.2932 0.1080 0.3117 
##  0.2747 0.3117 -0.9290 
##  -0.1327 -0.2068 0.7747 
## 

y efectivamente, si se toman los mismos vectores, pero con coordenadas con respecto a \(B_V\), se resulta:

v_B           <- as.vector(M_BC%*%v_C)
w_B           <- as.vector(M_BC%*%w_C)
vwn           <- t(v_B)%*%Q_B%*%w_B 
cat("vw = Q_B(v_B,w_B) = ", vwn)
## vw = Q_B(v_B,w_B) =  1193

Transformaciones lineales

Sabemos que una transformación lineal es una función \(T: V \longrightarrow W\), que a cada vector \(v\) asocia uno y un solo vector \(w\) conservando las combinaciones lineales. Por tanto, \(T\) está definida a penas se ha definido sobre los vectores de una base.

Sea \(T_{CD}\) representada con respecto a la base \(C_V\) de \(V\) y \(D_W\) de \(W\) para:

T_CD          <- matrix(c(1,1,2,3,1,2,-1,-1,3),nrow=3,ncol=3)
cat("T_CD = \n", fmti(T_CD),"\n")
## T_CD = 
##      1     3    -1 
##      1     1    -1 
##      2     2     3 
## 
T_CD1         <- solve(T_CD)
cat("T_CD1 = \n", fmtr(T_CD1),"\n")
## T_CD1 = 
##  -0.5000 1.1000 0.2000 
##  0.5000 -0.5000 0.0000 
##  -0.0000 -0.4000 0.2000 
## 

En este caso la transformación es invertible y por lo tanto los vectores de \(W\) correspondientes a las columnas de \(T_{CD}\) constituyen una base \(T_{CD_W} = D_W T_{CD}\). Claro que, en esta base \(T_{CD_W}\), las coordenadas del transformado \(T(v_C)\) del vector \(C_V v_C\) siguen ser \(v_C\). Por otro lado, con respecto a \(D_W\) las coordenadas serán \(v_D = M_{DT_{CD}} v_C = T_{CD} v_C\), \(M_{DT_{CD}}\) sendo la matriz de cambio de base de \(D_W\) a \(T_{CD_W}\).

Sea \(D_W\) la base de \(W\)

D_W           <- matrix(c(-1,1,1,2,0,-2,2,1,3),nrow=3,ncol=3)
cat("D_W = \n", fmti(D_W),"\n")
## D_W = 
##     -1     2     2 
##      1     0     1 
##      1    -2     3 
## 
D_W1          <- solve(D_W)
cat("D_W1 = \n", fmtr(D_W1),"\n")
## D_W1 = 
##  -0.2000 1.0000 -0.2000 
##  0.2000 0.5000 -0.3000 
##  0.2000 0.0000 0.2000 
## 

\(D_W\) es una base de \(W\) ya que, con respecto a la base canónica está representada para una matriz invertible.

Sea \(v_V\) un vector de \(V\) definido para su coordenadas \(v_C\) con respecto a \(C_V\). Las coordenadas con respecto a \(D_W\) de su transformado \(w_W = T_{CD}(v_V)\) serán entonces:

cat("v_C = ", v_C)
## v_C =  2 1 2
w_D           <- T_CD%*%v_C 
cat("w_D = ", as.vector(w_D),"\n")
## w_D =  3 1 12

Ya que \(T_{CD}\) es invertible, ¿que tal si aplicamos su inversa \(T_{CD}^{-1}\) a \(D_W\)? Es evidente que aplicando \(T_{CD}^{-1}\) a la base \(T_{CD_W}\) se debe recoger \(C_V\), o sea \(T_{CD} T_{CD}^{-1} = I\). Pero, aplicando \(T_{CD}^{-1}\) a \(D_W\) se resulta otra base de \(V\). De hecho, se resulta:

T_DC          <- T_CD1 
T_DC_V        <- D_W %*% T_DC
cat("T_DC_V = \n", fmtr(T_DC_V),"\n")
## T_DC_V = 
##  1.5000 -2.9000 0.2000 
##  -0.5000 0.7000 0.4000 
##  -1.5000 0.9000 0.8000 
## 

que no es \(C_V\), ya que estas son su coordenadas con respecto a \(V_C\).

Datos de Linnerud

lin                <- read.csv("Linnerud.csv",header=TRUE,row.names=1)
n                  <- dim(lin)[1]
p                  <- dim(lin)[2] 
cat(paste0("Tabla de Linnerud: ", n, " units, ",p, " variables. \n"), fmti(lin),"\n")
## Tabla de Linnerud: 20 units, 6 variables. 
##    191    36    50     5   162    60 
##    189    37    52     2   110    60 
##    193    38    58    12   101   101 
##    162    35    62    12   105    37 
##    189    35    46    13   155    58 
##    182    36    56     4   101    42 
##    211    38    56     8   101    38 
##    167    34    60     6   125    40 
##    176    31    74    15   200    40 
##    154    33    56    17   251   250 
##    169    34    50    17   120    38 
##    166    33    52    13   210   115 
##    154    34    64    14   215   105 
##    247    46    50     1    50    50 
##    193    36    46     6    70    31 
##    202    37    62    12   210   120 
##    176    37    54     4    60    25 
##    157    32    52    11   230    80 
##    156    33    54    15   225    73 
##    138    33    68     2   110    43 
## 
m                  <- apply(lin,2,mean);
s                  <- sqrt((n-1)/n)*apply(lin,2,sd)
stat               <- cbind(m,s^2,s)
rownames(stat)     <- colnames(lin)
colnames(stat)     <- c("mean","variance","standard deviation")
cat("Univariate statistics \n")
## Univariate statistics
stat
##          mean  variance standard deviation
## Weight 178.60  579.1400          24.065328
## Waist   35.40    9.7400           3.120897
## Pulse   56.10   49.3900           7.027802
## Pulls    9.45   26.5475           5.152427
## Squats 145.55 3718.8475          60.982354
## Jumps   70.30 2497.9100          49.979096