kmeans:快速转换阶段步骤超出最大值

Ann*_*etz 31 r cluster-analysis k-means

我在R中使用标准stats包在636,688行和7列的数据集上运行k-means聚类:kmeans(dataset, centers = 100, nstart = 25, iter.max = 20).

我收到以下错误:Quick-TRANSfer stage steps exceeded maximum (= 31834400),虽然人们可以在查看代码http://svn.r-project.org/R/trunk/src/library/stats/R/kmeans.R -我不确定的是什么出错了.我认为我的问题与我的数据集的大小有关,但如果有人能够一劳永逸地澄清我可以采取哪些措施来缓解这个问题,我将不胜感激.

Eri*_*ert 21

我刚才有同样的问题.

请参阅R中的kmeans文档?kmeans:

Hartigan-Wong算法通常比其中任何一种算法都要好,但通常建议尝试几次随机启动('nstart'> 1). 在极少数情况下,当某些点('x'行)非常接近时,算法可能无法收敛到"快速转移"阶段,发出警告信号(并返回'ifault = 4').在这种情况下,建议稍微舍入数据.

在这些情况下,您可能需要切换到Lloyd或MacQueen算法.

关于R的令人讨厌的事情是,它继续发出警告,可能会被忽视.对于我的基准测试目的,我认为这是一个失败的运行,因此我使用:

if (kms$ifault==4) { stop("Failed in Quick-Transfer"); }
Run Code Online (Sandbox Code Playgroud)

根据您的使用情况,您可能想要做类似的事情

if (kms$ifault==4) { kms = kmeans(X, kms$centers, algorithm="MacQueen"); }
Run Code Online (Sandbox Code Playgroud)

相反,继续使用不同的算法.

如果您正在对K-means进行基准测试,请注意R iter.max=10默认使用.收敛可能需要10多次迭代.

  • 当抛出警告时,这里返回 `res$ifault=0`,而不是 `res$ifault=4` (2认同)

小智 11

有同样的问题,似乎与可用内存有关.

在函数为我工作之前运行垃圾收集:

gc()
Run Code Online (Sandbox Code Playgroud)

或参考:

增加(或减少)R进程可用的内存


dfr*_*kow 5

@jlhoward 的评论:

尝试

kmeans(dataset, algorithm="Lloyd", ..)
Run Code Online (Sandbox Code Playgroud)