2011-03-14 11 views
11

Chcę podzielić wektor (długość około 10^5) na pięć klas. Dzięki funkcji classIntervals z pakietu classInt chciałem użyć naturalnych przerw w postaci style = "jenks", ale zajmuje to zbyt dużo czasu, nawet dla znacznie mniejszego wektora, wynoszącego tylko 500. Ustawienie style = "kmeans" jest wykonywane niemal natychmiastowo.Podział na klasy: 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 

Co sprawia, że ​​algorytm Jenks jest tak wolny i czy istnieje szybszy sposób jego uruchomienia?

razie potrzeby będę poruszać dwie ostatnie części pytania do stats.stackexchange.com:

  • W jakich okolicznościach jest kmeans rozsądny substytut Jenks?
  • Czy uzasadnione jest definiowanie klas przez uruchamianie classInt w losowym 1% podzbiorze punktów danych?
+2

czytają pomoc dla funkcji. 'kmeans' używa losowego zestawu próbek jako początkowych centrów klastra. Aby uzyskać powtarzalne wyniki, ustaw nasienie za pomocą 'set.seed()' i przeczytaj o wartościach k-średnich i lokalnych vs globalnych. Jest to wspomniane w '? ClassIntervals'. –

+0

Dzięki Gavin. Znalazłem tę część wkrótce po opublikowaniu i zredagowaniu pytania. –

+0

Nie sądzę, że istnieje wiele dowodów sugerujących, że przerwy na jankesie są lepsze niż kwantyle. – hadley

Odpowiedz

6

Aby odpowiedzieć na oryginalne pytanie:

co sprawia, że ​​algorytm Jenks tak wolno, i czy istnieje szybszy sposób go uruchomić?

Rzeczywiście, tymczasem istnieje szybszy sposób, aby zastosować Jenks algorytm funkcji w pakiecie BAMMtoolssetjenksBreaks.

Należy jednak pamiętać, że trzeba ustawić liczbę przerw w inny sposób, tj jeśli ustawisz przerwy do 5 w funkcji classIntervals pakietu classInt trzeba ustawić przerwy do 6 funkcji setjenksBreaks w BAMMtools pakiet, aby uzyskać takie same wyniki.

# 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) 

Prędkość up jest ogromny, tj

> 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