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?
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'. –
Dzięki Gavin. Znalazłem tę część wkrótce po opublikowaniu i zredagowaniu pytania. –
Nie sądzę, że istnieje wiele dowodów sugerujących, że przerwy na jankesie są lepsze niż kwantyle. – hadley