2011-03-14 34 views
11

我想将一个向量(长度大约10^5)分成五个类。使用来自包classInt的函数classIntervals我想使用style = "jenks"自然休息时间,但即使对于只有500的小得多的向量,这也需要过多的时间。设置style = "kmeans"几乎是瞬间执行的。分成类: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 

是什么让詹克斯算法很慢,并且有运行它更快的方法?

如果需要的话我可以撬动问题的最后两个部分stats.stackexchange.com:

  • 在什么情况下是k均值为詹克斯一个合理的替代品?
  • 通过在数据点的随机1%子集上运行classInt来定义类是否合理?
+2

做阅读功能的帮助。 'kmeans'使用一组随机样本作为初始聚类中心。为了得到可重复的结果,通过'set.seed()'设置一个种子并阅读k-means和局部与全局最小值。这在'classIntervals'中提到。 – 2011-03-14 21:00:07

+0

谢谢加文。我在发布和编辑问题后不久发现了这部分内容。 – 2011-03-14 21:13:51

+0

我不认为有很多证据表明詹克的分数比分位数要好。 – hadley 2011-03-15 01:46:04

回答

6

要回答你原来的问题:

是什么让詹克斯算法这么慢,而且是那里 来看,它更快的方法?

事实上,与此同时,在BAMMtools软件包中应用Jenks算法setjenksBreaks函数有更快的方法。

但是,要知道,你必须设置断点的数量不同,也就是说,如果你设置的休息,以5在classInt包的的classIntervals功能,你必须休息时间设置为6 setjenksBreaks功能在BAMMtools包来获得相同的结果。

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

的加快是巨大的,即

> 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