¿Cómo se prueba una implementación de k-means?

11

Descargo de responsabilidad: publiqué esta pregunta en Stackoverflow, pero pensé que quizás esto sea más adecuado para esta plataforma.

¿Cómo prueba su propia implementación de k-means para conjuntos de datos multidimensionales?

Estaba pensando en ejecutar una implementación ya existente (es decir, Matlab) en los datos y comparar los resultados con mi algoritmo. Pero esto requeriría que ambos algoritmos funcionen más que casi lo mismo, y el mapeo entre los dos resultados probablemente no sea pan comido.

Tienes una mejor idea?

Framester
fuente

Respuestas:

10

El k-means incluye un componente estocástico, por lo que es muy poco probable que obtenga el mismo resultado a menos que tenga exactamente la misma implementación y use la misma configuración inicial. Sin embargo, podría ver si sus resultados están de acuerdo con implementaciones bien conocidas (no sé acerca de Matlab, pero la implementación del algoritmo k-means en R está bien explicada, vea Hartigan y Wong, 1979 ).

En cuanto a la comparación de dos series de resultados, todavía hay un problema con el cambio de etiqueta si se va a ejecutar varias veces. Nuevamente, en el paquete e1071 R, hay una función muy útil (; matchClasses()) que podría usarse para encontrar la 'mejor' asignación entre dos categorías en una tabla de clasificación de dos vías. Básicamente, la idea es reorganizar las filas para maximizar su acuerdo con las columnas, o utilizar un enfoque codicioso y permutar filas y columnas hasta que la suma de la diagonal (acuerdo bruto) sea máxima. También se proporcionan coeficientes de acuerdo como la estadística Kappa .

Finalmente, sobre cómo comparar su implementación, hay muchos datos disponibles de forma gratuita, o puede simular un conjunto de datos dedicado (por ejemplo, a través de un modelo de mezcla finita, consulte el paquete MixSim ).

chl
fuente
hola chi, gracias por la respuesta Cuando lo desee, también puede responder la misma pregunta en SO y yo también la aceptaría. => stackoverflow.com/questions/4280371/…
Framester
(+1) El primer párrafo llega rápidamente al meollo del asunto.
whuber
6

El mapeo entre dos conjuntos de resultados es fácil de calcular, porque la información que obtiene en una prueba se puede representar como un conjunto de tres tuplas: el primer componente es un punto (multidimensional), el segundo es una etiqueta de clúster (arbitraria) suministrado por su algoritmo, y el tercero es una etiqueta de clúster (arbitraria) suministrada por un algoritmo de referencia. Construye la por kkktabla de clasificación para los pares de etiquetas: si los resultados están de acuerdo, será un múltiplo de una matriz de permutación. Es decir, cada fila y cada columna deben tener exactamente una celda distinta de cero. Esa es una simple verificación para programar. También es sencillo rastrear pequeñas desviaciones de este ideal hasta puntos de datos individuales para que pueda ver con precisión cómo difieren las dos respuestas si es que difieren en absoluto. No me molestaría en calcular medidas estadísticas de acuerdo: o hay un acuerdo perfecto (hasta la permutación) o no lo hay, y en este último caso necesita rastrear todos los puntos de desacuerdo para comprender cómo ocurren. Los resultados están de acuerdo o no; cualquier desacuerdo, incluso en un solo punto, necesita revisión.

Es posible que desee utilizar varios tipos de conjuntos de datos para las pruebas: (1) conjuntos de datos publicados con resultados de k-means publicados; (2) conjuntos de datos sintéticos con grupos evidentes y fuertes; (3) conjuntos de datos sintéticos sin agrupamiento obvio. (1) es una buena disciplina para usar cada vez que escribe un programa de matemáticas o estadísticas. (2) es fácil de hacer de muchas maneras, como generar algunos puntos aleatorios para que sirvan como centros de grupos y luego generar nubes de puntos al desplazar aleatoriamente los centros de grupos de cantidades relativamente pequeñas. (3) proporciona algunas comprobaciones aleatorias que pueden descubrir comportamientos inesperados; de nuevo, esa es una buena disciplina de prueba general.

Además, considere crear conjuntos de datos que enfaticen el algoritmo al ubicarse solo en los límites entre soluciones extremas. Esto requerirá creatividad y una comprensión profunda de su algoritmo (¡lo que presumiblemente tiene!). Un ejemplo que me gustaría comprobar en cualquier caso sería conjuntos de vectores de la forma donde v es un vector con componentes no cero y i toma valores secuenciales integrales 0 , 1 , 2 , ... , n - 1 . También me gustaría verificar el algoritmo en conjuntos de vectores que forman polígonos equiláteros. En cualquier situación, casos donde n no esyovvyo0 0,1,2,...,norte-1norteun múltiplo de es particularmente interesante, incluso cuando n es menor que k . Lo que es común en estas situaciones es que (a) usan todas las dimensiones del problema, pero (b) las soluciones correctas son geométricamente obvias, y (c) existen múltiples soluciones correctas.knortek

re2tuv2reXzXz

w=z-(zX)X.

ywXyXyrenortecos(2πk/ /norte)X+pecado(2πk/ /norte)yk0 0norte-1

whuber
fuente
(+1) Sus comentarios sobre las posibles formas de generar datos sintéticos relevantes son muy bienvenidos.
chl
2

Un enfoque 'ingenuo' muy simple sería utilizar datos sintéticos simples, para que cada implementación dé como resultado los mismos grupos.

Ejemplo en Python con import numpy as np:

test_data = np.zeros((40000, 4))
test_data[0:10000, :] = 30.0
test_data[10000:20000, :] = 60.0
test_data[20000:30000, :] = 90.0
test_data[30000:, :] = 120.0

Porque n_clusters = 4debería darte una permutación de[30, 60, 90, 120]

Framester
fuente
0

Dado que k-means contiene decisiones que se eligen aleatoriamente (solo la parte de inicialización), creo que la mejor manera de probar su algoritmo es seleccionar los puntos iniciales y dejarlos fijados en su algoritmo primero y luego elegir otro código fuente del algoritmo y arregla los puntos de la misma manera. Entonces puedes comparar de verdad los resultados.

mariana más suave
fuente