Разделение на классы: jenks vs kmeans

Я хочу разбить вектор (длиной около 10 ^ 5) на пять классов. С помощью функции classInterval из пакета classInt я хотел использовать естественные разрывы style = "jenks" , но это занимает непомерно много времени даже для гораздо меньшего вектора. всего 500. Установка style = "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

Что делает алгоритм Дженкса таким медленным и есть ли более быстрый способ его запустить?

При необходимости я перенесу последние две части вопроса на stats.stackexchange.com:

  • При каких обстоятельствах k означает разумную замену Дженксу?
  • Разумно ли определять классы, выполняя classInt на случайном 1% подмножестве точек данных?
11
задан J. Win. 14 March 2011 в 20:59
поделиться