En este post vamos a llevar a cabo un proceso de clasificación usando PCA con el ejercicio Eigenfaces, con el que ya hemos trabajado en otros artículos. Este ejercicio consiste en generar un algoritmo que permita determinar si una imagen dada pertenece o no a la cara de George Bush.
Ejercicio de clasificación usando PCA
Ya tenemos todos componentes principales de las imágenes. Estos componentes principales están alineados con la dirección de máxima varianza.
Así pues, podemos construir un clasificador fijándonos únicamente en los primeros componentes principales. La imagen que más se acerque tendrá más posibilidades de ser de la misma persona.
Nos vamos a quedar con 200 componentes principales y lo que hacemos es coger una foto y buscamos cuáles son las fotos que están más próximas a esta.
Ahora, cogemos una cara (por ejemplo, la cara 300) y la transformamos. Posteriormente, hacemos la transformación de PCA.
#Clasificación usando PCA number_of_pca_components <- 200 id_test_pic <- 380 #id test pic <- 200 id_test_pic <- 38 orig_pic <- test_matrix [id_test_pic, ] t _pic <- transform_pca [row = orig_pic) t_pic <- matrix (t_pic [1 : number_of_pca_components], nrow = 1) dim (t_pic)
1 . 200
Luego cogemos el vector transformado de las 947 imágenes rotadas y, al igual que antes, nos quedamos con los primeros 200 componentes. Acto seguido procedemos a guardarlos.
Ahora creamos un vector de distancias que nos va a decir cuál es la distancia euclídea entre la foto que estamos manejando y las nuevas fotos. Pero esto no lo hace con todas las fotos, píxel por píxel, porque tardaría muchísimo. Vamos a hacer la diferencia de los 200 primeros componentes principales:
#Clasificación usando PCA Apc <- pr_pics$x [ , 1 : number_of_pca_components] dist <- rep (NA, nrow (Apc)) for (i in 1:nrow(Apc)) { dist [i] <- sum ((t_pic-Apc [i, 1] ^ 2) } #Equivalente a: #dist <- rowSums ((t_pic [rep (1, times = nrow (pr_picssx)), ] pr_picssx) ^ 2) #El clasificador dice que la foto más parecida es esto: which.min (dist)
277
El algoritmo nos dice, por tanto, que la foto está en la posición 277.
De este modo, ha encontrado que la imagen más cercana a la segunda que aparece a continuación es la primera.
#Clasificación usando PCA plot_row_image (train_matrix [which.min (dist), ]) plot_row_image (orig_pic)
#Clasificación usando PCA paste ("La imagen es de: ", rownames (test_matrix) [id_test_pic], "el clsificador dice que es de: ", rownames (train_matrix) [which.min (dist)])
Para concluir, hagamos un pequeño resumen de lo que se buscaba con este ejercicio de clasificación usando PCA. Tenemos, por un lado, una imagen, que es la que queremos encontrar. Luego, comparamos esa imagen con el resto de las imágenes que tengamos en el dataset, por medio de la matriz de rotación. Esta comparación no la haremos fotograma a fotograma, sino que la vamos a hacer con el dominio transformado de PCA.
También hay que añadir que la comparación no se hará con todos los componentes, sino con los 200 primeros, ya que allí es donde está en su mayoría la covarianza. Nos quedamos, pues, con todos los componentes del training.
Por último, vemos cuál es el vector que tiene una distancia mínima. En este caso, el algoritmo no ha sido tan preciso porque no ha dado como resultado los mismos rostros, pero si hacemos esta comparación, por ejemplo, con el rostro de Hugo Chávez, el algoritmo es perfectamente preciso:
‘La imagen es de: other el clasificador dice que es de: other’
¿Quieres seguir aprendiendo sobre esta temática?
Recuerda que todo lo que hemos visto aquí y muchísimas cosas más puedes aprenderlas inscribiéndote en nuestro Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp, una formación intensiva de 8 meses de duración en la que adquirirás todos los conocimientos necesarios para incursionar rápidamente en el mercado laboral y seguir forjando tu futuro. ¡Anímate a impulsar tu carrera y solicita ahora más información!