Académique Documents
Professionnel Documents
Culture Documents
Diagonalización de matrices
Estudiaremos el método de diagonalización de Jacobi, el cual es aplicable a
matrices simétricas. Como ejemplo de aplicación, se va a desarrollar el método
estadístico de análisis de componentes principales.
( )
0 = d 12 = d 21 = (s 22 − s11 ) senα cos α + s12 cos 2 α − sen 2α .
6-1
1
tan (2α ) = ,
θ
s 22 − s11 2tanα
siendo θ = . Puesto que tan (2α ) = se despeja la tangente de
2s12 1 − tan 2 α
a de la siguiente ecuación de segundo grado:
tan 2 α + 2θtanα − 1 = 0 ,
signo (θ)
tanα = .
θ + 1+ θ2
Sin embargo, lo que interesa es conocer los valores numéricos de sena y del
cosa:
1
cos α = y sen α = cos α tanα .
1 + tan 2 α
En el caso de que S sea una matriz simétrica de dimensión n×n este resultado
se puede generalizar. La matriz unitaria X se obtiene como el producto de
matrices unitarias de rotaciones planas con la estructura siguiente:
1 L 0 0 L 0 0 L 0
M O M M L M M M
0 L cos α 0 L 0 − sen α L 0
0 L 0 1 0 0 L 0
J j = M M O M M.
0 L 0 0 1 0 L 0
0 L sen α 0 L 0 cos α L 0
M L M M L M M O M
0 L 0 0 L 0 0 L 1
6-2
diagonalización con el método de Jacobi se consiga con un número prefijado
de pasos, pero esto no es así. Resulta que cada vez que un elemento se pone
a cero aplicando una matriz de rotación Jj, los valores de su misma fila y
columna se ven alterados. Así, si antes algunos de estos elementos ya eran
cero, pueden dejar de serlo al aplicar la rotación elemental. El proceso debe ser
necesariamente iterativo y después de un cierto número de pasos se consigue
transformar la matriz S en ∆, la matriz diagonal. El criterio de finalización es que
el elemento de fuera de la diagonal y con mayor valor absoluto sea menor que
un cierto valor de tolerancia prefijado. A lo largo del proceso, las matrices Jj se
van multiplicando de forma ordenada a medida que se van utilizando. De esta
forma, el producto final de todas ellas va a ser la matriz de vectores propios X:
[ [ ] ]
L J 3T J 2T J 1T SJ 1 J 2 J 3 L = ∆
(1
L J J J )S (J J J L) = ∆
42
T
3
4 434 14243
T
2
T
1 1 2 3
X T X
Si sólo se desean conocer los valores propios de S no hace falta efectuar estos
productos matriciales. Toda esta operativa se encuentra codificada en el
algoritmo que se da a continuación:
en caso contrario
d=Sqq(j)-Spp(j)
e=Spq(j)/d
6-3
fin si
1
c=
1+ t 2
s=tc
sino
t=1.0 (ángulo α de 45 grados)
1
c=
2
s=c
fin si
s
τ=
1+ c
h = t Spq(j)
a) Cambios inmediatos
Spq(j+1)=0 Lo que queremos !
Sqp(j+1)=0
Spp(j+1) = Spp(j) – h Se deja la traza
Sqq(j+1) = Sqq(j) + h invariante
Ir al paso 4)
fin si
6-4
En la metodología de ACP se ordenan los descriptores en una matriz A de
dimensión n¥m. El criterio matemático utilizado para conseguir la reducción de
dimensionalidad es tal que, para un valor prefijado de p, se retenga en ese
subespacio la máxima varianza estadística total de los datos originales. Esto
conduce a especificar una nueva serie de ejes ortogonales entre sí, los
componentes principales (CP). Cada CP es una combinación lineal de las
variables o descriptores originales. Veámoslo:
A = (a1 a2 L am ) ,
se le calcula su media
1 n
aj = ∑ aij
n i =1
∑ (a − aj ) ,
n
2
sj = ij
i =1
A → Z = (z1 z 2 L z m ) ,
a j − 1a j
aj → zj = ,
sj
siendo 1 el vector columna con n unos.
R = ZT Z .
RX = X∆ ,
donde
6-5
X = (x 1 x2 L xm ) i ∆ = Diag {λ1, λ 2 ,..., λ m } .
λi
fi = 100 m
%.
∑λ j =1
j
λ 1 ≥ λ 2 ≥ ... ≥ λ m .
El primer CP, x1, describe un eje que minimiza la suma de las distancias
euclidianas al cuadrado de todos los puntos a aquel eje. El segundo CP, x2,
está dado por la proyección ortogonal al primer CP que retenga la segunda
mayor cantidad de varianza de los datos originales; el tercer CP, x3, es un
vector ortogonal a los dos primeros que tiene el tercer puesto en la jerarquía
establecida respecto a retención de varianza, etcétera.
B = ZX .
Los últimos valores propios suelen ser muy pequeños o cero. Esto indica que
esas nuevas variables no son relevantes. En realidad esto esta asociado al
hecho de que hay variables originales de la matriz A que son redundantes
6-6
entre ellas (linealmente dependientes) y que no era necesario incluirlas en
dicha matriz para describir a los objetos.
Ejercicio desarrollado
1 2 3 4 5
1 1.000000
2 -0.103402 1.000000
3 -0.702816 0.107492 1.000000
4 -0.028112 -0.616255 0.150363 1.000000
5 0.021209 -0.627604 0.064786 0.993190 1.000000
6-7
Valores propios (número de orden, valor, porcentaje fj y porcentaje acumulado):
Nuevas coordenadas B=ZX de los átomos (éstas tienden a cero a medida que
consideramos vectores columna asociados a valores propios más pequeños):
0.8
He
0.4 H
Componente Principal 2 (34.6%)
O
0.0 N
C
B
Be
-0.4
-0.8
Li
-1.2
-1.2 -0.8 -0.4 0.0 0.4 0.8
Componente Principal 1 (50.2%)
6-8
El primer componente contiene información de las 4 últimas propiedades (ver
elementos marcados en negrita en el vector propio). Los porcentajes de
participación se obtienen elevando al cuadrado esas componentes. El segundo
componente contiene, básicamente, información de las propiedades primera y
tercera.
6-9
Programa
!--------------------------------------------------------------------
! Diagonalizacion de matrices simetricas por el metodo de Jacobi
! Esta rutina preserva la matriz de entrada
!--------------------------------------------------------------------
SUBROUTINE JACOBI(Z,X,D,n,toler)
!--------------------------------------------------------------------
! Parametros : n : Dimension de la matriz
! Z(n,n) : Matriz a diagonalizar
! X(n,n) : Matriz de vectores propios
! D(n) : Vector de valores propios
! toler : Tolerancia del proceso
!--------------------------------------------------------------------
implicit double precision (A-H,O-Z)
integer p,q
parameter (cero=0.0d0,one=1.0d0,half=.50d0)
dimension Z(n,n),X(n,n),D(n),A(n,n)
aa=A(Q,Q)-A(P,P)
if (abs(aa)>toler) then
div=a(p,q)/aa
IF (ABS(div)>toler) then
theta=half/div
t=one/(abs(theta)+dsqrt(one+theta*theta))
if (theta<cero) t=-t
else
t=div
end if
else
t=one
end if
c=one/dsqrt(one+t*t)
6-10
s=t*c
tau=s/(one+c)
h=t*a(p,q)
! Cambios de la rotacion
a(p,p)=a(p,p)-h
a(q,q)=a(q,q)+h
a(p,q)=cero
a(q,p)=cero
do k=1,n ! Cambios en filas y columnas de A
if (k/=p .and. k/=q) then
Apk=A(p,k)
Aqk=A(q,k)
A(p,k)=apk-s*(Aqk+Apk*tau)
A(q,k)=aqk+s*(Apk-Aqk*tau)
Akp=A(k,p)
Akq=A(k,q)
A(k,p)=akp-s*(Akq+Akp*tau)
A(k,q)=akq+s*(Akp-Akq*tau)
end if
Xkp=X(k,p) ! Cambios en las columnas vectores propios
Xkq=X(k,q)
X(k,p)=Xkp-s*(Xkq+Xkp*tau)
X(k,q)=Xkq+s*(Xkp-Xkq*tau)
end do
if (amax<toler) exit ! Elemento eliminado muy pequeño: acaba
END DO
6-11