Clustering (k-significa, o altro) con un vincolo di dimensione minima del cluster


14

Devo raggruppare le unità in cluster per minimizzare la somma dei quadrati all'interno del gruppo (WSS), ma devo assicurarmi che i cluster contengano almeno unità. Qualche idea se una qualsiasi delle funzioni di clustering di R consenta il clustering in cluster soggetti a un vincolo di dimensione minima del cluster? kmeans () non sembra offrire un'opzione di vincolo di dimensione.m kkmk

Risposte:


5

Usa il clustering EM

Nel clustering EM, l'algoritmo perfeziona in modo iterativo un modello cluster iniziale per adattarsi ai dati e determina la probabilità che esista un punto dati in un cluster. L'algoritmo termina il processo quando il modello probabilistico si adatta ai dati. La funzione utilizzata per determinare l'adattamento è la probabilità logaritmica dei dati forniti dal modello.

Se durante il processo vengono generati cluster vuoti o se l'appartenenza di uno o più cluster scende al di sotto di una determinata soglia, i cluster con popolazioni basse vengono rieseguiti in nuovi punti e viene eseguito nuovamente l'algoritmo EM.


Grazie Marianna. Preferirei una soluzione che faccia meno affidamento su modelli parametrici (tipicamente, ingiustificabili), ma sicuramente esaminerò la questione.
Cyrus S,

4

Questo problema viene risolto in questo documento:

Bradley, PS, KP Bennett e Ayhan Demiriz. "K-cluster vincolato significa clustering." Microsoft Research, Redmond (2000) : 1-8.

Ho un'implementazione dell'algoritmo in Python.


Questo è perfetto, grazie! Ho usato il rPythonpacchetto in R per creare un'interfaccia per questa implementazione a cui ho avuto accesso dal mio script R.
Michael Ohlrogge,

@MichaelOhlrogge hai un esempio da qualche parte (github?) Sull'interfaccia che hai scritto per chiamare quel pacchetto python da R? Grazie!
Matifou,

Spiacenti, ho cercato il mio vecchio codice ma non sono riuscito a trovarlo più.
Michael Ohlrogge,

3

Penso che sarebbe solo una questione di eseguire i mezzi k come parte di un ciclo if con un test per le dimensioni dei cluster, vale a dire Conteggio n nel cluster k - ricorda anche che k significa darà risultati diversi per ogni esecuzione sugli stessi dati, quindi dovresti probabilmente eseguirlo comunque come parte di un ciclo per estrarre il risultato "migliore"


1
Grazie Alex. Tuttavia, vedo un problema con questo: cosa succede se i loop generati dalle soluzioni non soddisfano mai il vincolo? Ciò potrebbe accadere se k significa che fosse impostato per l'esecuzione senza alcun vincolo di dimensione del cluster. Mi piacerebbe una soluzione che eviti questo. (La natura dell'applicazione è tale che devo davvero assicurarmi che i cluster siano di dimensioni minime.)
Cyrus S

1

Quanto è grande il tuo set di dati? Forse potresti provare a eseguire un cluster gerarchico e quindi decidere quali cluster conservare in base al tuo dendrogramma.

Se il tuo set di dati è enorme, puoi anche combinare entrambi i metodi di clustering: un cluster iniziale non gerarchico e quindi un cluster gerarchico che utilizza i gruppi dell'analisi non gerarchica. Puoi trovare un esempio di questo approccio in Martínez-Pastor et al (2005)


Grazie Manuel. In realtà sembra una possibilità molto intrigante. Devo pensare se il partizionamento gerarchico imporrebbe determinati vincoli che impedirebbero all'algoritmo di ottenere il partizionamento ottimale del cluster direttamente sotto il vincolo dimensionale. Ma intuitivamente, vedo che potrebbe funzionare.
Cyrus S

0

Ciò può essere ottenuto modificando la fase di assegnazione del cluster (E in EM) formulandola come un problema di ottimizzazione della rete lineare a flusso di costo minimo (MCF).

Ho scritto un pacchetto Python che utilizza SimpleMinCostFlow degli strumenti di Google Operations Research, che è un'implementazione C ++ veloce. Ha un'API standard scikit-lean.

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.