En este artículo 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.
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)
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)
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))
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!