Reconocimiento facial con kNN

Autor: | Última modificación: 14 de noviembre de 2022 | Tiempo de Lectura: 2 minutos

En este artícuo veremos cómo hacer reconocimiento facial con kNN o k-nearest neighbor. Recrearemos un algoritmo de reconocimiento facial que nos dirá si un rostro que se muestra es el de George Bush o no. Realizaremos un clasificador con un kNN de 1.

Reconocimiento facial con kNN

Esto es equivalente a un KNN con N=1.

Reconocimiento facial con kNN

Calculemos la matriz de confianza:

#Reconocimiento facial con kNN
number_of_pca_components <- 200

result <- data.frame (real = rownames (test_matrix), pred = NA, stringsAsFactors = T
Apc <- pr_pics$x [ , 1 : number_of_pca_components]

for (id_test_pic in 1 : nrow (test_matrix)) {

orig_pic <- test_matrix [id_test_pic, ]

t_pic <- transform_pca (row_orig_pic)[ , 1 : number_of_pca_components]
t_pic <- matrix (t_pic, nrow = 1)

dist <- rowSums ((t_pic [rep (1, times = nrow (Apc)), ] -Apc) ^ 2)
result$pred [id_test_pic] <- rownames (train_matrix [which.min (dist)]
}
result$pred = as.factor (resultspred)
str(result)
Reconocimiento facial con kNN 1

Tenemos, pues, una matriz que nos dice el valor real y el valor predicho.

#Reconocimiento facial con kNN
library (caret)
confusionMatrix (data = result$pred, reference = result$real)
Reconocimiento facial con kNN 2
sum (result$real == "bush")

159

sum (result$pred == "bush")

159

#Reconocimiento facial con kNN
#Más información de como obtener esas figuras
#https://www.rdocumentation.org/packages/caret/versions/6.0-85/topics/confusionMatrix
Pra <- sum (result$real == result$pred) / nrow (result)

paste ("Accuracy:", sum (result$real == result$pred) / nrow (result))
Pr_bush <- sum (result$real == "bush") / nrow (result)
Pr_other <- sum (result$real == "other") / nrow (result)
Pd_bush <- sum (result$pred = "bush") / nrow (result)
Pd_other <- sum (result$pred = "other") / nrow (result)

Pre <- Pr_bush * Pd_bush + Pr_other * Pd other
paste ("Kappa:", (Pra - Pre) / (1 - Pre))

paste ("Sensibilidad: ", sum (result$pred == "bush" & result$real == "bush") / sum (result$real == "bush"))
paste ("Especifidad: ", sum (result$pred == "other" & result$real == "other") / sum (result$real == "other"))
paste ("Pr pred:", sum (result$pred == "bush" & result$real == "bush") / sum (result$pred == "bush"))

‘Accuracy: 0.694581280788177’

‘Kappa: 0.359050747332773’

‘Sensibilidad: 0.610062893081761’

‘Especifidad: 0.748987854251012’

‘Pr pred: 0.610062893081761’

Si cambiamos la predicción para que el kNN no sea de 1 o de 2 o 3, sino, por ejemplo, de 6, el resultado se torna más impreciso:

#Reconocimiento facial con kNN
number_of_pca_components <- 100
knn <- 6

result <- data.frame (real = rownames (test_matrix), pred = NA)
Apc <- pr_pics$x [ , 1 : number_of_pca_components]

for (id_test_pic in 1 : nrow (test_matrix)) {

orig_pic <- test_matrix [id_test_pic, ]

t_pic <- transform_pca (row = orig_pic) [ , 1 : number_of_pca_components]
t_pic <- matrix (t_pic, nrow = 1)

dist <- rowSums ((t_pic [rep (1, times = nrow (Apc)), ] -Apc) ^ 2)

knn_tags <- rownames (train_matrix) [order (dist, decreasing = F) %in% c (1 : knn)]

#most common name <- names (sort (table (knn_tags), decreasing = T)) [1]
most_common_name <- names (which.max (table (knn_tags)))

result$pred [id_test_pic] < -most_common_name
}
result$pred = as.factor (result$pred)
confusionMatrix (table (result$pred, result$real))
Reconocimiento facial con kNN 3

¿Qué sigue?

Recuerda que si quieres seguir aprendiendo sobre datos, data mining y todo lo relacionado con estas temáticas, puedes inscribirte en nuestro Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp, una formación intensiva de pocos meses en la que aprenderás todo lo necesario para incursionar en el mundo laboral IT. ¡Solicita más información!

👉 Descubre más del Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp ¡Descarga el temario!

👉 Prueba el Bootcamp Gratis por una Semana ¡Empieza ahora mismo!

👉 Conoce nuestros otros Bootcamps en Programación y Tecnología

[email protected]

¿Trabajo? Aprende a programar y consíguelo.

¡No te pierdas la próxima edición del Aprende a Programar desde Cero Full Stack Jr. Bootcamp!

 

Prepárate en 4 meses, aprende las últimas tecnologías y consigue trabajo desde ya. 

 

Solo en España hay más de 120.400 puestos tech sin cubrir, y con un sueldo 11.000€ por encima de la media nacional. ¡Es tu momento!

 

🗓️ Próxima edición: 13 de febrero

 

Reserva tu plaza descubre las becas disponibles.