如何处理K-means函数中的“空簇”警告?

3
我正在寻找一种解决方法,用于处理amap包中的Kmeans函数产生的警告信息。该警告信息如下:empty cluster: try a better set of initial centers
能否有任何方式让我知道何时会出现此错误消息,并处理此问题?例如:运行算法直到返回值没有空簇。
对我来说,创建一个漂亮的可重现示例相当困难。但是,我提供了这个丑陋但功能性的示例:
library(amap)

numberK = 20
ts.len = 7

time.series <- rep(sample(1:8000, numberK, replace = TRUE),ts.len)
time.series <- rep(rbind(time.series, time.series), 30)
time.series <- matrix(time.series, ncol = ts.len)

centers <- matrix( sample(1:3000, numberK*ts.len), ncol = ts.len)

Kmeans((time.series), centers = centers, iter.max = 99)

如果您在终端上运行此命令,可能会收到我所说的警告消息。

注意:我解决这个问题的想法是捕获警告信号,然后执行解决方案。但是,我不知道如何做到这一点。


一个选项:options(warn = 2); tryCatch(expr = {Kmeans((time.series), centers = centers, iter.max = 99)},error = function(e) "Caught error") - joran
或者使用默认选项:tryCatch(expr = {Kmeans((time.series), centers = centers, iter.max = 99)},warning = function(e) "捕获到警告") - joran
...或者将警告视为错误,attempt <- try(expr = {Kmeans((time.series), centers = centers, iter.max = 99)},silent = TRUE),然后检查attempt的类别,并根据情况进行分支。 - joran
我必须说,我非常喜欢最后一个建议。非常感谢。这个话题已经关闭。请随意回答它。 - Gilgamesh
1个回答

2

?options(向下滚动很长一段时间以找到 warn...):

设置警告消息的处理方式。如果 warn 是负数,则忽略所有警告。如果 warn 是零(默认值),则将警告存储,直到顶层函数返回。如果发出了10个或更少的警告,则会打印它们,否则会显示有多少个警告。创建一个名为 last.warning 的对象,并可通过函数 warnings 打印。如果 warn 为1,则在发生警告时打印警告。如果 warn 大于等于2,则所有警告都将转换为错误。

因此,使用 tryCatch,您可以指定一个 warning 处理程序函数来在捕获警告时执行操作:

> tryCatch(expr = {Kmeans((time.series), centers = centers, iter.max = 99)},
         warning = function(e) "Caught warning")
[1] "Caught warning"

或者您可以通过以下方式将所有警告升级为错误:

options(warn = 2)

如文档所述。然后,
> tryCatch(expr = {Kmeans((time.series), centers = centers, iter.max = 99)},
           error = function(e) "Caught error")
[1] "Caught error"

虽然许多人似乎更喜欢tryCatch,但我经常喜欢try的明确性,如果我想在运行表达式后执行某种if ... else块,它感觉对我来说更容易:

options(warn = 2)
attempt <- try(expr = {Kmeans((time.series), centers = centers, iter.max = 99)},silent = TRUE)
> class(attempt)
[1] "try-error"

那么您可以在if语句中检查class(attempt)(首选方法是检查inherits(attempt,"try-error")),并根据情况进行操作。


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