分为几类:jenks vs k意味着

时间:2011-03-14 20:24:56

标签: r intervals

我想将一个矢量(长度约为10 ^ 5)分成五个类。使用包classIntervals中的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

是什么让Jenks算法变得如此缓慢,是否有更快的方式来运行它?

如果需要,我会将问题的最后两部分移到stats.stackexchange.com:

  • 在什么情况下,kmeans是詹克斯的合理替代品?
  • 通过在数据点的随机1%子集上运行classInt来定义类是否合理?

2 个答案:

答案 0 :(得分:6)

回答你原来的问题:

  

是什么让Jenks算法如此缓慢,并且有更快的方法   跑吧?

实际上,同时有一种更快的方法来应用Jenks算法,即setjenksBreaks包中的BAMMtools函数。

但是,请注意,您必须以不同方式设置中断次数,即如果您在classIntervals包的classInt函数中将中断设置为5,则必须将中断设置为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   

答案 1 :(得分:0)

来自?BAMMtools::getJenksBreaks

  

Jenks的自然中断方法是从classInt R包中的代码移植到C的。

这两个程序是相同的;由于其实现(C与R),一个比另一个要快。