【发布时间】:2019-05-10 15:40:08
【问题描述】:
我想将一个向量(长度约为 10^5)划分为五个类。使用 classInt 包中的 classIntervals 函数,我想使用 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 是 Jenks 的合理替代品?
- 通过在数据点的随机 1% 子集上运行 classInt 来定义类是否合理?
【问题讨论】:
-
请阅读函数帮助。
kmeans使用一组随机样本作为初始聚类中心。要获得可重现的结果,请通过set.seed()设置种子并阅读有关 k-means 和局部与全局最小值的信息。?classIntervals中提到了这一点。 -
谢谢加文。我在发布并编辑问题后不久就找到了该部分。
-
@hadley:这很难相信。想象一下,您的数据代表 10 名成人和 90 名儿童的身高。应该清楚的是,一个好的聚类算法不仅仅是将它们塞进相同大小的分位数中。
-
好的,但是你得到的数据具有非常清晰的集群是很不寻常的。你真的认为你的 100,000 个点很好地聚集成 5 个簇吗?!如果是这样,我希望我可以使用像您这样的数据。
-
我不知道有 5 个集群,但在某些情况下您肯定会期望两个集群。将部分页面的灰度图像转换为仅用于光学字符识别的黑白图像是一个很好的示例,其中分位数会非常错误,但需要两个明确的簇。