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

时间:2017-12-06 23:18:10

标签: r error-handling warnings k-means

我正在寻找一个处理警告消息的解决方案,来自Kmeans包的amap功能。警告消息如下:

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)

如果你在终端上运行它,它可能会向你发送我正在谈论的警告信息。

注意: 我解决此问题的想法是捕获警告的信号,然后执行解决方案。但是,我不知道我怎么可能这样做

1 个答案:

答案 0 :(得分:1)

?options开始(向下滚动很长的路查找warn ...):

  

设置警告消息的处理。如果警告是否定的全部   警告被忽略。如果warn为零(默认值)警告   存储直到顶级函数返回。如果10或更少的警告   发出信号说明他们将被打印,否则会有一条消息说明如何   许多人都发出了信号。创建了一个名为last.warning的对象,可以   通过功能警告打印。如果警告是一个,警告是   在它们出现时打印。如果警告是两个或更大,则所有警告都是   变成了错误。

因此,使用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"

那么您可以在class(attempt)语句中检查if(首选方法是检查inherits(attempt,"try-error"))并相应地填写内容。