Clase 11 knn pca lda qda y pcalda
- Slides: 15
Clase 11: knn, pca, lda, qda y pca+lda Rodrigo Assar, Ph. D LABORATORIO DE BIOINFORMÁTICA Y MATEMÁTICA DEL GENOMA - UNIVERSIDAD DE CHILE
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 2
Paquete de R • class en repositorio CRAN. • Funcion knn(): 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. LABORATORIO DE BIOINFORMÁTICA Y MATEMÁTICA DEL GENOMA - UNIVERSIDAD DE CHILE
Ejemplo data(iris) c. S <- 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], c. S[train], k = 3, prob=TRUE) table(Resknn, iris[test, 5]) Resknn setosa versicolor virginica setosa 28 0 0 0 23 1 versicolor virginica 0 1 22 LABORATORIO DE BIOINFORMÁTICA Y MATEMÁTICA DEL GENOMA - UNIVERSIDAD DE CHILE
Ejecutando print(Resknn) [1] setosa [5] setosa [9] setosa [13] setosa [17] setosa [21] setosa [25] setosa [29] versicolor [33] versicolor [37] virginica versicolor [41] versicolor … 5
Continuacion print(Resknn) attr(, "prob") [1] 1. 0000000 [5] 1. 0000000 [9] 1. 0000000 [13] 1. 0000000 [17] 1. 0000000 [21] 1. 0000000 [25] 1. 0000000 [29] 1. 0000000 [33] 1. 0000000 [37] 1. 0000000 [41] 1. 0000000 … 6
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], c. S, k = 3, prob=TRUE) table(Resknncv, iris[, 5]) Resknncv setosa versicolor virginica 50 0 47 3 0 3 47 prediccion. RFvalid LABORATORIO DE BIOINFORMÁTICA Y MATEMÁTICA DEL GENOMA - UNIVERSIDAD DE CHILE
Comparemos ambos clasificadores table(Resknncv[test], Resknn) Resknn setosa versicolor virginica 28 0 0 0 24 0 0 0 23 8
Otros clasificadores: LDA (An. Disc. Lineal), QDA, PCA+LDA Package MASS: Funciones lda(), tambien qda() para cuadratico. Iris <- data. frame(rbind(iris 3[, , 1], iris 3[, , 2], iris 3[, , 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 9
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 s 0 28 0 v 2 0 23 10
Comparemos con knn 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 s 0 28 0 v 0 0 23 11
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 12
Mirando resultados • Respecto a realidad: 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 c 23 0 1 s 0 28 0 v 1 0 22 13
Pero la gracia es reducir variables con el pca • Trabajando con las 3 primeras componentes: Iris_pca 3 <- data. frame(respca$scores[, 1: 3], Sp = rep(c("s", "c", "v"), rep(50, 3))) Reslda_pca 3=lda(Sp~. , Iris_pca 3, prior = c(1, 1, 1)/3, subset = train) Prediccioneslda_pca 3=predict(Reslda_pca 3, Iris_pca 3[t est, ])$class 14
Mirando resultados: perdemos • table(Prediccioneslda_pca 3, Iris$Sp[valid]) Prediccioneslda_pca 3 c s v c 23 0 3 s 0 28 0 v 1 0 20 table(Prediccioneslda_pca 3, Prediccioneslda_pca) Prediccioneslda_pca 3 c s v c 24 0 2 s 0 28 0 15 v 0 0 21