2011-03-14 13 views
11

Voglio dividere un vettore (lunghezza attorno a 10^5) in cinque classi. Con la funzione classIntervals dal pacchetto classInt, volevo utilizzare le interruzioni naturali style = "jenks" ma questo richiede un tempo eccessivo, anche per un vettore molto più piccolo di soli 500. L'impostazione style = "kmeans" viene eseguita quasi istantaneamente.Partizione in classi: jenks vs kmeans

library(classInt) 

my_n <- 100 
set.seed(1) 
x <- mapply(rnorm, n = my_n, mean = (1:5) * 5) 

system.time(classIntervals(x, n = 5, style = "jenks")) 
R> system.time(classIntervals(x, n = 5, style = "jenks")) 
    user system elapsed 
    13.46 0.00 13.45 

system.time(classIntervals(x, n = 5, style = "kmeans")) 
R> system.time(classIntervals(x, n = 5, style = "kmeans")) 
    user system elapsed 
    0.02 0.00 0.02 

Ciò che rende l'algoritmo di Jenks così lento, e c'è un modo più veloce per eseguirlo?

se necessario mi muovo le ultime due parti della questione per stats.stackexchange.com:

  • In quali circostanze è Kmeans un sostituto ragionevole per Jenks?
  • È ragionevole definire le classi eseguendo classInt su un sottoinsieme casuale dell'1% dei punti di dati?
+2

Si deve leggere l'aiuto per le funzioni. 'kmeans' utilizza una serie casuale di campioni come centri di cluster iniziali. Per ottenere risultati riproducibili, imposta un seme tramite 'set.seed()' e leggi su k-means e local vs global minimi. Questo è menzionato in '? ClassIntervals'. –

+0

Grazie Gavin. Ho trovato quella parte subito dopo aver postato e modificato la domanda. –

+0

Non credo ci siano molte prove che suggeriscano che le interruzioni di jenk siano meglio dei quantili. – hadley

risposta

6

Per rispondere alla tua domanda iniziale:

Ciò che rende l'algoritmo Jenks così lento, e c'è un modo più veloce per farlo funzionare?

Infatti, nel frattempo c'è un modo più veloce per applicare l'algoritmo di Jenks, la funzione setjenksBreaks nel pacchetto BAMMtools.

tuttavia, tenere presente che è necessario impostare il numero di interruzioni diverso, cioè se impostare le pause per 5 nella funzione classIntervals del pacchetto classInt è necessario impostare le pause per 6 funzione setjenksBreaks nella BAMMtools pacchetto per ottenere gli stessi risultati.

# Install and load library 
install.packages("BAMMtools") 
library(BAMMtools) 

# Set up example data 
my_n <- 100 
set.seed(1) 
x <- mapply(rnorm, n = my_n, mean = (1:5) * 5) 

# Apply function 
getJenksBreaks(x, 6) 

La velocità di fino è enorme, vale a dire

> microbenchmark(getJenksBreaks(x, 6, subset = NULL), classIntervals(x, n = 5, style = "jenks"), unit="s", times=10) 
Unit: seconds 
             expr   min   lq  mean  median   uq   max neval cld 
     getJenksBreaks(x, 6, subset = NULL) 0.002824861 0.003038748 0.003270575 0.003145692 0.003464058 0.004263771 10 a 
classIntervals(x, n = 5, style = "jenks") 2.008109622 2.033353970 2.094278189 2.103680325 2.111840853 2.231148846 10 
Problemi correlati