Come testare un'implementazione di k-mean?


11

Disclaimer: ho pubblicato questa domanda su StackOverflow, ma ho pensato che forse fosse più adatto a questa piattaforma.

Come testate la vostra implementazione k-mean per set di dati multidimensionali?

Stavo pensando di eseguire un'implementazione già esistente (cioè Matlab) sui dati e confrontare i risultati con il mio algoritmo. Ma ciò richiederebbe che entrambi gli algoritmi funzionino più o meno allo stesso modo, e la mappatura tra i due risultati probabilmente non è un gioco da ragazzi.

Hai un'idea migliore?

Risposte:


10

Il k-mean include un componente stocastico, quindi è molto improbabile che otterrai lo stesso risultato a meno che tu non abbia esattamente la stessa implementazione e usi la stessa configurazione iniziale. Tuttavia, potresti vedere se i tuoi risultati sono in accordo con implementazioni ben note (non conosci Matlab, ma l'implementazione dell'algoritmo k-mean in R è ben spiegata, vedi Hartigan & Wong, 1979 ).

Per quanto riguarda il confronto di due serie di risultati, c'è ancora un problema con il cambio di etichetta se deve essere eseguito più volte. Ancora una volta, nel pacchetto e1071 R, esiste una funzione molto utile (; matchClasses()) che potrebbe essere utilizzata per trovare la mappatura "migliore" tra due categorie in una tabella di classificazione bidirezionale. Fondamentalmente, l'idea è quella di riorganizzare le righe in modo da massimizzare il loro accordo con le colonne, o utilizzare un approccio avido e permutare righe e colonne fino a quando la somma di sulla diagonale (accordo grezzo) è massima. Vengono forniti anche coefficienti di accordo come la statistica Kappa .

Infine, su come confrontare la tua implementazione, ci sono molti dati disponibili liberamente, oppure puoi simulare un set di dati dedicato (ad esempio, attraverso un modello di miscela finito, vedi il pacchetto MixSim ).


ciao chi, grazie per la risposta. Se lo desideri, puoi anche rispondere alla stessa domanda in SO e la accetterei anche lì. => Stackoverflow.com/questions/4280371/...
Framester

(+1) Il primo paragrafo arriva rapidamente al nocciolo della questione.
whuber

6

La mappatura tra due serie di risultati è facile da calcolare, poiché le informazioni ottenute in un test possono essere rappresentate come una serie di tre tuple: il primo componente è un punto (multidimensionale), il secondo è un'etichetta (arbitraria) del cluster fornito dall'algoritmo e il terzo è un'etichetta (arbitraria) del cluster fornita da un algoritmo di riferimento. Costruisci per kkktabella di classificazione per le coppie di etichette: se i risultati concordano, sarà un multiplo di una matrice di permutazione. Cioè, ogni riga e ogni colonna devono avere esattamente una cella diversa da zero. È un semplice controllo da programmare. È anche semplice tenere traccia delle piccole deviazioni da questo ideale indietro ai singoli punti di dati in modo da poter vedere esattamente come le due risposte differiscono se differiscono affatto. Non mi preoccuperei di calcolare le misure statistiche di accordo: o c'è un accordo perfetto (fino alla permutazione) o no, e in quest'ultimo caso è necessario rintracciare tutti i punti di disaccordo per capire come si verificano. I risultati o sono d'accordo o no; qualsiasi disaccordo, anche a un solo punto, deve essere verificato.

È possibile che si desideri utilizzare diversi tipi di set di dati per i test: (1) set di dati pubblicati con risultati k-mean pubblicati; (2) set di dati sintetici con evidenti cluster forti; (3) set di dati sintetici senza cluster evidenti. (1) è una buona disciplina da utilizzare ogni volta che scrivi un programma di matematica o statistica. (2) è facile da eseguire in molti modi, ad esempio generando alcuni punti casuali che fungono da centri di cluster e quindi generando nuvole di punti spostando casualmente i centri del cluster in quantità relativamente piccole. (3) fornisce alcuni controlli casuali che potrebbero scoprire comportamenti imprevisti; ancora una volta, questa è una buona disciplina di prova generale.

Inoltre, prendi in considerazione la creazione di set di dati che stressano l'algoritmo mentendo solo sui confini tra soluzioni estreme. Ciò richiederà creatività e una profonda comprensione del tuo algoritmo (che presumibilmente hai!). Un esempio vorrei controllare in ogni caso sarebbe insiemi di vettori di forma dove v è un vettore senza componenti di zero e i assume valori sequenziali interi 0 , 1 , 2 , ... , n - 1 . Vorrei anche controllare l'algoritmo su insiemi di vettori che formano poligoni equilateri. In entrambe le situazioni, i casi in cui n non lo èivvi0,1,2,,n1nun multiplo di è particolarmente interessante, incluso dove n è minore di k . Ciò che è comune a queste situazioni è che (a) usano tutte le dimensioni del problema, ma (b) le soluzioni corrette sono geometricamente ovvie, e (c) ci sono molteplici soluzioni corrette.knk

d2uv2dxzxz

w=z(zx)x.

ywxyxydncos(2πk/n)x+sin(2πk/n)yk0n1


(+1) I tuoi commenti sui possibili modi per generare dati sintetici pertinenti sono molto graditi.
chl

2

Un approccio "ingenuo" molto semplice sarebbe quello di utilizzare semplici dati sintetici, in quanto ogni implementazione dovrebbe tradursi negli stessi cluster.

Esempio in 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

Perché n_clusters = 4dovrebbe darti una permutazione di[30, 60, 90, 120]


0

Poiché k-mean contiene decisioni scelte casualmente (solo la parte di inizializzazione), penso che il modo migliore per provare l'algoritmo sia quello di selezionare i punti iniziali e lasciarli prima fissati nell'algoritmo e quindi scegliere un altro codice sorgente dell'algoritmo e sistemare i punti allo stesso modo. Quindi puoi confrontare per davvero i risultati.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.