Eventuali duplicati:
K-means algorithm variation with equal cluster sizeGruppo n punti in k gruppi di uguali dimensioni
EDIT: come casperOne punto a me questa domanda è un duplicato. Comunque ecco una domanda più generalizzata che copre questa: https://stats.stackexchange.com/questions/8744/clustering-procedure-where-each-cluster-has-an-equal-number-of-points
miei requisiti
In un progetto devo gruppo n punti (x, y) in k cluster di uguali dimensioni (n/k) . Dove xey sono numeri a virgola mobile, n può variare da 100 a 10000 e k può variare da 2 a 100. Anche k è noto prima dell'esecuzione dell'algoritmo.
mie sperimentazioni
ho iniziato a risolvere il problema utilizzando il http://en.wikipedia.org/wiki/K-means_clustering algoritmo, che funzionano molto bene e veloce per produrre esattamente k cluster di circa la stessa dimensione.
Ma il mio problema è questo, K-significa produrre gruppi di dimensioni approssimativamente uguali, dove ho bisogno che i cluster abbiano esattamente le stesse dimensioni (o per essere più precisi: ho bisogno che abbiano una dimensione tra il pavimento (n/k) e ceil (n/k)).
Prima di indicarmelo, sì ho provato la prima risposta qui K-means algorithm variation with equal cluster size, che suona come una buona idea.
L'idea principale è di elaborare l'array di prodotti cluster mediante K-means. Dal cluster più grande fino al più piccolo. Riduciamo le dimensioni dei cluster che hanno più di n/k membri spostando punti extra su un altro cluster più vicino. Lasciando da solo i cluster che sono già ridotti.
ecco il codice pseudo ho implementato:
n is the number of point
k is the number of cluster
m = n/k (the ideal cluster size)
c is the array of cluster after K-means
c' = c sorted by size in descending order
for each cluster i in c' where i = 1 to k - 1
n = size of cluster i - m (the number of point to move)
loop n times
find a point p in cluster i with minimal distance to a cluster j in c' where j > i
move point p from cluster i to cluster j
end loop
recalculate centroids
end for each
Il problema di questo algoritmo è che verso la fine del processo (quando vengo vicino a k), dobbiamo scegliere un j cluster c '(dove j> i perché abbiamo bisogno di lasciare da solo i cluster già elaborati), ma questo cluster j che abbiamo trovato può essere lontano dal cluster i, rompendo così il concetto di cluster.
La mia domanda
C'è un post-K significa algoritmo o un K-medie variante in grado di soddisfare le mie esigenze, o mi sbaglio fin dall'inizio e ho bisogno di trovare un altro algoritmo di clustering?
PS: Non mi interessa implementare la soluzione da solo, ma sarebbe fantastico se potessi utilizzare una libreria e idealmente in JAVA.
Come si scelgono i cluster iniziali? – mvds
Il numero di cluster e il loro centroide iniziale sono scelti da un utente (umano). –
Qual è il tuo ** criterio di ottimalità **? Non penso che usare e quindi "aggiustare" k-significa che i risultati sono la strada da percorrere. Puoi modificare k-means per assicurarti che la dimensione rimanga all'interno dei tuoi vincoli. –