6. Chapter 6: Analysis and Results 145
6.6. Model Evaluation: Structural Model Results 162
Algoritmo PCA
Para realizar la optimización matemática del algoritmo se ha tratado de profundizar en las propiedades del álgebra de matrices y en las características particulares de las matrices de este algoritmo.
8.- Optimización en el cálculo de la traspuesta de una matriz y de la matriz
de covarianza
Basándonos en la definición de transpuesta de una matriz, nos damos cuenta que el cálculo de la misma es innecesario, ya que la matriz transpuesta resulta de intercambiar filas por columnas de su matriz original. Esto se puede conseguir, de igual modo, recorriendo la matriz en el orden correcto, evitando así el cálculo de ambas, su almacenamiento y el envío a los diferentes núcleos en una posible paralelización.
56
La diferencia con la mejora anterior es sutil en el código RVC-CAL, pero requiere de una modificación de la función de la librería usada:
69 […]
70 foreachint(size=32) i in0 .. (rc-1) do
71 // 8ª Mejora: Optimización en el cálculo de la traspuesta de una matriz.
72 // matrix_dev_mean (image_IN, image_Prima, image_Prima_Transp, vector_Average_Result, rc, bands, i);
73 matrix_dev_mean (image_IN, image_Prima_Transp, vector_Average_Result, rc, bands, i);
74 end
75 […]
Otra de estas particularidades la encontramos en la simetría de la matriz de covarianza, que puede aprovecharse para conseguir una reducción muy significativa en el número de instrucciones a ejecutar en nuestro algoritmo.
Siendo la matriz de covarianza
𝑪
una matriz cuadrada simétrica de orden 𝑛 × 𝑛,resultado de multiplicar la matriz transpuesta de las desviaciones de la media 𝑨𝑻 de
orden 𝑛 × 𝑚 por su original 𝑨 de orden𝑚 × 𝑛, observamos que, por su simetría, no es
necesario el cálculo de todos y cada uno de los elementos de la matriz resultante, sino que con el cálculo de la triangular superior sería suficiente para la obtención de la matriz de covarianza. Gracias a esto, el número de instrucciones respecto de la implementación de partida se ve reducido en relación a la siguiente ecuación:
𝑛 × 𝑚 {𝑚 −𝑚 + 1
2 }[𝑖𝑛𝑠𝑡𝑟𝑢𝑐𝑐𝑖𝑜𝑛𝑒𝑠]
A modo de ejemplo, para las imágenes hiperespectrales obtenidas en quirófano, la matriz transpuesta de las desviaciones de la media 𝑨𝑻 sería de orden 826 × 780108,
por lo que el número de instrucciones se vería reducido en:
251.338.464.872.628[𝑖𝑛𝑠𝑡𝑟𝑢𝑐𝑐𝑖𝑜𝑛𝑒𝑠]
Esta mejora se ha implementado en lenguaje C en la librería hsi_analysis.c y posteriormente se ha traducido al lenguaje RVC-CAL de la siguiente manera:
1 […]
2 // matrix_mult_transp(image_Prima_Transp, image_Mult, bands,rc);
3 foreach int(size=32) x in 0 .. (bands-1) do
4 foreach int(size=32) y in x .. (bands-1) do
5 aux := 0;
6 foreach int(size=32) z in 0 .. (rc-1) do
7 aux := aux + (image_Prima_Transp [x][z] *image_Prima_Transp [y][z]); 8 end 9 if(y = x) then 10 image_Mult[x][y] := aux; 11 else 12 image_Mult[x][y] := aux; 13 image_Mult[y][x] := aux; 14 end 15 end 16 end 17 […]
Código 4.9: Optimización en el cálculo de la traspuesta de una matriz.
57
10.- Optimización en el cálculo de los Autovectores y Autovalores de la
matriz de covarianza
Otra de las optimizaciones que se ha estudiado durante el desarrollo de este TFM es la posibilidad de implementar un método de Jacobi para el cálculo de los valores y vectores propios de la matriz de covarianza. Dicha implementación se hace necesaria para adquirir independencia de librerías externas codificadas en otro lenguaje de programación -como es el caso de la función a la que se llama para el cálculo mencionado-.
Para llevar a cabo dicha implementación, se ha partido de un modelo creado en Matlab (“Numerical Methods Using MATLAB”[W8]), con este modelo, lo que se consigue
es tener una referencia independiente con la que poder validar nuestro propio método implementado en C. Una vez que hemos desarrollado el método de Jacobi en C y que tenemos un modelo de referencia independiente, se procede a realizar la comprobación de su funcionamiento. Para ello, debe cumplir la condición necesaria y suficiente dada por la igualdad:
𝑉𝐴𝑉𝑡 = 𝐷
En la que𝐴 es la matriz cuadrada y simétrica dada, 𝑉 es la matriz ortogonal de
autovectores que junto con su transpuesta 𝑉𝑡, transforman a la matriz evaluada en una
matriz diagonal 𝐷 que contiene en su diagonal principal los valores propios de la matriz
dada.
No obstante, como lo que se pretende es validar el método y no el obtener resultados aleatorios imposibles de evaluar lo que se ha hecho es invertir dicha igualdad. De esta manera, se puede establecer una matriz 𝑉 de autovectores y una matriz 𝐷 de
autovalores que cumplan los requisitos de ortogonalidad y diagonalidad respectivamente. Con esta nueva igualdad obtenemos una matriz 𝐴 cuadrada y
simétrica que se pueda usar como banco de pruebas para los autovectores obtenidos mediante ambos métodos y poder así comprobar sus resultados de forma fidedigna.
𝑉𝐷𝑉𝑡= 𝐴
En nuestro caso, para la validación hemos establecido matrices de rotación de distintas dimensiones como matrices de autovectores y matrices diagonales aleatorias de las mismas dimensiones que las anteriores como matrices de autovectores.
58
Por último, y sin entrar en detalle en la explicación del método de Jacobi, dado que el método de Jacobi es un método iterativo y aproximativo, debemos establecer un criterio de semejanza entre los resultados de ambos métodos y los valores preestablecidos. Este criterio de semejanza no sólo debe satisfacer una similitud en cuanto a sus valores sino que -por tratarse de un conjunto de vectores espaciales- también ha de satisfacer un criterio de semejanza en cuanto a su dirección. Gráficamente podemos ver la necesidad de establecer este criterio:
𝑦 𝐴 𝐷⃗⃗ 𝐶𝑟𝑖𝑡𝑒𝑟𝑖𝑜 =‖𝐷‖2 ‖𝐴‖2= (𝑎𝑥−𝑏𝑥)2+(𝑎𝑦−𝑏𝑦) 2 𝑎𝑥2+𝑎 𝑦2 [%] 𝐵 𝑥
Donde 𝐴 es el resultado teórico esperado de aplicar el método de Jacobi, 𝐵 es
el resultado obtenido de aplicar nuestra implementación y 𝐷 la distancia que los separa.
Con este criterio se puede comprobar el error cometido por ambas implementaciones del método, así como lo parecidos o distintos que son los resultados obtenidos respecto de los valores teóricos.
Dicha implementación del método de Jacobi en lenguaje C se encuentra en el apartado 8.3.2 del anexo de este tomo y codificada en la librería hsi_analysis.c usada durante el desarrollo de este proyecto.