Clase 11: knn,pca,lda,qda y pca+lda Rodrigo Assar, PhD L A B O R A T O R I O D E B I O I N F O R M Á T I C A Y M A T E M Á T I C A D E L G E N O M A - U N I V E R S I D A D D E C H I L E
knn: k-nearest neighbour Se decide la clase de un dato segun la clase “mayoritaria cercana”: de los k datos de entrenamiento mas cercanos Cercanos: Respecto a las variables consideradas Con distancia euclideana
Paquete de R class en repositorio CRAN. Funcion knn(): References: knn(train, test, cl, k = 1, l = 0, prob = FALSE, use.all = TRUE) References: Ripley, B. D. (1996) Pattern Recognition and Neural Networks. Cambridge. Venables, W. N. and Ripley, B. D. (2002) Modern Applied Statistics with S. Fourth edition. Springer. L A B O R A T O R I O D E B I O I N F O R M Á T I C A Y M A T E M Á T I C A D E L G E N O M A - U N I V E R S I D A D D E C H I L E
Ejemplo data(iris) cS <- as.character(Sp <- iris$Species) train=sample(1:150, 75) test=setdiff(1:150,train) Resknn=knn(iris[train,1:4], iris[test,1:4], cS[train], k = 3, prob=TRUE) table(Resknn,iris[test,5]) Resknn setosa versicolor virginica setosa 28 0 0 versicolor 0 23 1 virginica 0 1 22 L A B O R A T O R I O D E B I O I N F O R M Á T I C A Y M A T E M Á T I C A D E L G E N O M A - U N I V E R S I D A D D E C H I L E
Ejecutando print(Resknn) [1] setosa setosa setosa setosa [5] setosa setosa setosa setosa [9] setosa setosa setosa setosa [13] setosa setosa setosa setosa [17] setosa setosa setosa setosa [21] setosa setosa setosa setosa [25] setosa setosa setosa setosa [29] versicolor versicolor versicolor versicolor [33] versicolor versicolor versicolor versicolor [37] virginica versicolor versicolor versicolor [41] versicolor versicolor versicolor versicolor …
Continuacion print(Resknn) attr(,"prob") [1] 1.0000000 1.0000000 1.0000000 1.0000000 [5] 1.0000000 1.0000000 1.0000000 1.0000000 [9] 1.0000000 1.0000000 1.0000000 1.0000000 [13] 1.0000000 1.0000000 1.0000000 1.0000000 [17] 1.0000000 1.0000000 1.0000000 1.0000000 [21] 1.0000000 1.0000000 1.0000000 1.0000000 [25] 1.0000000 1.0000000 1.0000000 1.0000000 [29] 1.0000000 1.0000000 1.0000000 1.0000000 [33] 1.0000000 1.0000000 1.0000000 1.0000000 [37] 1.0000000 1.0000000 1.0000000 1.0000000 [41] 1.0000000 1.0000000 1.0000000 1.0000000 …
Validando con leave-one-out Se construye tantos predictores knn como datos de entrenamiento, en cada uno una de las filas no se considera (se usa como validacion). Finalmente se constroye el predictor por mayoria. Resknncv=knn.cv(iris[,1:4], cS, k = 3, prob=TRUE) table(Resknncv,iris[,5]) Resknncv setosa versicolor virginica setosa 50 0 0 versicolor 0 47 3 virginica 0 3 47 prediccionRFvalid L A B O R A T O R I O D E B I O I N F O R M Á T I C A Y M A T E M Á T I C A D E L G E N O M A - U N I V E R S I D A D D E C H I L E
Comparemos ambos clasificadores table(Resknncv[test],Resknn) Resknn setosa versicolor virginica setosa 28 0 0 versicolor 0 24 0 virginica 0 0 23
Otros clasificadores: LDA (An.Disc.Lineal), QDA, PCA+LDA Package MASS: Funciones lda(), tambien qda() para cuadratico. Iris <- data.frame(rbind(iris3[,,1], iris3[,,2], iris3[,,3]),Sp = rep(c("s","c","v"), rep(50,3))) Reslda=lda(Sp~ ., Iris, prior = c(1,1,1)/3, subset = train) Prediccioneslda=predict(Reslda,Iris[test,])$class Resqda=qda(Sp~ ., Iris, prior = c(1,1,1)/3, subset = train) Prediccionesqda=predict(Resqda,Iris[test,])$class
Revisando resultados table(Prediccioneslda,Prediccionesqda) Prediccionesqda Prediccioneslda c s v c 22 0 2 s 0 28 0 v 0 0 23 table(Prediccioneslda,Iris$Sp[valid]) Prediccioneslda c s v c 23 0 1 s 0 28 0 v 1 0 22 table(Prediccionesqda,Iris$Sp[valid]) Prediccionesqda c s v c 22 0 0 v 2 0 23
Comparemos con knn table(resknn,Prediccioneslda) Prediccioneslda Para poder comparar, uniformamos los nombres de las clases: resknn=as.character(Resknn) resknn[resknn=="virginica"]=“v” resknn[resknn=="versicolor"]=“c” resknn[resknn=="setosa"]="s" table(resknn,Prediccionesqda) Prediccionesqda resknn c s v c 22 0 2 s 0 28 0 v 0 0 23 table(resknn,Prediccioneslda) Prediccioneslda resknn c s v c 24 0 0
PCA+LDA Transformando la matriz de datos con PCA: respca=princomp(~ ., data = iris[,1:4], cor = TRUE) Iris_pca <- data.frame(respca$scores,Sp = rep(c("s","c","v"), rep(50,3))) Aplicando lda a los nuevos datos: Reslda_pca=lda(Sp~ ., Iris_pca, prior = c(1,1,1)/3, subset = train) Prediccioneslda_pca=predict(Reslda_pca,Iris_pca[te st,])$class
Mirando resultados Respecto a realidad: Respecto a lda: table(Prediccioneslda_pca,Iris$Sp[test]) Prediccioneslda_pca c s v c 23 0 1 s 0 28 0 v 1 0 22 Respecto a lda: table(Prediccioneslda_pca,Iris$Sp[valid]) Prediccioneslda_pca c s v
Pero la gracia es reducir variables con el pca Trabajando con las 3 primeras componentes: Iris_pca3 <- data.frame(respca$scores[,1:3],Sp = rep(c("s","c","v"), rep(50,3))) Reslda_pca3=lda(Sp~ ., Iris_pca3, prior = c(1,1,1)/3, subset = train) Prediccioneslda_pca3=predict(Reslda_pca3,Iris_pca3[t est,])$class
Mirando resultados: perdemos table(Prediccioneslda_pca3,Iris$Sp[valid]) Prediccioneslda_pca3 c s v c 23 0 3 s 0 28 0 v 1 0 20 table(Prediccioneslda_pca3,Prediccioneslda_pca) Prediccioneslda_pca Prediccioneslda_pca3 c s v c 24 0 2 v 0 0 21