我想将一个矢量(长度约为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
Run Code Online (Sandbox Code Playgroud)
是什么让Jenks算法如此缓慢,是否有更快的方式来运行它?
如果需要,我会将问题的最后两部分移到stats.stackexchange.com:
回答你原来的问题:
是什么让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)
Run Code Online (Sandbox Code Playgroud)
加速很快,即
> 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
Run Code Online (Sandbox Code Playgroud)