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?
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'. –
Grazie Gavin. Ho trovato quella parte subito dopo aver postato e modificato la domanda. –
Non credo ci siano molte prove che suggeriscano che le interruzioni di jenk siano meglio dei quantili. – hadley