Alfredo Alvarez
2013-Jul-26 21:47 UTC
[R-es] variación en los resultados de k medias (Alfredo Alvarez)
Buen día, no sé si estoy utilizando bien la lista, es la primera vez. Si lo hago mal me corrigen por favor. Sobre tu comentario Pedro, muchas gracias. Lo qeu entiendo con tu sugerencia de set.seed es qeu de esa forma fijas los resultados, pero no estoy seguro si otra agrupación funcione mejor. Es decir me interesa un método de agrupación que genere la "mejor" agrupación y como los resultados de kmeans cambian, no sé cual agrupación elegir. Utilicé otros métodos de agrupación como mclust y pvclust ( http://www.statmethods.net/advstats/cluster.html) que entiendo generan la "mejor" agrupación y sobretodo no varían en los resultados. A diferencia de kmeans y pvclust, para el paquete mclust no es necesario definir de antemano el número de grupos. Sobre el control del tamaño de los grupos, me parece haber visto algo, pero ahora no lo tengo presente, si encuentro algo, lo comento. saludos. Alfredo Message-ID: <51F2382B.3080201@tid.es> Content-Type: text/plain Hola, pues con esto del kmeans ando pegándome ahora y si quieres tener los mismos resultados para los mismos datos de entrada debes darle una semilla constante en cada ejecución: set.seed(1234) Como se explica aquí: https://stat.ethz.ch/pipermail/r-help/2007-March/128671.html Lo he comprobado en muchas ejecuciones y es así. Otra posibilidad que se menciona también en las consultas que he buscado ( https://www.google.es/search?q=kmeans+not+give+same+output+different+runs) es pasarle los centroides al algoritmo, pero esto no siempre -mejor dicho, raras veces- es factible. Otra cosa es el algoritmo kmeans que elijas, y aquí lanzo también una pregunta por si alguien lo conoce: probando el kmeans estándar y el bigkmeans de biganalytics (creedme que es una pequeña maravilla que divide el tiempo de ejecución por 2 ó 3 al menos, y permite manejar objetos que no caben en memoria -usando bigmemory), dan resultados muy diferentes. Lo que más me preocupa es el tamaño de los clusters, pero no veo por ninguna parte que eso se pueda controlar. Mi conclusiónes que kmeans es utilísimo para tareas exploratorias, si tienes alguna razón para fijar el número de clusters, pero que puede resultar difícil o incluso imposible de validar, o de asegurar que se va a mantener estable. Calurosos saludos, Pedro [[alternative HTML version deleted]]
Julio Alejandro Di Rienzo
2013-Jul-27 13:01 UTC
[R-es] variación en los resultados de k medias (Alfredo Alvarez)
El propósito de kmeans es agrupar n "instancias" en k "clases". Es extremadamente eficiente computacionalmente y permite trabajar problemas grandes (o al menos puede implementarse para manejar problemas muy grandes). En la descripción del algoritmo esta muy claro que el resultado final depende de una asignación inicial de la instacias a las clases. Esa asignación puede basarse en una clasificación previa o,lo que es mas común, en una asignación aleatoria. Es por eso que kmeans no asegura encontrar la configuración óptima. La única forma de hacerlo es considerando todas las particiones posibles de n instacias en k clases. Aunque esto es posible para problemas pequeños, cualquier problema de la vida real hace computacionalmente *imposible* considerar todas las particiones posibles. Por ello k-means encuentra una partición suboptima. Sin embargo k-means en la implementación en R tiene un parámetro "nstart " que bien usado permite encontrar clasificaciones "estables". El procedimiento sería mas o menos así 1. Con nstart=1 se evaluan varios valores de k ("centers") . Por ejemplo entre 2 y 20 y se dibuja la suma de la sumas de cuadrados dentro de grupos (tot.withinss) vs k. Si llamamos Q a la suma de las sumas de cuadrados dentro de grupos, lo que esperamos es que Q sea una función decreciente de k. Lo que uno busca en el grafico es un quiebre en la forma en que Q baja (antes del quiebre baja rápidamente, despues del quiebre mas lentamente). A continuación un script para obtener el grafico de Q vs k mykmeans<-*function*(k,myData) {*kmeans*(myData,k)$tot.withinss} myk=*seq*(2,10) Q=*sapply*(myk,mykmeans,myData) *plot*(myk,Q) 2. Una vez que has encontrado el k aproximadamente óptimo, aplicas kmeans con el k elegido y con iter.max = 20, nstart = 10, La clave para la estabilidad está en *nstat*. Cuanto mayor, mayor estabilidad. La configuración resulante tiene que ser estable. Por otra parte si algunas pocas instancias cambian de grupo, para las aplicaciones donde se usa kmeans es irrelevante. Prof. Julio Di Rienzo Estadística y Biometría FCA- U.N. Córdoba IBS-RARG President http://sites.google.com/site/juliodirienzo "Biometry, the active pursuit of biological knowledge by quantitative methods." (R.A. Fisher, 1948) 2013/7/26 Alfredo Alvarez <alugal4@gmail.com>> Buen día, no sé si estoy utilizando bien la lista, es la primera vez. Si lo > hago mal me corrigen por favor. > > Sobre tu comentario Pedro, muchas gracias. Lo qeu entiendo con tu > sugerencia de set.seed es qeu de esa forma fijas los resultados, pero no > estoy seguro si otra agrupación funcione mejor. Es decir me interesa un > método de agrupación que genere la "mejor" agrupación y como los resultados > de kmeans cambian, no sé cual agrupación elegir. Utilicé otros métodos de > agrupación como mclust y pvclust ( > http://www.statmethods.net/advstats/cluster.html) que entiendo generan la > "mejor" agrupación y sobretodo no varían en los resultados. > A diferencia de kmeans y pvclust, para el paquete mclust no es necesario > definir de antemano el número de grupos. > Sobre el control del tamaño de los grupos, me parece haber visto algo, pero > ahora no lo tengo presente, si encuentro algo, lo comento. > saludos. Alfredo > > Message-ID: <51F2382B.3080201@tid.es> > Content-Type: text/plain > > Hola, pues con esto del kmeans ando pegándome ahora y si quieres tener los > mismos resultados para los mismos datos de entrada debes darle una semilla > constante en cada ejecución: > > set.seed(1234) > > > Como se explica aquí: > https://stat.ethz.ch/pipermail/r-help/2007-March/128671.html > Lo he comprobado en muchas ejecuciones y es así. Otra posibilidad que se > menciona también en las consultas que he buscado ( > https://www.google.es/search?q=kmeans+not+give+same+output+different+runs) > es pasarle los centroides al algoritmo, pero esto no siempre -mejor dicho, > raras veces- es factible. > > Otra cosa es el algoritmo kmeans que elijas, y aquí lanzo también una > pregunta por si alguien lo conoce: probando el kmeans estándar y el > bigkmeans de biganalytics (creedme que es una pequeña maravilla que divide > el tiempo de ejecución por 2 ó 3 al menos, y permite manejar objetos que no > caben en memoria -usando bigmemory), dan resultados muy diferentes. Lo que > más me preocupa es el tamaño de los clusters, pero no veo por ninguna parte > que eso se pueda controlar. > > Mi conclusiónes que kmeans es utilísimo para tareas exploratorias, si > tienes alguna razón para fijar el número de clusters, pero que puede > resultar difícil o incluso imposible de validar, o de asegurar que se va a > mantener estable. > > Calurosos saludos, > Pedro > > [[alternative HTML version deleted]] > > > _______________________________________________ > R-help-es mailing list > R-help-es@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es > >[[alternative HTML version deleted]]