Kmeans: Quick-TRANSer阶段步骤超过最大限制。

46

我正在使用标准的stats包在具有636,688行和7列的数据集上运行R中的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查看代码,但我不确定出了什么问题。我认为我的问题与数据集的大小有关,但如果有人能明确说明我可以采取什么措施来缓解这个问题,我将不胜感激。


3
我认为这更可能与中心点的数量有关。真的吗?100个聚类中心?你试过使用不同的算法吗,例如:kmeans(dataset, algorithm="Lloyd", ...)?那个错误信息似乎是特定于默认算法Hartigan-Wong的。 - jlhoward
@jlhoward - 谢谢!我尝试了Lloyd算法,没有出现错误,但我真的更喜欢使用Hartigan-Wong算法。 - Anna Dunietz
请注意,实际的错误标志来自此处:http://svn.r-project.org/R/trunk/src/library/stats/src/kmns.f(搜索“IFAULT = 4”)。但仍然不真正解释它的含义。 - naught101
4个回答

36

我刚遇到了同样的问题。

通过?kmeans查看R中的kmeans文档:

Hartigan-Wong算法通常比那两个更好,但是尝试多次随机起点('nstart'>1)通常是建议的。在极少数情况下,当某些点('x'的行)非常接近时, 算法可能无法在“快速传输”阶段收敛,发出警告(并返回“ifault = 4”)。在这种情况下,可能需要对数据进行轻微舍入。

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

R的一个讨厌的问题在于它继续发出可能被忽视的警告。针对我的基准测试目的,我认为这是一次失败的运行,因此我使用:

if (kms$ifault==4) { stop("Failed in Quick-Transfer"); }

根据您的使用情况,您可能想要像这样做

if (kms$ifault==4) { kms = kmeans(X, kms$centers, algorithm="MacQueen"); }

相反,可以使用不同的算法继续。

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


2
当警告被抛出时,这里返回的是 res$ifault=0 而不是 res$ifault=4 - robertspierre

14

5
"@jlhoward的评论: 请尝试"
kmeans(dataset, algorithm="Lloyd", ..)

1
我收到了相同的错误信息,但在我的情况下,增加迭代次数iter.max有所帮助。这与内存超载的理论相矛盾。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接